时钟块层次中的信号延迟 w.r.t 波形中的 RTL 层次

问题描述

一个测试平台环境,我正在进行一些测试,我注意到在波形中,如果我从 rtl 层次结构中拉出输入到 rtl 的特定信号并从驱动程序时钟块中拉出相同的信号,我看到与驱动时钟块层次中的相同信号相比,rtl 层次中的信号延迟了一个时钟,而如果我在 rtl 层次中从 rtl 输出的波形中拉出一个信号,并且在监视器时钟块层次中输出相同的信号,我看到监视器时钟块级别的相同信号延迟了一个周期。

监视器时钟块级别的信号是否总是延迟,驱动器时钟块级别的信号是否总是比 rtl 层次结构中看到的信号早一个时钟?

界面原型是这样的:

          interface my_if(input bit clk,bit reset);
             bit valid;
             bit [31:0] data;
             bit [2:0]  crdt; 

 
              clocking monitor_cb @(posedge clk); 
              default input #1 output #1; 
              input valid; 
              input data;
              input crdt;
              endclocking 

              clocking tx_driver_cb @(posedge clk); 
              default input #1 output #1; 
              output valid; 
              output data;
              input crdt;
              endclocking 

              clocking rx_driver_cb @(posedge clk); 
              default input #1 output #1; 
              input valid; 
              input data;
              output crdt;
              endclocking 
   
           modport tx_driver (clocking tx_driverv_cb);
           modport rx_driver (clocking rx_driver_cb);   
           modport monitor (clocking monitor_cb);

         endinterface

解决方法

我们以monitor_cb.data为例,输入大小写

输入将被延迟 #1 将在 clk 的上升沿被采样。

// (pseudo code)
logic [31:0] skew_data;
assign #10 skew_data = my_if.data;
always @(posedge clk) begin
  monitor_cb.data <= skew_data;
end

如果您的信号在时钟的上升沿发生变化,sampled_data 将保持更新前的值。

现在输出延迟的是采样时刻而不是信号

always @(posedge clk) begin
  #1;
  tx_driver_cb.data <= data;
end

数据在时钟后稍微采样,因此它对更新的值进行采样。