我有一个SV断言,它检查属性如下
propert my_property;
@(posedge clk) disable iff(reset) $rose(halt) ##0 ((rx_prio) > (expec_prio)) ##[0:$] $rose(rdy) |-> ##[1:100] (my_prio[rx_prio]==1'b1);
endproperty:my_property
我的断言如下:
MY_PROPERTY_CHECK:assert property (my_propert)
else
$error;
这里的情况是,前提是真的,并且在1&之间检查结果。 100个时钟周期。在先行之后,由于时钟门控一段时间,时钟停止,然后时钟再次开始滴答。信号 my_prio [rx_prio] 在时钟门控后置位,但在100个时钟周期内再次置位。但我仍然认为断言失败了。
无法找出失败的问题。断言检查之间的时钟门控是否存在问题?或任何其他原因失败? 感谢。
答案 0 :(得分:2)
可能会有很多线程开始。尝试使用下面显示语句的局部变量。请参阅IEEE Std 1800-2012§16.10局部变量
propert my_property;
static int prop_cnt=0; // shared
local int prop_id; // Note: some require the "local", other need it omitted
@(posedge clk) disable iff(reset)
($rose(halt) ##0 ((rx_prio) > (expec_prio)),
prop_id=prop_cnt++,
$display("Spawn prop_id:%0d prop_cnt:%0d @ %0t %m",
prop_id,prop_cnt,$time) )
##[0:$] ($rose(rdy),
$display("Trigger prop_id:%0d prop_cnt:%0d @ %0t %m",
prop_id,prop_cnt,$time) )
|-> ##[1:100] (my_prio[rx_prio]==1'b1,
$display("Pass prop_id:%0d prop_cnt:%0d @ %0t %m",
prop_id,prop_cnt,$time) );
endproperty : my_property
如果您看到Spawn-Spawn-Trigger或Spawn-Trigger-Trigger,我们的任何东西都超出预期(即Spawn-Triger-Pass),那么就会出现意外的线程。
如果是这种情况,那么请查看IEEE Std 1800-2012§16.9.8 First_match操作
first_match(
$rose(halt) ##0 ((rx_prio) > (expec_prio)) ##[0:$] $rose(rdy),
$display("Spawn-Trigger prop_id:%0d prop_cnt:%0d @ %0t %m",
prop_id,prop_cnt,$time)
) |-> // ...
OR §16.9.10序列包含在另一个序列中
(
( $rose(halt) ##0 ((rx_prio) > (expec_prio)) ) within $rose(rdy)[->1],
$display("Spawn-Trigger prop_id:%0d prop_cnt:%0d @ %0t %m",
prop_id,prop_cnt,$time)
) |-> // ...
您可能想为触发器创建sequence
。
答案 1 :(得分:0)
由于我不知道您的设置,我可以假设您可能在未被门控的层次结构上的时钟上触发,但是您在时钟被门控的确切层次结构中调试波。
如果您正在编写无法使用断言进行改装的RTL块的断言(它是VHDL / Verilog或者您不允许触摸该文件),请使用bind在该块内实例化断言:http://www.asic-world.com/systemverilog/assertions22.html