SystemVerilog LRM 学习笔记 — clocking块
1 clocking…endclocking块
clocking块是SV新feature,主要是为了更好解决testbench和DUT之间的timing和同步建模的问题,可以使user基于clock cycle在更高的抽象层次上写testbench(如“## 3”,表示三个clock)。clocking只能在module/interface/checker/program中声明,不能在function/task/package中。clocking块是声明和例化一体的(类似always块没有例化语句)。clocking块是对所在的module/interface/checker/program里的信号的采样或驱动的timing属性进行声明,也可以通过hierarchy引用的方式作用于其他模块的信号。
同一个module/interface/checker/program中声明多个clocking块,同一个信号也可以出现在不同的clocking块中。
2 clocking shew的含义
Default的clocking shew作用在所有未明确声明的信号。对于声明为input的信号,clocking skew是指最clock event来之前多少事件对其进行取样。对于output信号,则是指clock event发生后多少事件对其进行驱动。注意,clocking块里声明的inout类型相当于对具有相同名字的input和output的两个信号同时进行声明的简略写法,和port声明里的inout意义不同。
SV中的时间单位step等于全局时间精度,如果未指明,则default input shew是1step,default output shew是0. 1step input shew是指对输入信号在clock event到来前的postponed域进行取样(参看SV Scheduler仿真调度)。
input #0 shew:输入信号会在clocking event发生的时刻取样,具体是在observed region取样。
output #0 shew:输出信号会在clocking event发生的时刻驱动,具体是在Re-NBA regin驱动。
default input/output shew: 一般会在clocking块的开始指明default shew, 如
default input #10ns output #2ns;
default shew会作用于clocking块中所有未明确定义shew的 input/output 信号。如未明确指定default shew,则系统默认的input shew是1 step,output shew 是0.
3. 示例代码
4. clocking event
@(bus); //等同于@(posedge clock1);
5. clock cycle延时 ‘##’
双#号操作符可以指定多少cycle的延时,目的是为了verif方便,在rtl中的赋值语句使用是违法的。
##5; // wait 5 cycles (clocking events) using the default clocking
##(j + 1); // wait j+1 cycles (clocking events) using the default clocking
6. default clocking
在给定的module/interface/program/checker中,可以指定一个default clocking(只能有一个!),使所有的cycle dalay操作都基于该clocking。
7. global clocking
可以指定一个clocking块为全局时钟块,作用于当前hierarchy下的所有模块。其目的是为了指定用于formal verif的系统时钟。可以在一个系统中的不同位置存着着多个global clocking 声明,仿真器依据一定的规则查找对具体模块起作用的global clocking块。