SV中的clocking时钟块

采样时发生竞争(delta cycle的存在),会导致采样数据错误。为了避免在RTL仿真中发生信号竞争的问题,建议通过非阻塞赋值或者特定的信号延迟来解决同步问题。这里我们介绍使用clocking时钟块来决定信号的驱动和采样的方式。

delta cycle的存在问题

在RTL仿真时,由于无法确定具体电路的延迟时间,默认情况下时钟驱动电路时会添加一个**无限最小的时间(delta cycle)**的延迟,这个延迟要比最小时间单位精度还要小(可以理解成远小于1ps)。
由于各种可能性,clk与被采样数据之间如果只存在若干个delta-cycle的延迟,那么采样就会出问题。

采用clocking时钟块

clocking块基于时钟周期对信号进行驱动或者采样的方式,可以使testbench准确及时地对信号驱动或采样,消除信号竞争的问题。

clocking bus@(posedge clk);
    default input #2ns output #2ns //在clk上升沿的前2ns对其进行输入采样,在事件的后2ns进行输出驱动
endclocking

一般在接口中定义clocking块,如下:

interface chnl_intf(input clk, input rstn);
  logic [31:0] ch_data; 
  logic        ch_valid;
  logic        ch_ready;
  logic [ 5:0] ch_margin;
  // 定义时钟块
  clocking drv_ck @(posedge clk);
  	//采样时间
    default input #1ns output #1ns;
    //声明变量方向
    output ch_data, ch_valid;
    input ch_ready, ch_margin;
  endclocking
endinterface


你可能感兴趣的:(fpga开发)