Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

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
endmodule

Let op: out2[2:1] is altijd een constante 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 

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-constante

Replicatie-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
endmodule

Let op: a wordt twee keer herhaald, b drie keer.

Simulation Log
 xcelium> 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
endmodule

Dit 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

  1. Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
  2. Verilog-toewijzingen begrijpen: types, syntax en best practices
  3. Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
  4. Verilog-functies beheersen voor efficiënt RTL-ontwerp
  5. Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
  6. Verilog Clock Generator: Ontwerp & Implementatie Gids
  7. Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
  8. Verilog $timeformat beheersen: Precisie en Weergave-controle
  9. Verilog Timescales begrijpen en printen in elke Scope
  10. Verilog File I/O onder de knie: Openen, Lezen, Schrijven en Sluiten
  11. Beginner's Guide to Verilog: Hello World Voorbeeld