Im Verilog-2001-Standard konnte ich dazu nichts finden. Beispielsweise funktioniert der folgende Code (Xilinx ISE):
reg r1;
always @(posedge clk or posedge rst) begin
if (rst) begin
r1 <= 0;
end else begin
r1 <= r1;
if (cond1) begin
r1 <= 1'b1;
end
end
end
In diesem Fall wird r1 auf 1'b1 aktualisiert, wenn cond1
es ungleich Null ist (@ posedge von clk), andernfalls behält es seinen Wert (wie vorgesehen). Ähnlich:
1 reg [1023:0] a_reg;
2 always @(posedge trigger or posedge rst) begin
3 if (rst) begin
4 a_reg <= 0;
5 end else begin
6 a_reg <= a_reg; // required?
7 a_reg[i*2 +: 2] <= input;
8 end
9 end
Ist Zeile 6 erforderlich? Was gilt als akzeptable Praxis für das FPGA- und ASIC-Design? Ich würde mir vorstellen, dass Zeile 6 nicht erforderlich ist (gemäß der Definition eines Registers sollte es seinen Wert zwischen Zuweisungen halten). Oder hängt es vom Compiler / Synthesetool ab (DC Compiler, Xilinx ISE/Vivado, Altera Quartus, etc)? Gibt es etwas in der Norm, das Licht ins Dunkel bringt?
r1 <= r1
wird in keinem Synthesizer benötigt, wie es in der Definition von RTL der Fall ist. Da die Logik unter geschrieben ist @posedge clk
, ist es implizit, dass der vorherige Wert eines Registers r1
in diesem Taktzyklus gehalten werden sollte, wenn r1
an dieser Taktflanke kein Wert angesteuert wird, dh in diesem Fall, wenn die Bedingung cond1
verletzt wird.
Dies gilt auch für das zweite Beispiel. Der a_reg
Vektor wird durch 1024 1-Bit-Register gebildet. Daher ist die frühere Schlussfolgerung, die wir zum 1-Bit-Register gemacht haben , auch r1
auf jedes Register im Vektor anwendbar .a_reg
Ralf
Mitu Raj