web-dev-qa-db-fra.com

Comment déclarer et utiliser des tableaux d'octets 1D et 2D dans Verilog?

Comment déclarer et utiliser des tableaux d'octets 1D et 2D dans 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;
    }
}
34
Ursa Major

Verilog pense par bits, donc reg [7:0] a[0:3] vous donnera un tableau 4x8 bits (= tableau 4x1 octets). Vous obtenez le premier octet de ceci avec a[0]. Le troisième bit du 2e octet est a[1][2].

Pour un tableau d'octets 2D, vérifiez d'abord votre simulateur/compilateur. Les versions plus anciennes (avant 2001, je crois) ne supporteront pas cela. Ensuite reg [7:0] a [0:3] [0:3] vous donnera un tableau d'octets 2D. Un seul bit est accessible avec 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
53
Marty

Outre l'excellente Réponse de Marty, la spécification SystemVerilog offre le type de données byte. Ce qui suit déclare une variable 4x8-bit (4 octets), attribue une valeur à chaque octet, 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

Cela imprime:

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

Ce concept est similaire au reg [7:0] a [0:3]; De Marty. Cependant, byte est un type de données à 2 états (0 et 1), mais reg est à 4 états (01xz). L'utilisation de byte nécessite également que votre chaîne d'outils (simulateur, synthétiseur, etc.) prenne en charge cette syntaxe SystemVerilog. Notez également la syntaxe plus compacte de la foreach (b[i]).

La spécification SystemVerilog prend en charge une grande variété de types de tableaux multidimensionnels. La GRJ peut les expliquer mieux que moi; reportez-vous à IEEE Std 1800-2005, chapitre 5.

10
toolic

En fait, c'est simple, comme en C, il vous suffit de passer les index de tableau du côté droit lors de la déclaration. Mais oui, la syntaxe sera comme [0: 3] pour 4 éléments.

reg a[0:3]; 

Cela créera un 1D de tableau de bit unique. De même, un tableau 2D peut être créé comme ceci:

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

Supposons maintenant que vous créiez un tableau 2D d'int, puis que vous créiez en interne un tableau 2D de 32 bits. Mais malheureusement, Verilog est un HDL, donc il pense en bits plutôt qu'en tas (bien que le type de données int soit présent dans Verilog), il peut vous permettre de créer un nombre quelconque de bits à stocker dans un élément de tableau (qui n'est pas le type de tableau). cas avec C, vous ne pouvez pas stocker 5 bits dans chaque élément d’un tableau 2D en C). Donc, pour créer un tableau 2D, dans lequel chaque élément individuel peut contenir une valeur de 5 bits, vous devriez écrire ceci:

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