2017-09-20 3 views
0

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 
+0

Was ist Ihre erwartete Verhalten? –

+0

@KaranShah Erwartetes Verhalten ist 'Enter bei 10' und 'PASS bei 10' sollte nicht gedruckt werden. –

+0

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. –

Antwort

0

Ich denke, dass es 2 Probleme gibt.

  1. Ich denke, dass es im Implikationsoperator ein Missverständnis gibt. Assertion sollte in Ihrem Fall nicht fehlschlagen. Die Implikation lässt zu, dass der Ausdruck auf der rechten Seite letztendlich wahr ist. Also, wenn a geht, wird es schließlich sinken. Also bei # 50 geht es nach dem Abtasten hoch bei # 30 nach unten, und dies bewirkt, dass die Behauptung durchgeht und zum nächsten Evaluierungszyklus geht: # 70 -> # 90.

Für jede erfolgreiche Spiel der vorgängigen sequence_expr, die daraus folgende property_expr isseparately ausgewertet. Der Endpunkt der Übereinstimmung des Antezedens sequence_expr ist der Startpunkt der Auswertung des nachfolgenden property_expr.

  1. Es gibt einen Fehler im Compiler, den Sie verwenden. Es sollte keine Zusicherungsnachricht zum Zeitpunkt # 10 geben. Ich habe es mit VCS 2017.03 versucht und es hat richtig funktioniert.

auch können Sie diese Zeile Sie Code hinzufügen, um einige Debug-Drucke zu erhalten:

always @(posedge clk) $display("%0t a = %b", $time, $sampled(a)); 

Ich habe diese Ergebnisse bei der Simulation:

10 a = 0 
30 a = 1 
50 a = 0 
Entered assert at 50 
PASS at   50 
70 a = 1 
90 a = 0 
Entered assert at 90 
PASS at   90 
+0

Also, was ist die Lösung, wenn ich "a" als "1" anstelle von "0" am ersten posegege probieren und die Behauptung bei '@ time10ns' auslösen lassen möchte? –

+0

Wenn ich meine Assertion in einen Clocking-Block gesetzt hätte, hätte mir die Standard-Eingabe # 0 geholfen, 'a' als 1 und nicht' 0' als '@ time10' zu nehmen? –

+0

Alle Werte für Assertions werden abgetastet, bevor der Simulationszyklus beginnt. Im Falle des "clk" -Profils wird also der gesampelte Wert oder "a" vor dem posedge stehen, wie im Zitat des ursprünglichen Posts beschrieben. Es verhält sich genau so, wie es dort beschrieben wurde und warnte vor Verwechslungen beim Debuggen. Also, es beantwortet Ihre ursprüngliche Frage. Also, was genau willst du erreichen? Sie müssen jedoch möglicherweise eine andere Frage stellen. – Serge

0

Warum Sie erwarten, dass Ihr Behauptung zu versagen? Sie haben Ihre Testbench angewiesen, a alle posedge im initial Block zu ändern, damit Ihre Assertion bestanden wird (Sie werden eine Sequenz von a, !a, a, !a haben), so erwarte ich 2 Assertion Pässe.

Was ich nicht verstehe, ist, dass die Behauptung @ Zeit 10 gemäß Ihrem Protokoll übergibt. Ihre ersten posedge ist @ time 10, so der abgetastete Wert von a ist 0 (weil Probenahme vor den posedge und Ihr Anfangswert von a getan wird, ist 0 zum initial Block Accroding). Dieser Wert von a würde die Assertion nicht auslösen (entspricht nicht dem Assertion-Vorgänger, d.h. der linken Seite der Assertion).

+0

Haha, Sie stellen genau die gleiche Frage, die ich gestellt habe. 'Was ich nicht verstehe, ist, dass die Behauptung @ Zeit 10 gemäß Ihrem Log übergeht.Auch erwarte ich keine Behauptung, immer zu versagen, wie ich es erwähnte, sollte bei @time 10, 50 und 90 FAIL. –

+0

habe ich nicht mach mich klar. Ich verstehe nicht, warum es "ausgelöst" wird. Assertion Trigger ist 'a'. Sie schrieb 'jedoch erwartete ich Behauptung zu FAIL zu Simulationszeiten # 10, # 50, # 90'. Ihre Assertion wird in diesem Testbench aufgrund des Retriggerns von 'a' in Ihrem anfänglichen Block niemals fehlschlagen. Also, das beantwortet deine Frage. In Bezug auf dieses seltsame Verhalten @ Zeit '10': liefern mehr Details - Strobe-Signale, Wellenform oder versuchen Sie einen anderen Simulator und vergleichen Sie Ergebnisse.Vielleicht angenommen VCS ein" 1 "am Anfang der Sim (Strobe und Check)? Grüße. – RaZ

+0

Wann wird die Assertion ausgelöst, wenn ihr Vorgänger übereinstimmt oder wenn ihre Konsequenz übereinstimmt? Welche Anfangsblöcke sollte ich zusammenführen? Ich erwartete, dass Assert bei etwa 10 ns versagt, weil bei 10 ns der Abtastwert von a immer noch 0 ist und nicht "1". Es löst also nicht den Vorgänger aus. –