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 skew的含义
Default的clocking skew作用在所有未明确声明的信号。对于声明为input的信号,clocking skew是指最clock event来之前多少事件对其进行取样。对于output信号,则是指clock event发生后多少事件对其进行驱动。注意,clocking块里声明的inout类型相当于对具有相同名字的input和output的两个信号同时进行声明的简略写法,和port声明里的inout意义不同。
SV中的时间单位step等于全局时间精度,如果未指明,则default input skew是1step,default output skew是0. 1step input skew是指对输入信号在clock event到来前的postponed域进行取样(参看SV Scheduler仿真调度)。
input #0 skew:输入信号会在clocking event发生的时刻取样,具体是在observed region取样。
output #0 skew:输出信号会在clocking event发生的时刻驱动,具体是在Re-NBA regin驱动。
default input/output skew: 一般会在clocking块的开始指明default skew, 如
default input #10ns output #2ns;
default skew会作用于clocking块中所有未明确定义skew的 input/output 信号。如未明确指定default skew,则系统默认的input skew是1 step,output skew 是0.
3. 示例代码
clocking ck1 @(posedge clk);
default input #1step output negedge; // legal
// outputs driven on the negedge clk
input ... ;
output ... ;
endclocking
clocking ck2 @(clk); // no edge specified!
default input #1step output negedge; // legal
input ... ;
output ... ;
endclocking
clocking bus @(posedge clock1);
default input #10ns output #2ns;
input data, ready, enable = top.mem1.enable;
output negedge ack;
input #1step addr;
endclockin
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。
Example 1: Declaring a clocking as the default:
program test(input logic clk, input logic [15:0] data);
default clocking bus @(posedge clk);
inout data;
endclocking
initial begin
## 5;
if (bus.data == 10)
## 1;
else
...
end
endprogram
Example 2: Assigning an existing clocking to be the default:
module processor ...
clocking busA @(posedge clk1); ... endclocking
clocking busB @(negedge clk2); ... endclocking
module cpu( interface y );
default clocking busA ;
initial begin
## 5; // use busA => (posedge clk1)
...
end
endmodule
endmodule
7. global clocking
可以指定一个clocking块为全局时钟块,作用于当前hierarchy下的所有模块。其目的是为了指定用于formal verif的系统时钟。可以在一个系统中的不同位置存着着多个global clocking 声明,仿真器依据一定的规则查找对具体模块起作用的global clocking块。
本博客所有文章均同步发表于www.mx1980.cn/blog