aus einem Buch "SystemVerilog Assertions und Functional Coverage", Ashok Mehta auf Seite 42, ZitiertUnexpected SVA Behauptung Verhalten für ein periodisches Signal
@ (posedge clk) a | => a!; In der obigen Sequenz, lassen Sie uns sagen, dass die Variable 'a' ändert sich auf '1' zur gleichen Zeit , dass die Abtastrand Clock posedge clk geht (und davon ausgehen, 'a' war '0', bevor es ging auf eine '1'). Wird es eine Übereinstimmung des Antezedens "a" geben? Nein! Da ein 'von' 0 'zu' 1 'zur gleichen Zeit ging, zu der die Uhr gestellt wurde, ist der Wert von' a ', der durch den Takt abgetastet wird,' 0 '(vorgesetzte Region) und nicht' 1 '. Dies führt nicht dazu, dass die Eigenschaft ausgelöst wird, da der Vorgänger nicht als wahr bewertet wird. Dies verwirrt Sie beim Debuggen . Sie würden erwarten, dass "1" abgetastet wird und die Eigenschaft ausgelöst wird davon. Sie erhalten jedoch genau das Gegenteil. Dies ist ein sehr wichtiger Punkt zu verstehen, weil in einer Simulation Wellenform (oder für die Angelegenheit mit Verilog $ Monitor oder $ Strobe) Sie eine '1' auf 'a' mit posedge clk sehen und würde nicht verstehen, warum die Eigenschaft nicht feuern oder warum es fehlgeschlagen (oder bestanden für diese Angelegenheit). Denken Sie immer daran, dass an der Abtastkante der "vorherige" Wert (d. H. Ein Delta vor der Abtastkante in der vorbereiteten Region) von die abgetastete Variable verwendet wird.
Ich habe versucht, dieses Szenario von dieser Testbench zu testen. Allerdings erwartete ich Behauptung bei Simulationszeiten FAIL # 10, # 50, # 90
module assert_immediate();
reg a,b,clk;
initial
begin
clk = 0;
forever #10 clk = !clk;
end
initial
begin
a = 0;
b = 0;
repeat (10) @(posedge clk) a = ~a;
end
// [email protected](posedge clk) $display("a = %d at time %t \n", a, $time);
property p1;
@(posedge clk) a |=> !a;
endproperty
initial #100 $finish;
assert property (p1) $display("Entered assert at %t \n", $time); else $display("FAIL at %t \n", $time);
cover property (p1) $display("PASS at %t \n", $time);
endmodule
Aber wenn ich auf EDAPlayground lief VCS, bekam ich ein anderes Verhalten
# KERNEL: Entered assert at 10
# KERNEL:
# KERNEL: PASS at 10
# KERNEL:
# KERNEL: Entered assert at 50
# KERNEL:
# KERNEL: Entered assert at 50
# KERNEL:
# KERNEL: PASS at 50
# KERNEL:
# KERNEL: PASS at 50
# KERNEL:
# KERNEL: Entered assert at 90
# KERNEL:
# KERNEL: Entered assert at 90
# KERNEL:
# KERNEL: PASS at 90
# KERNEL:
# KERNEL: PASS at 90
Was ist Ihre erwartete Verhalten? –
@KaranShah Erwartetes Verhalten ist 'Enter bei 10' und 'PASS bei 10' sollte nicht gedruckt werden. –
Ja. Einverstanden. Es scheint wie ein Tool-Bug, da der gleichzeitige Assertion-Abtastwert aus dem "vorbereiteten" Bereich und daher "@ 10" ist, sollte der Abtastwert von a "0" sein. –