system verilog assertions:在repition运算符中使用reg值

时间:2016-01-18 22:07:32

标签: system-verilog system-verilog-assertions

我正在尝试做这样的事情:

RL

这里assert property (@(posedge clk) disable iff (!rst) a[*c] -> $rose(b)) 不是'常量',而是来自寄存器的某些位的值。例如:c只写一次。检查是为了查看reg[4:0]是否仅在a为“c”个循环数时为高。

但是,SVA不接受这样的变量:b。任何想法??

2 个答案:

答案 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