Was ist die Standardcodierungspraxis für eine nicht blockierende Zuweisung an ein großes Registerarray mit variabler Teilauswahl in Verilog?

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 cond1es 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?

Antworten (1)

r1 <= r1wird 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 r1in diesem Taktzyklus gehalten werden sollte, wenn r1an dieser Taktflanke kein Wert angesteuert wird, dh in diesem Fall, wenn die Bedingung cond1verletzt wird.

Dies gilt auch für das zweite Beispiel. Der a_regVektor wird durch 1024 1-Bit-Register gebildet. Daher ist die frühere Schlussfolgerung, die wir zum 1-Bit-Register gemacht haben , auch r1auf jedes Register im Vektor anwendbar .a_reg

Haben Sie zufällig eine Quelle oder Material, das dies abdeckt? Oder ist dies nur im Verilog-Standard impliziert?
Dies gilt für eine sequenzielle Logik, die in einer beliebigen RTL geschrieben ist.