我正在尝试做这样的事情:
RL
这里assert property (@(posedge clk) disable iff (!rst) a[*c] -> $rose(b))
不是'常量',而是来自寄存器的某些位的值。例如:c
只写一次。检查是为了查看reg[4:0]
是否仅在a为“c”个循环数时为高。
但是,SVA不接受这样的变量:b
。任何想法??
答案 0 :(得分:2)
引入局部变量ctr
。在每个posedge中都会创建一个带有ctr
新实例的新断言。设置ctr
等于reg1
中的值。在整个向下计数中检查a
是否为真。只要计数器大于零,就减少计数器。 (ctr>0, ctr--)[*0:$]
语句将倒计时,直到ctr == 0
为真。
您可能希望将(ctr>0, ctr--)[*0:$]
更改为(ctr>0, ctr--)[*1:$]
,具体取决于reg == 0
时您期望的结果。
property pr_aRegTimes;
integer ctr;
disable iff (!rst)
@(posedge clk)
(1, ctr = reg1) ##0 a throughout ((ctr>0, ctr--)[*0:$] ##1 (ctr == 0)) |-> $rose(b);
endproperty
as_aRegTimes: assert property (pr_aRegTimes)
else $error("aRegTimes failed");
工作示例: http://www.edaplayground.com/x/Xh9
来源:
https://www.doulos.com/knowhow/sysverilog/tutorial/assertions/ http://www.win.tue.nl/~jschmalt/teaching/2IMF20/SvaFvTutorialHVC2013.pdf
答案 1 :(得分:0)
property pr_aRegTimes;
integer ctr;
disable iff (!rst)
@(posedge clk)
($rose(a), ctr = reg1) ##0 (a&&ctr>0,ctr--)[*] |-> $rose(b);
endproperty