Verilog 为什么下面的断言在开始时只命中一次,并且无法进入非活动状态并保持在完成状态?

Verilog 为什么下面的断言在开始时只命中一次,并且无法进入非活动状态并保持在完成状态?,verilog,system-verilog,verification,system-verilog-assertions,Verilog,System Verilog,Verification,System Verilog Assertions,下面是一个断言属性。当o_dc_mode=1时,则o_mod_c_c==rego_dc_c_c。从波形中可以看出,一旦ASK_MOD_DC_MODE_属性命中场景,它将保持“完成”状态,即使o_DC_MODE=0,也不会变为非活动状态 property ASK_MOD_DC_MODE; @(posedge OSC64MHZ) o_dc_mode |-> (o_mod_c_c == rego_dc_c_c); endproperty ASK_MOD_DC_MODE_PROPERTY:

下面是一个断言属性。当o_dc_mode=1时,则o_mod_c_c==rego_dc_c_c。从波形中可以看出,一旦ASK_MOD_DC_MODE_属性命中场景,它将保持“完成”状态,即使o_DC_MODE=0,也不会变为非活动状态

property ASK_MOD_DC_MODE; 
@(posedge OSC64MHZ) 
o_dc_mode |->  (o_mod_c_c == rego_dc_c_c);
endproperty

ASK_MOD_DC_MODE_PROPERTY: assert property (ASK_MOD_DC_MODE)
$info("Assertion ASK_MOD_DC_MODE passed");
else
$error("Assertion ASK_MOD_DC_MODE failed");

正如您所知,在并发断言中,模拟器有一个性能优化,在断言状态与前一个周期相同的周期上禁用对单个周期断言的评估

关于问题中的例子:

property ASK_MOD_DC_MODE; 
@(posedge OSC64MHZ)
o_dc_mode |-> ( (o_mod_a_c == rego_dc_a_c) &&  (o_mod_b_c == rego_dc_b_c) && (o_mod_c_c == rego_dc_c_c));
endproperty
ASK_MOD_DC_MODE_PROPERTY: assert property (ASK_MOD_DC_MODE)
$info("Assertion ASK_MOD_DC_MODE passed");
else
$error("Assertion ASK_MOD_DC_MODE failed");
在上面的断言中,一旦模拟器点击属性,它将更新finish_count=1(图1),并且永远不会更新状态(也是finish_count),除非出现故障。 使用编译选项“-abvevalnochange”可以关闭此优化。您可以在图2中看到效果