首页 > 解决方案 > 时钟块层次结构中的信号延迟与波形中的 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

标签: verilogsystem-verilogclockuvm

解决方案


让我们以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

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


推荐阅读