Geben Sie der Synthese die Freiheit, das Signal auszuwählen

Gibt es eine Art egal in Verilog (oder VHDL), wo ich sagen kann:

"Verwenden Sie entweder Signal A oder Signal B, das ist mir egal, weil sie funktional gleichwertig wären. Geben Sie einfach Ihr Bestes, viel Glück!"

Beispiel:

module example
    (input wire [1:0] idx,  
     // Sometimes an address of 3 shows up, but in this case the 
     // output is irrelevant (not used/read).
     output wire [2+8-1:0] out);

    reg [8*3-1:0] mem_r;  // 3 words of 1 byte each, imagine content
    wire [1:0] idx_restricted;

    always @* begin
        if(idx == 3) begin
            idx_restricted = 2'b00;
        end else begin
            idx_restricted = idx;
        end
    end

    assign output = {idx, mem_r[8*idx_restricted +: 8]};  
    // ***Here "idx" could be either idx, or idx_restricted***
endmodule

Ohne das idx_restricted gibt es ein Out-of-Bounds zum mem_r.

Kennt jemand so etwas?

Können Sie mehr erklären? Kannst du ein Beispiel einfügen? Aber wenn die Signale äquivalent sind, warum ziehen Sie überhaupt in Betracht, das andere zu wählen?
Vielleicht ein ODER-Gatter?
Ich wollte eigentlich kein Beispiel hinzufügen, weil ich die Frage allgemein halten wollte. Aber ich habe versucht, ein Beispiel zu finden, um die Frage zu verdeutlichen.
@Wossname: Ich bin mir nicht sicher, wie das wäre. Es scheint mir, dass das nur mehr Logik hinzufügen würde. In diesem Fall sollte ich als derjenige, der den Code schreibt, stattdessen eines der Signale willkürlich auswählen.
Ich weiß nicht, ob dies tatsächlich funktionieren würde, aber in VHDL könnten Sie "constant flag : std_logic := '-';" erstellen. dann setzen Sie Ihre Zuweisung auf "output <= idx when flag='1' else idx_restricted"

Antworten (4)

Nein. Was VHDL betrifft, handelt es sich entweder um dasselbe Signal oder um ein anderes Signal. Selbst wenn Sie wissen, dass sie (zum Beispiel) von demselben Signal ausgehen und durch zwei verschiedene funktional identische Gatter gehen oder dass es sich um zwei gleichwertige Pins von einem E / A-Block eines Allzweckchips handelt, und Sie auswählen können, was sie tun später in der Software.

Sie könnten es mandronisch tun, indem Sie zwei verschiedene Architekturen haben, eine mit Signal A, eine mit B, und sehen, welche Ihnen die bessere Synthese liefert. Das funktioniert für ein unsicheres Signal, würde aber schnell langweilig, wenn Sie Dutzende oder Permutationen von Dutzenden vergleichen müssten. An diesem Punkt müssen Sie die 'generate'-Anweisung starten, um diese Architekturen für Sie zu erstellen.

Wenn Sie Bus-Pins zuweisen, müssen Sie nur einen intelligenten Versuch unternehmen, was wahrscheinlich am besten ist, und die Tools dies regeln lassen. Beginnen Sie nur mit der Optimierung der Pins, wenn Sie einen Routing-Fehler erhalten.

mandrolisch? mandrolic: adj. eine langwierige und mühsame Aufgabe, die manuell und nicht automatisch durchgeführt wird.

Es ist nicht erforderlich, eine separate idx_restricted-Variable zu erstellen. Verilog generiert ein X, wenn der Index in mem_r außerhalb der zulässigen Grenzen liegt, und das wird zu einem egal.

In dem bereitgestellten Beispiel sind diese beiden Signale unterschiedlich. Wenn das Design mit beiden arbeiten kann, sollten Sie aus Sicht der Synthese / des Timings verwenden idx. Das liegt daran idx_restricted, was technisch fast so ist idx, wie der Decoder noch beim Decoder braucht idx == 3. Das fügt nur eine weitere Ebene der Logik hinzu.

Wie auch immer, Synthesewerkzeuge werden normalerweise die richtige Arbeit leisten und die Logik sehr oft auf gute Weise optimieren. Ich würde mir darüber keine Sorgen machen, es sei denn, Sie betrachten wirklich die Leistungs- / Timing-Probleme.

Ich bin vor allem neugierig. Auch was besagt, dass flachere Logik besser ist. Wenn es überlastet ist, würde ich vermuten, dass es möglicherweise einfacher zu routen ist, wenn ich idx_restricted verwende, anstatt idx durch den Decoder leiten zu müssen?

Grundsätzlich ist die Antwort auf Ihre Frage „ja“. Ein Synthesizer kann einen X-Wert als egal behandeln, was zu einer besseren Minimierung führen kann. In der Praxis ist dies jedoch eine wirklich schlechte Idee. Das grundlegende Problem besteht darin, dass die Simulation X-Werte als „unbekannt“ oder „Platzhalter“ behandelt, was nicht mit der Synthesizer-Interpretation identisch ist. Dies bedeutet, dass eine RTL-Simulation eines fehlerhaften Designs (fälschlicherweise) bestehen kann, während die Netzlistensimulation (korrekt) fehlschlagen kann. Äquivalenzprüfer können den Fehler auch nicht erkennen, Sie erhalten möglicherweise falsche Codeabdeckungsberichte und so weiter.

Mike Turpin hat vor Jahren eine gute Abhandlung darüber geschrieben – siehe hier .

Ich gehe natürlich davon aus, dass Sie Ihren Code umschreiben können, um im relevanten Fall ein X durchzusetzen.

Ja, ein X kann verwendet werden, um eine "egal"-Kaseinsynthese für ein bestimmtes Signal darzustellen, aber es kann nicht verwendet werden, um zu sagen "es ist mir egal, welches Signal Sie verwenden". Es gibt keine „Wildcard“ in der Simulation, sie ist unbekannt.
@ElliotAlderson: Platzhalter: siehe Verilog casex/ casezund VHDL case?; zu "egal welches Signal": mux, mit einem der Eingänge Xfür den Fall, dass "der Ausgang irrelevant ist"
casexund casezwerden hauptsächlich zur Steuerung der Synthese verwendet . Sie sagten: " Simulation behandelt X ... als ... 'Platzhalter'. Und Sie haben nichts über casexoder casezin Ihrer ursprünglichen Antwort gesagt, noch haben Sie klargestellt, dass Sie mit 'X-Werten' Werte in einem wörtlichen Ausdruck meinten, der in verwendet wird a casexoder casez. Und der Simulator wird niemals sagen „Die Ausgabe ist irrelevant“, sondern „Die Ausgabe ist unbekannt.“ Wörter haben eine Bedeutung, und die Bedeutung zählt.
@ElliotAlderson: Ja, die Simulation wird als „unbekannt oder Platzhalter“ behandelt X. „Platzhalter“ ist ein gebräuchlicher Oberbegriff, der zur Beschreibung von casexund verwendet wird casez. Siehe zum Beispiel casexden Artikel von Cummings. Beachten Sie, dass es in all seinen Arbeiten um Simulation geht, nicht um Synthese. Zu muss ich nichts sagen casex, denn wer Verilog regelmäßig nutzt, weiß, was „Wildcard“ bedeutet. Ich habe nichts von „irrelevant“ gesagt; Ich habe einfach die Anforderung des OP zitiert . Wenn Sie wirklich Einwände gegen meine Antwort haben, lesen Sie Turpins Artikel, den ich verlinkt habe.
Denken Sie daran, dass Sie nicht für jemanden schreiben, der „Verilog regelmäßig verwendet“ … Sie versuchen, einem Neuankömmling zu helfen. Wenn Sie sagen "behandelt X-Werte als 'unbekannt' oder 'Platzhalter'", macht die Struktur des Ausdrucks es unklar. Trifft der Simulator eine willkürliche, zufällige Wahl zwischen „unbekannt“ oder „Platzhalter“? Wenn der Eingang eines UND-Gatters 'X' ist, wird das als 'Platzhalter' behandelt? Wenn der bedingte Teil eines ternären Operators zu 'X' ausgewertet wird, entscheidet der Simulator dann willkürlich, welche der Möglichkeiten zurückgegeben werden soll? Sie mögen vielleicht 'Wildcard', aber IEEE Std 1364 verwendet 'do-not-care'.