问题描述
有一个测试平台环境,我正在进行一些测试,我注意到在波形中,如果我从 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
数据在时钟后稍微采样,因此它对更新的值进行采样。