如何在每个时钟周期断言属性是错误的?

时间:2016-10-17 06:45:56

标签: system-verilog system-verilog-assertions

有没有办法在每个时钟周期断言已经声明的属性是否为假?

例如,

仅当status[idx]req[idx]都很高时,

enable[idx]应该很高。

我想要的是上面的负面情景检查。即statusreq为低时,enable永远不会变高。

我在下面试过,但是vcs给了我以下编译错误

sequence seq_a (int idx);
  !(req[idx] & enable[idx])
endsequence

sequence seq_b (int idx)
  status[idx] == 1
endsequence

property ppty_ab (int idx)
  disable iff (f_req[idx] & f_enable[idx])
  seq_a(idx) |=> seq_b(idx)
endproperty

generate
  for (idx=0; idx<5; idx++) begin
    a_ab : assert property (@(posedge clk) (not ppty_ab(idx)))
           else $display("ppty_ab [%0d] failed at %t",idx,$time)
  end
endgenerate
  

错误 - [PIWDOAACS]错误地使用&#39;禁用iff&#39;

     

使用&#39;禁用iff&#39;的属性实例只允许在#34;断言&#34; &#34;承担&#34;并且&#34;覆盖&#34;声明。属性p_RiseIntDischeck可能无法在此上下文中实例化。

seq_aseq_b已经被声明并用于其他一些断言。 重用这些序列的最佳/推荐方法是什么,并针对上述情况创建否定方案检查器?

2 个答案:

答案 0 :(得分:0)

尝试将时钟和not放入属性本身。

那是:

property ppty_ab (int idx)
  @(posedge clk)
  disable iff (f_req[idx] && f_enable[idx])
  not seq_a(idx) ##1 seq_b(idx)
endproperty

generate
  for (idx=0; idx<5; idx++) begin
    a_ab : assert property (ppty_ab(idx))
           else $display("ppty_ab [%0d] failed at %t",idx,$time)
  end
endgenerate

not seq_a(idx) ##1 seq_b(idx)!seq_a(idx) |=> seq_b(idx)不同,但not会在语句为false时将属性评估为true。

我假设disable iff要求财产有时钟,但我不确定原因。

答案 1 :(得分:0)

您的负面财产可能如下所示:

property ppty_ab (int idx);
  @ (posedge clk)
  disable iff (f_req[idx] & f_enable[idx])
  !req[idx] | !enable[idx] |=> !status[idx];
endproperty

genvar idx;
generate
  for (idx=0; idx<5; idx++) begin
    a_ab : assert property (ppty_ab(idx))
      else $display("ppty_ab [%0d] failed at %t",idx,$time);
  end
endgenerate