系统verilog断言禁用条件
system verilog assertion disable condition
我有这个断言是为了检查时钟频率:
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) 事件 "registered" 即使断言被禁用(或者我遗漏了什么?)
没有disable_iff
关键字,是disable iff
(没有下划线)。属性可以有局部变量,但不能用 assert
内联定义局部变量。将 属性 定义和断言实例化分开。
时钟采样似乎不正确。 @(posedge fast_clk, clk_1MHz)
表示上升 fast_clk 或 clk_1MHz 的任何变化。 clk_1MHz是采样数据值,应该不是时钟。
$rose(clk_1MHz), cnt==fast_clk_freq
是非法语法,建议:$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 节。
我有这个断言是为了检查时钟频率:
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) 事件 "registered" 即使断言被禁用(或者我遗漏了什么?)
没有disable_iff
关键字,是disable iff
(没有下划线)。属性可以有局部变量,但不能用 assert
内联定义局部变量。将 属性 定义和断言实例化分开。
时钟采样似乎不正确。 @(posedge fast_clk, clk_1MHz)
表示上升 fast_clk 或 clk_1MHz 的任何变化。 clk_1MHz是采样数据值,应该不是时钟。
$rose(clk_1MHz), cnt==fast_clk_freq
是非法语法,建议:$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 节。