Concaténation Verilog
Les fils et les variables Verilog multi-bits peuvent être regroupés pour former un fil ou une variable multi-réseau plus grand en utilisant la concaténation opérateurs {
et }
séparé par des virgules. La concaténation est également autorisée à avoir des expressions et des constantes dimensionnées comme opérandes en plus des fils de liaison et des variables.
La taille de chaque opérande doit être connue afin de calculer la taille complète de la concaténation.
Exemple de concaténation Verilog
wire a, b; // 1-bit wire
wire [1:0] res; // 2-bit wire to store a and b
// res[1] follows a, and res[0] follows b
assign res = {a, b};
wire [2:0] c;
wire [7:0] res1;
// res[0] follows c[2]
// res[2:1] is always 0
// res[4:3] follows c[1:0]
// res[5] follows a
// res[6] follows b
assign res1 = {b, a, c[1:0], 2'b00, c[2]};
Voici un exemple de conception fonctionnel de concaténation d'entrées pour former différentes sorties. Les expressions concaténées peuvent être simplement affichées ou affectées à n'importe quel fil ou variable, pas nécessairement des 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 une constante 2'b01.
Journal de simulationxcelium> 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
Lorsque la même expression doit être répétée plusieurs fois, une constante de réplication est utilisé qui doit être un nombre non négatif et ne peut pas être X, Z ou toute autre variable. Ce nombre constant est également entouré d'accolades avec l'opérateur de concaténation d'origine et indique le nombre total de fois que l'expression sera répétée.
wire a;
wire [6:0] res;
assign res = {7{a}};
{2'bz{2'b0}} // Illegal to have Z as replication constant
{2'bx{2'b0}} // Illegal to have X as replication constant
Les expressions de réplication ne peuvent pas apparaître sur le côté gauche d'une affectation et ne peuvent pas être connectées à output
ou inout
ports.
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
Notez que a a été répété deux fois et b a été répété trois fois.
Journal de simulationxcelium> run a=10 b=100 res=1010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Les opérandes ne seront évalués qu'une seule fois lorsque l'expression de réplication est exécutée même si la constante est nulle.
Réplication imbriquée
Une expression de réplication peut être utilisée dans des expressions de concaténation régulières. En prenant l'exemple ci-dessus comme base, a et b ont été inclus dans l'expression concaténée 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
Journal de simulation 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;
// This is illegal because variables cannot be used
// as replication constant
$display("a=%b b=%b res=%b", a, b, {_var{a}});
end
endmodule
Cela entraîne une erreur de compilation comme indiqué ci-dessous.
Journal de simulationTop 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