Entendendo Portas Verilog: Entradas, Saídas e Comunicação de Módulos
Portas são um conjunto de sinais que atuam como entradas e saídas para um módulo particular e são a maneira primária de se comunicar com ele. Pense em um módulo como um chip fabricado colocado em uma PCB e fica óbvio que a única maneira de se comunicar com o chip é através de seus pinos. Portas são como pinos e são usadas pelo projeto para enviar e receber sinais do mundo exterior.
Tipos de Portas
| Porta | Descrição |
|---|---|
| Input | O módulo de projeto pode apenas receber valores de fora usando suas portas input |
| Output | O módulo de projeto pode apenas enviar valores para fora usando suas portas output |
| Inout | O módulo de projeto pode tanto enviar quanto receber valores usando suas portas inout |
wire.Sintaxe
Portas declaradas como inout podem atuar como entrada e saída.
input [net_type] [range] list_of_names; // Input port
inout [net_type] [range] list_of_names; // Input & Output port
output [net_type] [range] list_of_names; // Output port driven by a wire
output [var_type] [range] list_of_names; // Output port driven by a variable
Exemplo
No código mostrado abaixo, existem três portas input, uma porta output e uma porta inout.
module my_design (
input wire clk, input en, input rw,
inout [15:0] data, output int
);
// Design behavior as Verilog code
endmodule
É ilegal usar o mesmo nome para múltiplas portas.
input aport; // First declaration - valid
input aport; // Error - already declared
output aport; // Error - already declared
Portas Signed
O atributo signed pode ser anexado a uma declaração de porta ou uma declaração net/reg ou ambas. Nets implícitas são por padrão unsigned.
module (input a, b, output c); // ports a, b, and c are by default unsigned
endmodule
Se a declaração net/reg tem um atributo signed, então a outra também será considerada signed.
module (input signed a, b, output c);
wire a, b; // a, b are signed from port declaration
reg signed c; // c is signed from reg declaration
endmodule
Variações de Portas
Verilog 1995
Verilog passou por algumas revisões e a versão original IEEE em 1995 tinha a seguinte forma para declaração de porta. Aqui, a declaração do módulo tinha que primeiro listar os nomes das portas dentro dos parênteses e depois a direção daquelas portas definida depois dentro do corpo do módulo.
module test (a, b, c);
input [7:0] a; // inputs "a" and "b" are wires
input [7:0] b;
output [7:0] c; // output "c" by default is a wire
// Still, you can declare them again as wires to avoid confusion
wire [7:0] a; wire [7:0] b; wire [7:0] c;
endmodule
Verilog 2001 em diante
Estilo de nomeação de portas ANSI-C foi introduzido em 2001 e permitiu que o tipo fosse especificado dentro da lista de portas.
module test (
input [7:0] a, b, // "b" is considered an 8-bit input
output [7:0] c
);
// Design content
endmodule
module test (
input wire [7:0] a, input wire [7:0] b, output reg [7:0] c
);
// Design content
endmodule
Se uma declaração de porta inclui um tipo net ou variável, então aquela porta é considerada completamente declarada. É ilegal redeclarar a mesma porta em uma declaração de tipo net ou variável.
Verilog
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Dominando Concatenação Verilog: Guia Prático
- 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