1

我有这个断言是为了检查 clk 频率:

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) 事件

4

1 回答 1

1

没有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 节。

于 2015-06-22T17:38:27.907 回答