Tableaux et mémoires Verilog : Maîtriser les structures de données multidimensionnelles
Une déclaration de tableau (array) d'un net ou variable peut être scalaire ou vectoriel. Nombre illimité de dimensions en spécifiant une plage d'adresses après le nom d'identificateur : tableau multidimensionnel. Tableaux autorisés pour reg, wire, integer et real.
reg y1 [11:0]; // tableau scalaire reg profondeur=12, chaque 1-bit
wire [0:7] y2 [3:0]; // net vecteur 8-bit avec profondeur 4
reg [7:0] y3 [0:1][0:3]; // tableau 2D lignes=2, cols=4, chaque 8-bit
Un index pour chaque dimension doit être spécifié pour accéder à un élément, peut être expression d'autres variables. Tableau possible pour tout type de données supporté.
Une mémoire de n reg 1-bit n'est pas équivalente à un reg vecteur n-bit.
Assignation
y1 = 0; // Illégal - tous éléments ne peuvent pas être assignés d'un coup
y2[0] = 8'ha2; // Assigner 0xa2 à index=0
y2[2] = 8'h1c; // Assigner 0x1c à index=2
y3[1][2] = 8'hdd; // Assigner 0xdd à ligne=1 col=2
y3[0][0] = 8'haa; // Assigner 0xaa à ligne=0 col=0
Exemple
Le code ci-dessous montre modélisation, assignation et accès à différents tableaux. mem1 = vecteur 8-bit, mem2 = tableau vecteur 8-bit profondeur 4, mem3 = tableau 2D vecteur 16-bit 4 lignes x 2 colonnes.
module des ();
reg [7:0] mem1;
reg [7:0] mem2 [0:3];
reg [15:0] mem3 [0:3][0:1];
initial begin
int i;
mem1 = 8'ha9;
$display ("mem1 = 0x%0h", mem1);
mem2[0] = 8'haa; mem2[1] = 8'hbb; mem2[2] = 8'hcc; mem2[3] = 8'hdd;
for(i = 0; i < 4; i = i+1) $display("mem2[%0d] = 0x%0h", i, mem2[i]);
for(int i = 0; i < 4; i += 1) begin
for(int j = 0; j < 2; j += 1) begin
mem3[i][j] = i + j;
$display("mem3[%0d][%0d] = 0x%0h", i, j, mem3[i][j]);
end
end
end
endmodule
Simulation Log :
ncsim> run mem1 = 0xa9 mem2[0] = 0xaa mem2[1] = 0xbb mem2[2] = 0xcc mem2[3] = 0xdd mem3[0][0] = 0x0 mem3[0][1] = 0x1 mem3[1][0] = 0x1 mem3[1][1] = 0x2 mem3[2][0] = 0x2 mem3[2][1] = 0x3 mem3[3][0] = 0x3 mem3[3][1] = 0x4 ncsim: *W,RNQUIE: Simulation is complete.
Mémoires
Mémoires = éléments de stockage numérique (RAM, ROM). Modélisées par tableaux 1D de type reg appelés mémoire. Chaque élément = mot, référencé par index unique.

Vecteur de registre (Register Vector)
Vecteurs Verilog déclarés avec plage de taille à gauche du nom, réalisés en bascules correspondant à la taille. Module design avec horloge, reset, signaux contrôle pour lecture/écriture. Contient élément de stockage 16-bit "register" mis à jour en écriture, retourne valeur courante en lecture.
module des (input clk, input rstn, input wr, input sel, input [15:0] wdata, output [15:0] rdata);
reg [15:0] register;
always @ (posedge clk) begin
if (!rstn) register <= 0;
else begin
if (sel & wr) register <= wdata;
else register <= register;
end
end
assign rdata = (sel & ~wr) ? register : 0;
endmodule
Schéma matériel : bascule 16-bit mise à jour quand logique contrôle écriture active, valeur courante retournée pour lecture.

Tableau (Array)
Ici register est tableau 4 emplacements x 16-bit. Module accepte signal addr additionnel pour accéder index particulier.
module des (input clk, input rstn, input [1:0] addr, input wr, input sel, input [15:0] wdata, output [15:0] rdata);
reg [15:0] register [0:3];
integer i;
always @ (posedge clk) begin
if (!rstn) begin
for (i = 0; i < 4; i = i+1) register[i] <= 0;
end else begin
if (sel & wr) register[addr] <= wdata;
else register[addr] <= register[addr];
end
end
assign rdata = (sel & ~wr) ? register[addr] : 0;
endmodule
Schéma : chaque index = bascule 16-bit, adresse d'entrée sélectionne jeu de bascules particulier.

Verilog
- Maîtriser les tableaux C# : Déclaration, initialisation et opérations
- Comprendre la relation entre les tableaux et les pointeurs en C
- Techniques de copie de tableaux en Java : Guide complet
- Les tableaux en C++ : Déclaration, initialisation et techniques avec pointeurs
- Maîtriser l'allocation de tableaux dynamiques en C++ : Guide pratique avec exemples de code
- Tutoriel Java Arrays : Déclaration, création et initialisation – Code d'exemple
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les Délais Inter- et Intra-Affectation en Verilog