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

  • 23
    点赞
  • 164
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值