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. 示例代码

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块。

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注