Comment déclarer et utiliser des tableaux d'octets 1D et 2D en Verilog?
Question
Comment déclarer et utiliser des tableaux d'octets 1D et 2D en Verilog?
par exemple. comment faire quelque chose comme
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;
}
}
La solution
Verilog pense en bits, donc reg [7:0] a[0:3]
vous donnera un tableau de bits 4x8 (= tableau d'octets 4x1). Vous obtenez le premier octet de ce avec a[0]
. Le troisième bit du 2ème octet est a[1][2]
.
Pour un tableau 2D d'octets, vérifiez d'abord votre simulateur / compilateur. Les versions plus anciennes (pré '01, je crois) ne soutiendra pas cela. Alors reg [7:0] a [0:3] [0:3]
vous donnera un tableau 2D d'octets. A peut être accessible avec un seul bit a[2][0][7]
par exemple.
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
Autres conseils
En plus d'une excellente réponse de Marty, les offres de spécification SystemVerilog le type de données byte
. Ce qui suit déclare une variable 4x8 bits (4 octets), attribue à chaque octet d'une valeur, puis affiche toutes les valeurs:
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
Ceci affiche:
Address = 0, Data = 00000001
Address = 1, Data = 00000010
Address = 2, Data = 00000100
Address = 3, Data = 00001000
Ce concept est similaire à la reg [7:0] a [0:3];
de Marty. Cependant, byte
est un type de données à 2 états (0 et 1), mais reg
est le 4-état (01xz). L'utilisation byte
exige également votre chaîne d'outils (simulateur, synthétiseur, etc.) pour soutenir cette syntaxe SystemVerilog. Notez également plus compact syntaxe de boucle foreach (b[i])
.
La spécification SystemVerilog prend en charge une grande variété de types de tableaux multidimensionnels. Le LRM peut les expliquer mieux que moi; reportez-vous à IEEE Std 1800-2005 , chapitre 5.
Il est simple en fait, comme vous la programmation C juste besoin de passer les indices de tableau sur le côté droit alors que la déclaration. Mais oui la syntaxe sera comme [0: 3]. Pour 4 éléments
reg a[0:3];
Cela va créer un 1D de tableau de bit unique. De même tableau 2D peut être créé comme ceci:
reg [0:3][0:2];
Maintenant en C supposons que vous créez un tableau 2D de int, alors il va créer en interne un tableau 2D de 32 bits. Mais malheureusement Verilog est un HDL, il pense en bits plutôt que groupe de bits (bien que type de données int est là en Verilog), il peut vous permettre de créer un nombre de bits à être stockés dans un élément de tableau (qui n'est pas cas C, on ne peut pas stocker 5 bits dans chaque élément du tableau 2D en C). Donc, pour créer un tableau 2D, dans lequel chaque élément individuel peut contenir 5 valeur binaire, vous devez écrire ceci:
reg [0:4] a [0:3][0:2];