Hoe kan ik 1D- en 2D-bytearrays declareren en gebruiken in Verilog?

Hoe kan ik 1D- en 2D-bytearrays declareren en gebruiken in Verilog?

bijv. hoe iets te doen als

byte a_2D[3][3];
byte a_1D[3];
// using 1D
for (int i=0; i< 3; i++)
{
    a_1D[i] = (byte)i;
}
// using 2D
for (int i=0; i< 3; i++)
{
    for (int j=0; j< 3; j++)
    {
        a_2D[i][j] = (byte)i*j;
    }
}

Antwoord 1, autoriteit 100%

Verilog denkt in bits, dus reg [7:0] a[0:3]geeft je een 4×8 bit array (=4×1 byte array). De eerste byte haal je hieruit met a[0]. Het derde bit van de 2e byte is a[1][2].

Controleer voor een 2D-array van bytes eerst uw simulator/compiler. Oudere versies (voor ’01, geloof ik) zullen dit niet ondersteunen. Dan geeft reg [7:0] a [0:3] [0:3]je een 2D-array van bytes. Een enkele bit kan worden benaderd met bijvoorbeeld a[2][0][7].

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

Antwoord 2, autoriteit 19%

Naast Marty’s uitstekende Answer biedt de SystemVerilog-specificatie het gegevenstype byte. Het volgende declareert een 4×8-bits variabele (4 bytes), wijst elke byte een waarde toe en geeft vervolgens alle waarden weer:

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

Hiermee wordt afgedrukt:

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

Dit is vergelijkbaar in concept naar Marty’s reg [7:0] a [0:3];. byteis echter een 2-statelijk gegevenstype (0 en 1), maar regis 4-status (01xz). Met bytevereist ook uw gereedschapsketen (Simulator, Synthesizer, enz.) Ter ondersteuning van deze SystemVerilog Syntax. Noteer ook de compacter foreach (b[i])LUS SYNTAX.

De SystemVerilog-specificatie ondersteunt een breed scala aan multi-dimensionale array-typen. De LRM kan ze beter verklaren dan ik kan; Raadpleeg IEEE STD 1800-2005 , hoofdstuk 5.


Antwoord 3, Autoriteit 9%

Het is eenvoudig, zoals C-programmering U hoeft alleen maar de array-indices aan de rechterkant te halen terwijl de verklaring. Maar ja, de syntaxis zal zijn als [0: 3] voor 4 elementen.

reg a[0:3]; 

Hiermee wordt een 1D-reeks van een enkel bit gemaakt. Evenzo 2D-array kan als volgt worden gemaakt:

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

Nu in C Stel dat u een 2D-array van INT maakt, dan maakt het intern een 2D-array van 32 bits. Maar helaas is Verilog een HDL, dus denkt het in bits in plaats van buts (hoewel Int Datatype is er in Verilog), het kan je toestaan ​​dat je een willekeurig aantal bits kunt maken dat moet worden opgeslagen in een element van array (wat niet de Case met C, u kunt geen 5-bits opslaan in elk element van 2D-array in C). Dus om een ​​2D-array te maken, waarbij elk individueel element 5 bitwaarde kan bevatten, moet u dit schrijven:

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

Other episodes