Maîtriser la concaténation Verilog : Guide pratique
Fils et variables multi-bit Verilog peuvent être regroupés pour former un net ou variable multi-bit plus grand via opérateurs de concaténation { et } séparés par virgules. Concaténation autorise aussi expressions et constantes dimensionnées comme opérandes. Taille de chaque opérande doit être connue pour calculer taille totale.
Exemple concaténation Verilog
wire a, b; // wire 1-bit
wire [1:0] res; // wire 2-bit pour stocker a et b
// res[1] suit a, res[0] suit b
assign res = {a, b};
wire [2:0] c; wire [7:0] res1;
// res[0] suit c[2]
// res[2:1] toujours 0
// res[4:3] suit c[1:0]
// res[5] suit a
// res[6] suit b
assign res1 = {b, a, c[1:0], 2'b00, c[2]};
Exemple fonctionnel de concaténation d'entrées pour former différentes sorties. Expressions concaténées peuvent être affichées ou assignées à tout wire/variable, pas nécessairement sorties.
module des (input [1:0] a, input [2:0] b, output [4:0] out1, output [3:0] out2);
assign out1 = {a, b};
assign out2 = {a[1], 2'b01, b[2]};
endmodule
module tb;
reg [1:0] a; reg [2:0] b; wire [4:0] out1; wire [3:0] out2;
des u0 (a, b, out1, out2);
initial begin a <= 0; b <= 0; $monitor("[%0t] a=%b b=%b, out1=%b out2=%b", $time, a, b, out1, out2);
#10 a <= 3; #5 b <= 5; #10 a <= 2; #5 b <= 1; #10 $finish; end
endmodule
Notez que out2[2:1] est toujours constant 2'b01.
Simulation Log :
xcelium> run [0] a=00 b=000, out1=00000 out2=0010 [10] a=11 b=000, out1=11000 out2=1010 [15] a=11 b=101, out1=11101 out2=1011 [25] a=10 b=101, out1=10101 out2=1011 [30] a=10 b=001, out1=10001 out2=1010 Simulation complete via $finish(1) at time 40 NS + 0
Opérateur de réplication
Quand même expression répétée plusieurs fois, une constante de réplication (non-négative, pas X, Z, variable) est utilisée, enfermée dans accolades avec opérateur concaténation, indiquant nombre total de répétitions.
wire a; wire [6:0] res; assign res = {7{a}};
{2'bz{2'b0}} // Illégal : Z comme constante réplication
{2'bx{2'b0}} // Illégal : X comme constante réplication
Expressions réplication ne peuvent apparaître côté gauche d'affectation ni connectées à ports output/inout.
module des; reg [1:0] a; reg [2:0] b; initial begin a <= 2; b <= 4; #10;
$display("a=%b b=%b res=%b", a, b, {{2{a}}, {3{b}}}); end endmodule
a répété 2 fois, b 3 fois.
Simulation Log :
xcelium> run a=10 b=100 res=1010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Opérandes évaluées une seule fois lors exécution expression réplication même si constante zéro.
Réplication imbriquée
Expression réplication autorisée dans expressions concaténation régulières. Reprenons exemple ci-dessus avec a et b inclus dans concaténation totale.
module des; reg [1:0] a; reg [2:0] b; initial begin a <= 2; b <= 4; #10;
$display("a=%b b=%b res=%b", a, b, {a, b, 3'b000, {{2{a}}, {3{b}}}}); end endmodule
Simulation Log :
xcelium> run a=10 b=100 res=101000001010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Utilisation illégale
module des; reg [1:0] a; reg [2:0] b; reg [3:0] _var; initial begin a <= 2; b <= 4; _var <= 3;
// Illégal : variable ne peut être constante réplication
$display("a=%b b=%b res=%b", a, b, {_var{a}}); end endmodule
Erreur compilation :
Top level design units: des
$display("a=%b b=%b res=%b", a, b, {_var{a}});
| xmelab: *E,NOTPAR (./testbench.sv,12|45): Illegal operand for constant expression [4(IEEE)].
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
- Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage
- Comprendre et Afficher les Timescales Verilog à Toute Portée