2010-06-10 5 views

Répondre

46

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 avec a[0]. Le troisième bit du deuxième octet est a[1][2].

Pour un tableau 2D d'octets, vérifiez d'abord votre simulateur/compilateur. Les anciennes versions (pré '01, je crois) ne supporteront pas cela. Alors reg [7:0] a [0:3] [0:3] vous donnera un tableau 2D d'octets. Un seul bit peut être consulté 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 
+1

Les boucles for ne doivent-elles pas être <= 3 plutôt que <3? –

+1

La déclaration de tableau @RossAiken de style [a: b] est inclusive. Donc <= est correct. – siu

+0

@siu - Je me suis trompé à l'origine - ross-aiken a repéré l'erreur et j'ai édité la réponse ... – Marty

8

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

Cette imprime:

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

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

La spécification SystemVerilog prend en charge une grande variété de types de tableaux multidimensionnels. Le LRM peut les expliquer mieux que je ne peux; IEEE Std 1800-2005, chapitre 5.

3

En fait, comme pour la programmation en C, il suffit de passer les indices 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 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, donc il pense en bits plutôt qu'en tas de bits (bien que le type de données soit présent dans Verilog), il peut vous permettre de créer n'importe quel nombre de bits à stocker dans un élément de tableau. cas avec C, vous ne pouvez pas stocker 5 bits dans chaque élément du tableau 2D en C). Pour créer un tableau 2D dans lequel chaque élément peut contenir une valeur de 5 bits, vous devez écrire ceci:

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