如何解决了解“断言”的工作原理
在尝试验证触发器是否在上升沿对输入值进行采样时,我遇到了 Systemverilog 'assert' 令人费解的行为。如果我在上升沿后添加一个任意小的延迟,则断言似乎会通过,但不是正确的。但是,如果我添加一个在上升沿时间打印输出值的“始终”块,它将显示正确的值。顺便说一句,“如果”比较的行为类似于“断言”。我使用 Modelsim 作为我的模拟器。下面是我的带有内联注释的代码来说明问题。另请查看链接中的图片以获得进一步说明。
谢谢。
`timescale 1ns/1ns
module example_t(input logic clk,input logic resetb,input logic selector,output logic result);
always_ff @ (posedge clk or ~resetb)
if(~resetb)
result <= 0;
else
result <= selector ? 1'b1 : 1'b0;
endmodule
module tst();
logic clk;
logic resetb;
logic selector;
logic result;
example_t example(.clk(clk),.resetb(resetb),.selector(selector),.result(result));
//Simulate a clock
always
#10 clk = ~clk;
initial
begin
clk = 0;
resetb = 0; //Reset
selector = 0;
#20
@(posedge clk);
resetb = 1;
#20
@(posedge clk);
selector = 1;
#20 //**At this time we are at 70ns**
@(posedge clk); //**We are already at the posedge,but adding just in case**
assert(result == 1'b1); //**This will fail,meaning result[enter image description here][1]==0 at 70ns**
end
always @ (result)
begin
$display("result=%h time=%t",result,$realtime); //**This will print the value at 70ns as 1**
end
endmodule
解决方法
您在代码中有几个问题。
-
问题在于
selector
(以及resetb
)上的比赛。您可以在使用信号的同一仿真周期中通过阻塞分配来修改信号。根据模拟器或模拟条件,更新可以在使用之前或之后发生。因此,synopsys 和 cadence 在时间 50 时已准备好结果,使断言愉快。另一方面,导师 aldera 仅在 70 时才准备好结果,此时会导致断言失败。您可以避免此问题并使用 nbas 并使每个编译器在 70 时准备好结果。 -
有一个稍微不同的种族来源,它涉及初始块中的即时断言。在非阻塞赋值之前,其中的条件表达式将作为活动区域中程序块流的一部分执行。它仍然看到 result 的旧值并被评估为 false。
解决方法是在posedge之前设置'selector'和resetb
方式。下面的内容会让大家开心。结果将在 50 时准备好,在 70 时断言也会很高兴。
initial
begin
clk = 0;
resetb = 0; //Reset
selector = 0;
#15
resetb = 1; // set it before the next posedge
@(posedge clk); // wait for posedge
#10
selector = 1; // set it before the next edge
#20 //**At this time we are at 70ns**
@(posedge clk); //**We are already at the posedge,but adding just in case**
assert(result == 1'b1) $info("Assertion is ok at %0t",$realtime); //**This will fail,meaning result[enter image description here][1]==0 at 70ns**
#20 $finish;
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。