Verilog-aaneenschakeling
Multi-bit Verilog-draden en -variabelen kunnen met behulp van aaneenschakeling worden samengevoegd om een grotere multi-netdraad of variabele te vormen operators {
en }
gescheiden door comma's. Aaneenschakeling mag naast draden en variabelen ook uitdrukkingen en grootteconstanten als operanden hebben.
De grootte van elke operand moet bekend zijn om de volledige grootte van de aaneenschakeling te berekenen.
Verilog-aaneenschakelingsvoorbeeld
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]};
Hier is een werkend ontwerpvoorbeeld van aaneenschakeling van inputs om verschillende outputs te vormen. Aaneengeschakelde uitdrukkingen kunnen eenvoudig worden weergegeven of toegewezen aan elke draad of variabele, niet noodzakelijkerwijs uitgangen.
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
Merk op dat out2[2:1] altijd een constante 2'b01 is.
Simulatielogboekxcelium> 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
Replicatie-operator
Als dezelfde uitdrukking een aantal keren moet worden herhaald, wordt een replicatieconstante wordt gebruikt die een niet-negatief getal moet zijn en niet X, Z of een variabele mag zijn. Dit constante getal staat ook tussen haakjes, samen met de oorspronkelijke aaneenschakelingsoperator en geeft het totale aantal keren aan dat de uitdrukking wordt herhaald.
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
Replicatie-expressies kunnen niet aan de linkerkant van een opdracht worden weergegeven en kunnen niet worden gekoppeld aan output
of inout
poorten.
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
Merk op dat a tweemaal werd herhaald en b driemaal werd herhaald.
Simulatielogboekxcelium> run a=10 b=100 res=1010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Operanden worden slechts één keer geëvalueerd wanneer de replicatie-expressie wordt uitgevoerd, zelfs als de constante nul is.
Geneste replicatie
Een replicatie-expressie mag worden gebruikt binnen reguliere aaneenschakelingsexpressies. Als we het bovenstaande voorbeeld als basis nemen, zijn a en b opgenomen in de totale aaneengeschakelde uitdrukking.
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
Simulatielogboek xcelium> run a=10 b=100 res=101000001010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Illegaal gebruik
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
Dit resulteert in een compilatiefout zoals hieronder weergegeven.
SimulatielogboekTop 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