Concatenación Verilog
Los cables Verilog de varios bits y las variables se pueden agrupar para formar un cable o variable multired más grande mediante concatenación operadores {
y }
separado por comas. También se permite la concatenación para tener expresiones y constantes de tamaño como operandos además de cables y variables.
Se debe conocer el tamaño de cada operando para calcular el tamaño completo de la concatenación.
Ejemplo de concatenación de 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]};
Aquí hay un ejemplo de diseño funcional de concatenación de entradas para formar diferentes salidas. Las expresiones concatenadas se pueden mostrar o asignar simplemente a cualquier cable o variable, no necesariamente a las 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
Tenga en cuenta que out2[2:1] siempre es una constante 2'b01.
Registro de simulaciónxcelium> 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 tiene que repetirse varias veces, una constante de replicación se utiliza, que debe ser un número no negativo y no puede ser X, Z ni ninguna variable. Este número constante también está encerrado entre llaves junto con el operador de concatenación original e indica el número total de veces que se repetirá la expresión.
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
Las expresiones de replicación no pueden aparecer en el lado izquierdo de ninguna tarea y no pueden conectarse a output
o inout
puertos
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
Tenga en cuenta que a se repitió dos veces y b se repitió tres veces.
Registro de simulaciónxcelium> run a=10 b=100 res=1010100100100 xmsim: *W,RNQUIE: Simulation is complete.
Los operandos se evaluarán solo una vez cuando se ejecute la expresión de replicación incluso si la constante es cero.
Replicación anidada
Se permite usar una expresión de replicación dentro de expresiones de concatenación regulares. Tomando como base el ejemplo anterior, a y b se han incluido 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
Registro de simulación 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;
// This is illegal because variables cannot be used
// as replication constant
$display("a=%b b=%b res=%b", a, b, {_var{a}});
end
endmodule
Esto da como resultado un error de compilación como se muestra a continuación.
Registro de simulaciónTop 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
- Tutorial de Verilog
- Asignaciones de Verilog
- Bloqueo y no bloqueo de Verilog
- Funciones de Verilog
- Tarea Verilog
- Generador de reloj Verilog
- Funciones matemáticas de Verilog
- Formato de hora de Verilog
- Alcance de la escala de tiempo de Verilog
- Operaciones de E/S de archivos de Verilog
- Verilog Hola Mundo