考虑以下SV代码片段:
module clocks();
logic a ;
bit clk =0;
initial begin
forever #1ns clk = ~clk ;
end
clocking cb@(posedge clk);
default input #1step output negedge;
output a;
endclocking
initial begin
@(cb);
#100ps;
cb.a <= 1 ;
@(cb);
#100ps;
cb.a <= 0 ;
repeat(10) @(cb);
end
endmodule在时钟块事件之后,信号通过输出同步驱动器在100 an后发生变化。在使用两个EDA模拟器运行它时,我观察到了不同的行为。对于第一模拟器,时钟块输出在第二后边缘上的动作,信号在第二下降边缘上发生变化。你可以看到下面的图片。第一模拟器
另一方面,对于第二模拟器,时钟块输出作用于第一时钟,其效果可在第一下降时钟边缘上看到。你可以看到下面的图片。第二模拟器
另一方面,如果我使用比100 es延迟更小的延迟(Es10ps)来更改输出偏斜延迟,则第二个模拟器的行为为第一个模拟器(a信号在第二个偏置后发生变化,输出偏差为10 es)。
这两个模拟器中哪一个更符合IEEE1800-2017标准?在我看来,根据我对标准的理解,第一个模拟器更符合标准。
时间刻度设置为1fs,以避免与模拟器分辨率有关的任何问题。
发布于 2021-03-24 18:22:53
第二个模拟器(具有意外的嵌套行为)是VCS。我在Solvnet上找到了以下信息:
默认情况下,当倾斜是negedge/posedge时,VCS会在将倾斜指定为偏置/偏移时用倾斜覆盖时钟事件。但是,您可以使用-ntb_opts no_cb_edge_override选项来避免在输入、输出和inout中重写时钟事件。以下是此选项在不同时钟方向上的行为:·The : Value在指定的时钟倾斜延迟处采样,然后在时钟事件发生之前进行更新,而更新发生在时钟事件中。输出:在时钟事件之后,在指定的时钟倾斜延迟处更新输出。1
不知道为什么VCS会有这样的行为,但是在标记"-ntb_opts no_cb_edge_override“的情况下,模拟运行在Questa中。
https://stackoverflow.com/questions/66785799
复制相似问题