Dominando Concatenação Verilog: Guia Prático
Wires e variáveis Verilog multi-bit podem ser agrupados para formar um wire ou variável multi-net maior usando operadores de concatenação { e } separados por vírgulas. Concatenação também permite ter expressões e constantes com tamanho como operandos além de wires e variáveis.
Tamanho de cada operando deve ser conhecido para calcular o tamanho completo da concatenação.
Exemplo de Concatenação 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]};
Aqui está um exemplo de design funcional de concatenação de entradas para formar diferentes saídas. Expressões concatenadas podem ser simplesmente exibidas ou atribuídas a qualquer wire ou variável, não necessariamente saídas.
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
Note que out2[2:1] é sempre uma constante 2'b01.
Operador de Replicação
Quando a mesma expressão tem que ser repetida por um número de vezes, uma constante de replicação é usada que precisa ser um número não-negativo e não pode ser X, Z ou qualquer variável. Este número constante também é delimitado por chaves junto com o operador de concatenação original e indica o número total de vezes que a expressão será repetida.
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
Expressões de replicação não podem aparecer no lado esquerdo de qualquer atribuição e não podem ser conectadas a portas output ou inout.
Replicação Aninhada
Uma expressão de replicação é permitida ser usada dentro de expressões de concatenação regulares.
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
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
Verilog
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
- Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
- Dominando Funções em Verilog para Design RTL Eficiente
- Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
- Gerador de Clock Verilog: Guia de Design e Implementação
- Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente
- Dominando $timeformat do Verilog: Precisão e Controle de Exibição
- Entendendo e Imprimindo Timescales do Verilog em Qualquer Escopo
- Dominando I/O de Arquivos em Verilog: Abrir, Ler, Escrever e Fechar