2010-06-10 9 views

Antwort

46

Verilog denkt in Bits zu tun, so reg [7:0] a[0:3] finden Sie ein 4x8 Bit-Array (= 4x1 Byte-Array) geben. Sie erhalten das erste Byte mit a[0]. Das dritte Bit des zweiten Bytes ist a[1][2].

Für ein 2D-Array von Bytes, überprüfen Sie zuerst Ihren Simulator/Compiler. Ältere Versionen (vor '01, glaube ich) werden das nicht unterstützen. Dann gibt reg [7:0] a [0:3] [0:3] Ihnen ein 2D-Array von Bytes. Auf ein einzelnes Bit kann beispielsweise mit a[2][0][7] zugegriffen werden.

reg [7:0] a [0:3]; 
reg [7:0] b [0:3] [0:3]; 

reg [7:0] c; 
reg d; 

initial begin 

    for (int i=0; i<=3; i++) begin 
     a[i] = i[7:0]; 
    end 

    c = a[0]; 
    d = a[1][2]; 


    // using 2D 
    for (int i=0; i<=3; i++) 
     for (int j=0; j<=3; j++) 
      b[i][j] = i*j; // watch this if you're building hardware 

end 
+1

Müssen die for-Schleifen nicht <= 3 und nicht <3 sein? –

+1

@RossAiken-Array-Deklaration von [a: b] -Stil ist inklusive Bereich. Also <= ist richtig. – siu

+0

@siu - Ich hatte es ursprünglich falsch - ross-aiken entdeckte den Fehler und ich bearbeitete die Antwort ... – Marty

8

Neben hervorragender Antwort Marty bietet die SystemVerilog-Spezifikation den byte Datentyp. Das folgende erklärt ein 4x8-Bit-Variable (4 Byte), weist jedem Byte einen Wert, zeigt dann alle Werte:

module tb; 

byte b [4]; 

initial begin 
    foreach (b[i]) b[i] = 1 << i; 
    foreach (b[i]) $display("Address = %0d, Data = %b", i, b[i]); 
    $finish; 
end 

endmodule 

Dies gibt:

Address = 0, Data = 00000001 
Address = 1, Data = 00000010 
Address = 2, Data = 00000100 
Address = 3, Data = 00001000 

Dies ist im Konzept ähnlich Martys reg [7:0] a [0:3]; . byte ist jedoch ein 2-State-Datentyp (0 und 1), aber reg ist 4-State (01xz). Die Verwendung von byte erfordert auch Ihre Werkzeugkette (Simulator, Synthesizer usw.), um diese SystemVerilog-Syntax zu unterstützen. Beachten Sie auch die kompaktere foreach (b[i]) Schleifensyntax.

Die SystemVerilog-Spezifikation unterstützt eine Vielzahl von mehrdimensionalen Array-Typen. Das LRM kann sie besser erklären, als ich es kann; Siehe IEEE Std 1800-2005, Kapitel 5.

3

Es ist eigentlich einfach, wie C-Programmierung müssen Sie nur die Array-Indizes auf der rechten Seite während der Deklaration übergeben. Aber ja, die Syntax wird wie [0: 3] für 4 Elemente sein.

reg a[0:3]; 

Dies wird eine 1D Array von einzelnen Bit erstellen. Auf ähnliche 2D-Array kann wie folgt erstellt werden:

reg [0:3][0:2]; 

Jetzt in C: Angenommen, Sie eine 2D-Array von int erstellen, dann wird es intern einen 2D-Array von 32 Bit erstellen. Aber leider ist Verilog ein HDL, also denkt es in Bits und nicht in einem Bündel von Bits (obwohl der int-Datentyp in Verilog vorhanden ist), es kann Ihnen erlauben, eine beliebige Anzahl von Bits innerhalb eines Array-Elements zu speichern (was nicht das ist Fall mit C, können Sie nicht 5-Bits in jedem Element des 2D-Arrays in C) speichern. Um also ein 2D-Array zu erstellen, in dem jedes einzelne Element einen 5-Bit-Wert halten kann, sollten Sie folgendes schreiben:

Verwandte Themen