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;
    }
}
Était-ce utile?

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];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top