Kann Verilog-Variablen gegeben werden lokalen Bereich zu einem immer blockieren?
Ich manchmal es nützlich finden, verwenden Sie blockierende Zuweisungen für "lokale Variablen" innerhalb getaktet blockiert immer. Dies kann helfen, reduzieren auf wiederholte-code.
Nicht versehentlich in die gleiche variable in einem anderen immer blockieren (die kann nicht deterministisch sein für die simulation), möchte ich es im lokalen Bereich. Gibt es ein schönes synthetisierte Weg, dies zu tun?
Etwas wie:
module sum3(
input clk,
input [7:0] in1,
input [7:0] in2,
input [7:0] in3,
output reg [7:0] result,
output reg [7:0] result_p1);
begin :sum
reg [7:0] sum_temp; //local variable
always @(posedge clk) begin
sum_temp = in1 + in2 + in3;
result <= sum_temp;
result_p1 <= sum_temp + 1;
end
end
endmodule
(ModelSim scheint in Ordnung zu sein mit diesem, aber Synplify nicht scheinen es zu mögen.)
- Hat Ihr code mehrere Fehler bei der Kompilierung mit 2 Simulatoren, die ich verwendet (VCS und Prägnant).
- Bearbeitet beheben den Fehler bei der Kompilierung.
- Feedback aus dem down-Wähler?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, dass die Semantik in einfachen Verilog, aber nach der SystemVerilog-LRM Abschnitt 6.21:
Daher die folgenden rechtlichen syntax in SystemVerilog:
Beachten Sie, dass habe ich verschoben, die variable, Erklärung
sum_temp
in den Prozess, wodurch die Begrenzung des Umfangs und entfernen die Notwendigkeit für die benanntensum
block. Dies stellt auf Modelsim und Riviera (Beispiel auf EDA-Spielplatz).Wenn das Werkzeug dies nicht unterstützt syntax, heben ein bug!
begin
- Anweisung funktioniert der trick, z.B.begin:sum
. @Chiggs, Wenn Sie wollen, dass "Bearbeiten", dann denke ich, das ist die beste Antwort.Standard sythesizable Möglichkeit ist eine kontinuierliche Aufgabe mit einem
wire
:assignments end up far away from where the variables are used
: Was meinst du mit weit Weg??? Es ist die Aufgabe der placer und router, die Sie nicht brauchen, zu kümmern. Wenn Sie wollen, verwenden Siedifferent intermediate values
verwenden Sie einen anderenreg
für es in die Sie immer verdeckt.always
block besetzten Hunderte von Zeilen code, und dann mit einemwire
für eine "Zwischengröße", könnte die Zuweisung noch sehr weit entfernt (im code) aus, wo diewire
ist eigentlich imalways
block. Meiner Meinung nach, der code ist besser lesbar, wenn die Belegung der variable und die Verwendung der Variablen sind zusammengefasst in den code.always
block ist das problem. Warum gehst du nicht teilen Sie Sie in mehrere immer blockiert, wo immer geeignet? Ebenfalls können Sie Schleifen...Trotz der gemeinsamen Leitlinie, Verwendung von blockierenden Aufgaben innerhalb getaktet blockiert immer in Ordnung ist, und irgendwann, als Sie erwähnt, sinnvoll. Siehe hier: https://stackoverflow.com/a/4774450/1383356
Einige tools dürfen allerdings nicht die Unterstützung der lokalen Variablen definiert, die innerhalb eines begin-end-block.
Alternativ, Sie können versuchen Sie einige oder alle der Körper, der immer blockieren bei einer Aufgabe:
Verilog-tasks können haben Zugriff auf Globale Variablen sowie lokale. Auch, Sie können nicht-blockierende Zuweisungen.