Modelagem em Nível de Porta: Conectando Esquemas de Hardware a Código Verilog
A maioria dos designs digitais é feita em nível de abstração mais alto como RTL, embora às vezes seja intuitivo construir circuitos determinísticos menores em nível inferior usando elementos combinacionais como and e or. Modelagem nesse nível é chamada modelagem em nível de porta (gate-level modeling) pois envolve portas e tem relação um-para-um entre esquema de hardware e código Verilog.
Verilog suporta portas lógicas básicas chamadas primitivas (primitives) pois podem ser instanciadas como módulos já predefinidos.
Portas And/Or/Xor
Estas primitivas implementam portas AND e OR que aceitam múltiplas entradas escalares e fornecem saída escalar única. O primeiro terminal na lista de argumentos é a saída, atualizada quando qualquer entrada muda.
module gates (
input a, b,
output c, d, e
);
and (c, a, b); // c = saída, a e b = entradas
or (d, a, b); // d = saída, a e b = entradas
xor (e, a, b); // e = saída, a e b = entradas
endmodule
module tb;
reg a, b;
wire c, d, e;
integer i;
gates u0 (.a(a), .b(b), .c(c), .d(d), .e(e));
initial begin
{a, b} = 0;
$monitor ("[T=%0t a=%0b b=%0b c(and)=%0b d(or)=%0b e(xor)=%0b", $time, a, b, c, d, e);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random;
end
end
endmodule
Log de Simulação
ncsim> run [T=0 a=0 b=0 c(and)=0 d(or)=0 e(xor)=0 [T=1 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1 [T=2 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0 [T=4 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1 [T=5 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0 [T=6 a=0 b=1 c(and)=0 d(or)=1 e(xor)=1 [T=7 a=1 b=0 c(and)=0 d(or)=1 e(xor)=1 [T=10 a=1 b=1 c(and)=1 d(or)=1 e(xor)=0 ncsim: *W,RNQUIE: Simulation is complete.
Portas Nand/Nor/Xnor
As inversas das portas acima estão disponíveis como nand, nor e xnor. Mesmo design reutilizado trocando primitivas por suas versões inversas.
module gates (
input a, b,
output c, d, e
);
nand (c, a, b);
nor (d, a, b);
xnor (e, a, b);
endmodule
module tb;
reg a, b;
wire c, d, e;
integer i;
gates u0 (.a(a), .b(b), .c(c), .d(d), .e(e));
initial begin
{a, b} = 0;
$monitor ("[T=%0t a=%0b b=%0b c(nand)=%0b d(nor)=%0b e(xnor)=%0b", $time, a, b, c, d, e);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random;
end
end
endmodule
Log de Simulação
ncsim> run [T=0 a=0 b=0 c(nand)=1 d(nor)=1 e(xnor)=1 [T=1 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0 [T=2 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1 [T=4 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0 [T=5 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1 [T=6 a=0 b=1 c(nand)=1 d(nor)=0 e(xnor)=0 [T=7 a=1 b=0 c(nand)=1 d(nor)=0 e(xnor)=0 [T=10 a=1 b=1 c(nand)=0 d(nor)=0 e(xnor)=1 ncsim: *W,RNQUIE: Simulation is complete.
Estas portas podem ter mais de duas entradas.
module gates (
input a, b, c, d,
output x, y, z
);
and (x, a, b, c, d);
or (y, a, b, c, d);
nor (z, a, b, c, d);
endmodule
module tb;
reg a, b, c, d;
wire x, y, z;
integer i;
gates u0 (.a(a), .b(b), .c(c), .d(d), .x(x), .y(y), .z(z));
initial begin
{a, b, c, d} = 0;
$monitor ("[T=%0t a=%0b b=%0b c=%0b d=%0b x=%0b y=%0b z=%0b", $time, a, b, c, d, x, y, z);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random; b <= $random; c <= $random; d <= $random;
end
end
endmodule
Log de Simulação
ncsim> run [T=0 a=0 b=0 c=0 d=0 x=0 y=0 z=1 [T=1 a=0 b=1 c=1 d=1 x=0 y=1 z=0 [T=2 a=1 b=1 c=1 d=0 x=0 y=1 z=0 [T=3 a=1 b=1 c=0 d=1 x=0 y=1 z=0 [T=4 a=1 b=0 c=1 d=0 x=0 y=1 z=0 [T=5 a=1 b=0 c=1 d=1 x=0 y=1 z=0 [T=6 a=0 b=1 c=0 d=0 x=0 y=1 z=0 [T=7 a=0 b=1 c=0 d=1 x=0 y=1 z=0 [T=8 a=1 b=1 c=1 d=0 x=0 y=1 z=0 [T=9 a=0 b=0 c=0 d=1 x=0 y=1 z=0 [T=10 a=0 b=1 c=1 d=1 x=0 y=1 z=0 ncsim: *W,RNQUIE: Simulation is complete.
Portas Buf/Not
Têm apenas uma entrada escalar e uma ou mais saídas. buf (buffer) transfere valor da entrada para saída sem mudança de polaridade. not (inversor) inverte polaridade: 0 na entrada resulta 1 e vice-versa.
module gates (
input a,
output c, d
);
buf (c, a); // c = saída, a = entrada
not (d, a); // d = saída, a = entrada
endmodule
module tb;
reg a;
wire c, d;
integer i;
gates u0 (.a(a), .c(c), .d(d));
initial begin
a = 0;
$monitor ("[T=%0t a=%0b c(buf)=%0b d(not)=%0b", $time, a, c, d);
for (i = 0; i < 10; i = i+1) begin
#1 a <= $random;
end
end
endmodule
Log de Simulação
xcelium> run [T=0 a=0 c(buf)=0 d(not)=1 [T=2 a=1 c(buf)=1 d(not)=0 [T=8 a=0 c(buf)=0 d(not)=1 [T=9 a=1 c(buf)=1 d(not)=0 xmsim: *W,RNQUIE: Simulation is complete.
O último terminal na lista de portas conecta à entrada da porta; todos os outros conectam à saída. Exemplo de buffer com múltiplas saídas (raro):
module gates (
input a,
output c, d
);
not (c, d, a); // c,d = saídas, a = entrada
endmodule
Log de Simulação
xcelium> run [T=0 a=0 c=1 d=1 [T=2 a=1 c=0 d=0 [T=8 a=0 c=1 d=1 [T=9 a=1 c=0 d=0 xmsim: *W,RNQUIE: Simulation is complete.
Bufif/Notif
Buffers e inversores com sinal de controle adicional para habilitar saída disponíveis via primitivas bufif e notif. Têm saída válida apenas se controle habilitado, senão alta impedância. Duas versões: polaridade normal (1) como bufif1/notif1 e polaridade invertida (0) como bufif0/notif0.
Verilog
- Projeto e Verificação de Circuito Básico de Porta NAND com CI 4011
- Entendendo Transistores de Efeito de Campo de Junção (JFETs): Direção da Corrente de Gate & Canal N vs P
- Circuitos Integrados: Fundamentos de Portas Lógicas Digitais
- Entendendo Escopo de Variáveis em C#: Níveis de Classe, Método e Bloco
- Camadas de Abstração de Projeto: Guia Claro para Arquitetura de Chips
- Design Prático em Nível de Porta Verilog: Portas AND, OR, NOT e Multiplexador 2x1
- Entendendo Atrasos de Porta em Verilog: Timing Preciso para Designs Digitais Confiáveis
- Modelagem Avançada em Nível de Chave (Switch-Level) em Verilog
- Miras de Nivelamento (Level Staffs): Definição, Usos e Tipos
- Nivelamento Preciso de Torno: Guia Profissional