Verilog concatenatie beheersen: Een praktische gids
Multi-bit Verilog draden en variabelen kunnen samengevoegd worden tot een grotere multi-net draad of variabele met concatenatie operatoren { en } gescheiden door komma's. Concatenatie mag ook expressies en gespecificeerde constanten als operanden bevatten naast draden en variabelen.
De grootte van elk operand moet bekend zijn om de totale grootte van de concatenatie te berekenen.
Verilog Concatenatie Voorbeeld
wire a, b; // 1-bit wire
wire [1:0] res; // 2-bit wire om a en b op te slaan
// res[1] volgt a, res[0] volgt b
assign res = {a, b};
wire [2:0] c;
wire [7:0] res1;
// res[0] volgt c[2]
// res[2:1] is altijd 0
// res[4:3] volgt c[1:0]
// res[5] volgt a
// res[6] volgt b
assign res1 = {b, a, c[1:0], 2'b00, c[2]};Hier is een werkend ontwerpvoorbeeld van concatenatie van invoers om verschillende uitgangen te vormen. Geconcateerde expressies kunnen simpel getoond of toegewezen worden aan elke draad of variabele, niet noodzakelijk 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
endmoduleLet op: out2[2:1] is altijd een constante 2'b01.
Simulation Logxcelium> 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
Wanneer dezelfde expressie herhaald moet worden voor een aantal keren, wordt een replicatie-constante gebruikt die een niet-negatief getal moet zijn en geen X, Z of variabele mag zijn. Deze constante wordt ook binnen accolades geplaatst naast de oorspronkelijke concatenatie-operator en geeft het totale aantal herhalingen aan.
wire a; wire [6:0] res;
assign res = {7{a}};
{2'bz{2'b0}} // Illegaal: Z als replicatie-constante
{2'bx{2'b0}} // Illegaal: X als replicatie-constanteReplicatie-expressies mogen niet aan de linkerkant van een toewijzing staan en niet verbonden worden met 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
endmoduleLet op: a wordt twee keer herhaald, b drie keer.
Simulation Logxcelium> run a=10 b=100 res=1010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Operanden worden slechts één keer geëvalueerd wanneer de replicatie-expressie uitgevoerd wordt, zelfs als de constante nul is.
Geneste replicatie
Een replicatie-expressie mag binnen reguliere concatenatie-expressies gebruikt worden. Op basis van het bovenstaande voorbeeld zijn a en b opgenomen in de totale geconcateerde expressie.
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.
Illegaal gebruik
module des;
reg [1:0] a; reg [2:0] b; reg [3:0] _var;
initial begin
a <= 2; b <= 4; _var <= 3;
// Illegaal: variabelen mogen niet als replicatie-constante gebruikt worden
$display("a=%b b=%b res=%b", a, b, {_var{a}});
end
endmoduleDit resulteert in een compilatiefout:
Simulation Log 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
- Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
- Verilog-toewijzingen begrijpen: types, syntax en best practices
- Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
- Verilog-functies beheersen voor efficiënt RTL-ontwerp
- Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
- Verilog Clock Generator: Ontwerp & Implementatie Gids
- Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
- Verilog $timeformat beheersen: Precisie en Weergave-controle
- Verilog Timescales begrijpen en printen in elke Scope
- Verilog File I/O onder de knie: Openen, Lezen, Schrijven en Sluiten
- Beginner's Guide to Verilog: Hello World Voorbeeld