Flip-Signalwerte in der Verilog-Simulation

Ich verwende den Befehl "Force" in Modelsim, um ein internes Signal auf einen bestimmten Wert zu zwingen (nicht primäre Eingänge). Manchmal ist der von mir erzwungene Wert derselbe wie der ursprüngliche Wert.

Gibt es einen Befehl, der den Signalwert in Modelsim oder anderen Verilog-Simulatoren umdrehen kann? In diesem Fall werde ich definitiv den Wert des Signals ändern.

Sie möchten es mit einem Skript tun? Oder einfach erzwingen? Weil Sie immer ein Signal von der GUI erzwingen können. Andernfalls können Sie ein Signal erzwingen, indem Sie es oder in Ihrem Simulationsskript eingeben.
@FarhadA, ich möchte es eher in meinem Skript als in meiner Testbench erzwingen. Weil ich einen Algorithmus habe, um viele Manipulationen an den Signalen vorzunehmen. Wenn ich es in der Testbench mache, muss ich die Testbench jedes Mal kompilieren, wenn ich die erzwungenen Signale aktualisiere.
@rex Wenn das Kompilieren Ihrer Testbench zu lange dauert, möchten Sie wahrscheinlich Ihre Tests umgestalten. Ich finde, die Vorteile des Testens in derselben Sprache (anstatt meinen Kopf gegen TCL zu schlagen) sind es wert. Aber dann brauchen meine Testbänke vernachlässigbar viel Zeit zum Kompilieren ...
@MartinThompson, du hast einen guten Punkt. Ich habe viele Testsets. Ich kann sie in eine Testbench schreiben, aber es kann Kopfschmerzen bereiten, die Signale auszuführen und aufzuzeichnen (ich machte mir Sorgen, ob der Simulator abstürzt). Aber ich muss das Signal auch umdrehen, ohne seinen Wert zu kennen, was bedeutet, dass ich dies nur in der Testbench anstelle der TCL-Datei tun kann. Dann muss ich viele Testbenches kompilieren. Es sieht so aus, als wäre keiner der Wege schneller, als es von tcl zu erzwingen, aber tcl kann den Signalwert nicht umdrehen ...
Wenn Sie viele Testsets haben, müssen sie nicht alle in einer Testbench landen. Es klingt (ohne alle Details Ihres Setups zu kennen), dass Sie Ihre Tests etwas neu organisieren müssen ... vielleicht?

Antworten (2)

Mir sind keine Simulatorbefehle zum Invertieren eines Signals bekannt. Wenn Sie die Kraft jedoch aus der Verilog-Quelle heraus ausführen, sollten Sie dies einfach tun können:

force path.to.signal = ~path.to.signal;

Wenn Sie es vom Simulator aus erzwingen, können Sie wahrscheinlich das Äquivalent der obigen Anweisung in TCL ausführen. Sie müssten den aktuellen Wert abrufen, ihn invertieren und dann eine Kraft mit dem invertierten Wert anwenden.

Ich denke, dies ist die einzige Möglichkeit, das Signal umzudrehen, ohne seinen Wert zu kennen.

In ModelSim lautet der Befehl zum Erzwingen eines Signals:

force signal_name value time

Zum Beispiel:

force reset 0 100

Oder wenn Sie eine fortgeschrittenere Methode wünschen, vorausgesetzt, Ihre Zeit ist auf 1 ns eingestellt:

force clk 0 20, 1 20 -repeat 100

Sie können mehr erfahren, wenn Sie das Handbuch lesen: ModelSim SE Command Reference

Hier ist der Auszug aus dieser Datei:

    force input1 0
Forces input1 to 0 at the current simulator time.
    force bus1 01XZ 100 ns
Forces bus1 to 01XZ at 100 nanoseconds after the current simulator time.
    force bus1 16#f @200
Forces bus1 to 16#F at the absolute time 200 measured in the resolution units selected at simulation start-up.
    force input1 1 10, 0 20 -r 100
Forces input1 to 1 at 10 time units after the current simulation time and to 0 at 20 time units after the current simulation time. This cycle repeats starting at 100 time units after the current simulation time, so the next transition is to 1 at 100 time units after the current simulation time.
    force input1 1 10 ns, 0 {20 ns} -r 100ns
Similar to the previous example, but also
specifies the time units. Time unit expressions
preceding the "-r" must be placed in curly braces.
    **force s 1 0, 0 100 -repeat 200 -cancel 1000**
Forces signals to alternate between values 1 and 0 every 100 time units until time 1000.
Cancellation occurs at the last simulation delta cycle of a time unit. So,
    force s 1 0 -cancel 0
will force signals to 1 for the duration of the current time period.
    when {/mydut/siga = 10#1}
       {
        force -deposit /mydut/siga 10#85
       }
Forces siga to decimal value 85 whenever the value on the signal is 1.
Danke für die Antwort. Ich weiß, wie das geht. Aber danach habe ich nicht gefragt.
Nun, wenn Sie das Dokument, auf das ich mich bezog, überprüfen, werden Sie den FORCE-Befehl in TCL finden, der GENAU das tut, wonach Sie suchen. Sie können die Hierarchie betrügen, indem Sie das Signal unter GUI erzwingen, dann den Befehl aus dem Transkriptfenster kopieren und in Ihre TCL-Datei einfügen.
Ja. Du hast Recht. Ich denke, die Frage ist nicht klar genug. Ich meine, das Signal umzudrehen, ohne den Wert des Signalwerts zu kennen. Ich würde diesmal die Lösung von dwikle nehmen. Vielen Dank auch für Ihre Hilfe.