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];
. byte
is echter een 2-statelijk gegevenstype (0 en 1), maar reg
is 4-status (01xz). Met byte
vereist 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];