2017-09-25 4 views
0

Ich versuche, einen ziemlich einfachen Handshake zwischen zwei Modulen zu verifizieren. Ein Modul ist auf einem langsamen Takt und löst "req" aus, das schnellere Modul sollte "ack" auf dem nächsten schnellen Takt erhöhen und es bis zum nächsten langsamen Takt posege halten. Das Endergebnis sieht wie folgt aus:e HVL (IEEE 1647): Expect-Ausdruck schlägt unerwartet fehl

req-ack wave diagram example

Dies ist, wie ich schrieb das erwarten:

expect expect_ack_when_req_go is 
     (@req_rise_e) => @ack_rise_e 
     else dut_error("ERROR: ack expected to be asserted when req rises!"); 

* beide @req_rise_e und @ack_rise_e sind auf langsamen Takt abgetastet.

Das Ausführen des Simulators ergibt den Fehler, da der erste Ausdruck erfolgreich zu sein scheint, der zweite jedoch nicht. Dies ist trotz der Tatsache, dass wenn ich Ereignisse auf die Welle verfolgt, ich sehe, dass beide Ereignisse zusammen auftreten (wie in der Welle gesehen: event_req, event_ack).

+0

Ich würde zuerst versuchen, eine Sampling Clock zum TE hinzufügen, dh 'erwarten ... (@req_rise_e => @ack_rise_e) @slow_clk;' – Thorsten

+0

Bereits versucht es, und es hat nicht gut ... Außerdem denke ich, dass es redundant ist, da beide Ereignisse bereits durch langsamen Takt abgetastet werden: 'Ereignis req_rise_e ist Anstieg (smp.port_req $) @slow_clk_e;' 'Ereignis ack_rise_e ist Anstieg (smp.port_ack $) @slow_clk_e;' –

+0

Ok, @ Thorsten es scheint, du hattest Recht! Es scheint, dass das Hinzufügen eines Abtasttakts für ** beide ** Signale zusammen etwas an der Art und Weise ändert, wie der Simulator den Prüfausdruck versteht. Ich habe es so geändert, wie Sie es vorgeschlagen haben, und es hat funktioniert ... Ich kann es aber nicht erklären ... Wenn Sie es verstehen können, sollten Sie es vielleicht als Lösung veröffentlichen? –

Antwort

3

Sie versuchen, eine überlappende Implikation zu erreichen, d. H. Beide Ereignisse treten im selben Zyklus auf. Was der =>-Operator tut, ist zu überprüfen, dass die Konsequenz beim nächsten Sampling-Ereignis passiert, in diesem Fall die nächste langsame Taktflanke. Dies wird als nicht überlappende Implikation in SystemVerilog Assertionssprache bezeichnet.

expect expect_ack_when_req_go is 
    (@req_rise_e) => detach({@ack_rise_e; ~[1]}) 
    else dut_error("ERROR: ack expected to be asserted when req rises!"); 

Vollständige Erklärung here:

Sie können Ihr gewünschtes Verhalten, indem er die folgenden bekommen.

Zu einer methodologischen Anmerkung würde ich empfehlen, den zeitlichen Ausdruck anders zu schreiben. Ich nehme an, dass Sie das Modul überprüfen, das ack fährt, und dieses Modul funktioniert auf beiden Uhren. Ich würde auch annehmen, dass dieses Modul req mit dem schnellen Takt abtastet. Es wäre klarer Ihre Kontrolle zu formulieren wie:

expect expect_ack_when_req_go is 
    (@req_rise_at_fast_clock_e) => @ack_rise_at_slow_clock_e 
    else dut_error("ERROR: ack expected to be asserted when req rises!"); 

diese Weise können Sie zu verwirren nicht herum haben mit detach(...) und die expect mehr passen eng an die natürliche Sprache Beschreibung des gewünschten Verhaltens.

+0

OK, gute Antwort! Ich erinnerte mich vage daran, dass es zwei Implikationsoperatoren auf SVA gibt, aber es ist eine Weile her, seit ich irgendeinen SystemVerilog-Code bearbeitet habe. Auch nette technische Erklärung auf deinem Blog. Außerdem haben Sie auch den methodologischen Hinweis richtig, und das ist der Fix, den ich machen werde. DANKE. –