2017-08-24 1 views
1

Ich bin ein bisschen ein Anfänger mit Verilog, und ich habe gerade angefangen, an einem Projekt zu arbeiten, und ich versuche zu überprüfen, dass der Code, mit dem ich begonnen habe, praktikabel ist. Der folgende Codeschnipsel entlädt einen FIFO in einen Vektor von 8-Bit-Registern. Bei jedem Taktzyklus entlädt es ein Byte aus dem FIFO und setzt es an das Ende der Registerkette, wobei es alle anderen Bytes entlang der Kette verschiebt.Füllen Registervektor aus FIFO mit generierten Schichten

reg [ 7:0]   mac_rx_regs [0 : 1361]; 
generate for (ii=0; ii<1361; ii=ii+1) 
    begin: mac_rx_regs_inst    
    always @(posedge rx_clk_int, posedge tx_reset) 
    if (tx_reset) begin 
     mac_rx_regs[ii] <= 8'b0; 
     mac_rx_regs[1361] <= 8'b0; 
    end else begin 
     if (rx_data_valid_r) begin 
     mac_rx_regs[ii] <= mac_rx_regs[ii+1]; 
     mac_rx_regs[1361] <= rx_data_r; 
     end 
    end 
    end 
    endgenerate 

Ich würde gerne wissen, ob dies ein guter Weg ist, dies zu tun. Ich hätte erwartet, den Registervektor mit dem Byte-Zählwert vom Lesen des FIFO gerade zu adressieren. Ich bin besorgt, dass dies nicht deterministisch ist, da die Reihenfolge, in der die generierten Blöcke immer ausgeführt werden, nicht spezifiziert ist, und es scheint, dass dadurch eine Menge unnötiger Logik erzeugt wird, um Daten von einem Register zu einem anderen zu bewegen.

Antwort

1

Zu Beginn müssen Sie sich nicht wirklich um die Anzahl von immer Aussagen im Allgemeinen kümmern. Wenn sie alle dieselbe Uhr verwenden und zurücksetzen, erhalten Sie das erwartete Verhalten in Bezug auf die Interaktion zwischen den Prozessen. Die eine Sache, die ich tue, die mehr über Stil als alles andere ist, ist ein #FD zu meinen Flop-Zuordnungen hinzuzufügen, wie unten gezeigt, um die Simulation ein wenig besser aussehen zu lassen, IMHO.

Auch das ist einfach genug, dass Sie dies als einen einzigen Prozess codieren könnten.

parameter FD = 1; 
reg [1361*8-1:0] mac_rx_regs; // Arrays are good if you are trying to 
           // infer memory, but if you are okay 
           // with registers, just declare a vector. 
always @ (posedge clk or posedge reset) 
begin 
    if (reset) 
     mac_rx_regs <= #FD 1361*8'h0; 
    else 
     // This next statement shifts in a new 8 bits when rx_data_valid_r is asserted. 
     // It will assign max_rx_regs to max_rx_regs (nop) when deasserted. 
     mac_rx_regs <= #FD rx_data_valid_r ? {mac_rx_regs[1361*8-9:0],rx_data_r} : 
              mac_rx_regs; 
end 
+0

Danke für die Antwort. Wenn ich dich richtig verstehe, sollte mein ursprünglicher Code gut funktionieren, aber ich mag deine Version viel besser. Es ist viel sauberer und die Funktion ist offensichtlicher. – JMF