Dominar la concatenación en Verilog: Guía práctica
Wires y variables multi-bit en Verilog pueden agruparse para formar un wire o variable multi-net mayor usando operadores de concatenación { y } separados por comas. La concatenación también permite expresiones y constantes con tamaño como operandos además de wires y variables.
El tamaño de cada operando debe conocerse para calcular el tamaño total de la concatenación.
Ejemplo de concatenación Verilog
wire a, b; // wire 1-bit
wire [1:0] res; // wire 2-bit para guardar a y b
// res[1] sigue a, res[0] sigue b
assign res = {a, b};
wire [2:0] c;
wire [7:0] res1;
// res[0] sigue c[2]
// res[2:1] siempre 0
// res[4:3] sigue c[1:0]
// res[5] sigue a
// res[6] sigue b
assign res1 = {b, a, c[1:0], 2'b00, c[2]};
Ejemplo funcional de concatenación de entradas para formar salidas diferentes. Expresiones concatenadas pueden simplemente mostrarse o asignarse a cualquier wire o variable, no necesariamente salidas.
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
Nota que out2[2:1] es siempre constante 2'b01.
Salida:
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
Operador de Replicación
Cuando la misma expresión debe repetirse varias veces, se usa una constante de replicación que debe ser número no negativo y no puede ser X, Z o variable. Esta constante se encierra entre llaves junto con el operador de concatenación original e indica cuántas veces se repetirá la expresión.
wire a;
wire [6:0] res;
assign res = {7{a}};
{2'bz{2'b0}} // Ilegal: Z como constante replicación
{2'bx{2'b0}} // Ilegal: X como constante replicación
Expresiones de replicación no pueden aparecer en lado izquierdo de asignación ni conectarse a puertos output o 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
Nota que a se repitió dos veces y b tres veces.
Salida:
xcelium> run a=10 b=100 res=1010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Operandos se evalúan solo una vez cuando se ejecuta la expresión de replicación incluso si la constante es cero.
Replicación Anidada
Una expresión de replicación puede usarse dentro de expresiones de concatenación regulares. Tomando el ejemplo anterior como base, a y b se incluyen en la expresión concatenada total.
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
Salida:
xcelium> run a=10 b=100 res=101000001010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Uso ilegal
module des;
reg [1:0] a;
reg [2:0] b;
reg [3:0] _var;
initial begin
a <= 2; b <= 4; _var <= 3;
// Ilegal: variables no pueden usarse como constante replicación
$display("a=%b b=%b res=%b", a, b, {_var{a}});
end
endmodule
Error de compilación:
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
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
- Dominar $timeformat en Verilog: Control de precisión y visualización
- Comprender e imprimir timescales de Verilog en cualquier alcance
- Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar
- Guía para Principiantes de Verilog: Ejemplo Hola Mundo