在system verilog中,clocking block是一种简化时钟域信号同步和采样的机制。可以帮助验证工程师简化复杂时序问题,尤其是在测试平台中,既要对信号进行驱动,又要对信号进行采样。
clocking block块一般有以下应用场景:
(1)Driver:用于将激励信号驱动到DUT;
(2)Monitor:用于从DUT采样信号并传递给环境中的其他组件;
举例:
假设我们有一组APB接口,包含时钟pclk,复位信号presetn,输入信号(站在DUT的角度)psel、penable、pwrite、paddr、pwdata,输出信号(站在DUT的角度)prdata、pready、pslverr;
则可以定义如下的clocking_block来供driver和monitor使用;
interface apb_if (input bit pclk, input bit presetn);logic psel ;logic penable ;logic pwrite ;logic [31:0] paddr ;logic [31:0] pwdata ;logic pready ;logic [31:0] prdata ;logic pslverr ;// 定义用于 Driver 的 clocking blockclocking drv_cb @(posedge clk);default input #1step output #1;// 默认输入延迟1步,输出延迟1时间单位output psel ; // 驱动 psel (站在drv视角)output penable ; // 驱动 penable(站在drv视角)output pwrite ; // 驱动 pwrite (站在drv视角)output paddr ; // 驱动 paddr (站在drv视角)output pwdata ; // 驱动 pwdata (站在drv视角)input pready ; // 采样 pready (站在drv视角)input prdata ; // 采样 prdata (站在drv视角)input pslverr ; // 采样 pslverr (站在drv视角)endclocking// 定义用于 Monitor 的 clocking blockclocking mon_cb @(posedge clk);default input #1step;input psel ; // 采样 psel (站在mon视角)input penable ; // 采样 penable(站在mon视角)input pwrite ; // 采样 pwrite (站在mon视角)input paddr ; // 采样 paddr (站在mon视角)input pwdata ; // 采样 pwdata (站在mon视角)input pready ; // 采样 pready (站在mon视角)input prdata ; // 采样 prdata (站在mon视角)input pslverr ; // 采样 pslverr (站在mon视角)endclocking
endinterface
注意:
(1)实际应用clocking block时,我们往往会通过波形发现,对于采样信号,环境中使用的clocking_block块的值 = 时钟上升沿后的值,这是因为clocking_block块中的信号采用(阻塞赋值=)的方式,信号值的变化在active区域执行,因此从波形上观察,仿佛是时钟沿后的值有效一样,在下例中,pslverr为1的时刻是567ns,正是这一现象;
但如果查看的是接口的logic信号,而不是mon_cb内的信号,则无此困扰,如下:
因此建议,环境中引用mon_cb中的信号,但查看波形时,观察interface中的logic信号;