我有这个断言来检查clk freq:
assert property clk_freq;
int cnt;
@(posedge fast_clk, clk_1MHz) disable_iff(!enable_check)
($rose(clk_1MHz), cnt=0) |=> (!$rose(clk_1MHz),cnt++) [*0:$] ##1 $rose(clk_1MHz), cnt==fast_clk_freq;
endproperty
在断言disable_check之后, fast_clk开始在模拟期间(而不是从开始)切换。
问题是似乎断言忽略了disable_iff
问题:$ rose(clk_1Mhz)事件是“注册”的,即使断言已被禁用(或者我错过了其他内容?)
答案 0 :(得分:0)
没有disable_iff
个关键字,它是disable iff
(没有下划线)。属性可以有局部变量,但局部变量不能与assert
内联定义。分离属性定义和断言实例化。
时钟采样似乎不正确。 @(posedge fast_clk, clk_1MHz)
意味着上升fast_clk或clk_1MHz的任何变化。 clk_1MHz是采样数据值,因此它不应该是时钟。
$rose(clk_1MHz), cnt==fast_clk_freq
是非法语法,sugest:$rose(clk_1MHz) ##0 cnt==fast_clk_freq
建议的属性定义和断言实例化:
property p_clk_freq;
int cnt;
@(posedge fast_clk) disable iff(!enable_check)
($rose(clk_1MHz), cnt=0) |=> (!$rose(clk_1MHz),cnt++)[*0:$] ##1 $rose(clk_1MHz) ##0 cnt==fast_clk_freq;
endproperty
a_clk_freq : assert property(p_clk_freq);
有关断言的更多信息,请参阅IEEE Std 1800-2012的第16节。