如何在每个时钟周期断言 属性 为假?
How to assert a property is false at every clock cycle?
有没有办法在每个时钟周期断言已声明的 属性 是否为假?
例如,
仅当 req[idx]
和 enable[idx]
都为高时,status[idx]
才应为高。
我想要的是针对上述情况的负面情景检查器。即,当 req
或 enable
处于低位时,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_a
和 seq_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
有没有办法在每个时钟周期断言已声明的 属性 是否为假?
例如,
仅当req[idx]
和 enable[idx]
都为高时,status[idx]
才应为高。
我想要的是针对上述情况的负面情景检查器。即,当 req
或 enable
处于低位时,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_a
和 seq_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