如何在每个时钟周期断言 属性 为假?

How to assert a property is false at every clock cycle?

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

例如,

仅当 req[idx]enable[idx] 都为高时,

status[idx] 才应为高。

我想要的是针对上述情况的负面情景检查器。即,当 reqenable 处于低位时,status 永远不会变高。

我在下面尝试过,但 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

Error-[PIWDOAACS] Incorrectly used 'disable iff'

Property instances with 'disable iff' are only allowed in "assert" "assume" and "cover" statements. Property p_RiseIntDischeck may not be instantiated in this context.

seq_aseq_b 已经声明并用于其他断言。 best/recommended 重用 这些序列并为上述案例创建负面场景检查器的方法是什么?

尝试将时钟和 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 将使 属性 在语句为假时计算为真。

我假设 disable iff 需要 属性 计时,尽管我不确定为什么。

您的负面 属性 可能如下所示:

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