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?
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.
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.
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.
casex
/ casez
und VHDL case?
; zu "egal welches Signal": mux, mit einem der Eingänge X
für den Fall, dass "der Ausgang irrelevant ist"casex
und casez
werden hauptsächlich zur Steuerung der Synthese verwendet . Sie sagten: " Simulation behandelt X ... als ... 'Platzhalter'. Und Sie haben nichts über casex
oder casez
in 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 casex
oder 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.X
. „Platzhalter“ ist ein gebräuchlicher Oberbegriff, der zur Beschreibung von casex
und verwendet wird casez
. Siehe zum Beispiel casex
den 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.
David Grabowski
Benutzer98663
Möberg
Möberg
ks0ze