Portas Verilog
As portas são um conjunto de sinais que atuam como entradas e saídas para um módulo específico e são a principal forma de comunicação com ele. Pense em um módulo como um chip fabricado colocado em um PCB e fica bastante óbvio que a única maneira de se comunicar com o chip é através de seus pinos. As 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 |
---|---|
Entrada | O módulo de design só pode receber valores de fora usando seu input portas |
Saída | O módulo de design só pode enviar valores para o exterior usando seu output portas |
Entrada | O módulo de design pode enviar ou receber valores usando seu inout portas |
As portas são consideradas por padrão como redes do tipo
wire
. Sintaxe
Portas declaradas como
inout
pode 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
input
portas, uma output
porta e um inout
porta.
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 várias portas.
input aport; // First declaration - valid
input aport; // Error - already declared
output aport; // Error - already declared
Portas assinadas
O
signed
O atributo pode ser anexado a uma declaração de porta ou a uma declaração net/reg ou a ambas. As redes implícitas são, por padrão, não assinadas .
module ( input a,
b,
output c);
// ports a, b, and c are by default unsigned
endmodule
Se a declaração net/reg tiver um
signed
atributo, então o outro também será considerado assinado.
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 porta
Verilog 1995
O Verilog passou por algumas revisões e a versão original do IEEE em 1995 tinha a seguinte forma de declaração de porta. Aqui, a declaração do módulo tinha que primeiro listar os nomes das portas dentro dos colchetes e, em seguida, a direção dessas portas definidas posteriormente no 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
module test (a, b, c);
input [7:0] a, b;
output [7:0] c; // By default c is of type wire
// port "c" is changed to a reg type
reg [7:0] c;
endmodule
Verilog 2001 em diante
A nomenclatura de portas no estilo ANSI-C foi introduzida 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 incluir um tipo de rede ou variável, essa porta será considerada completamente declarada. É ilegal redeclarar a mesma porta em uma declaração de tipo de rede ou variável.
module test ( input [7:0] a, // a, e are implicitly declared of type wire
output reg [7:0] e );
wire signed [7:0] a; // illegal - declaration of a is already complete -> simulator dependent
wire [7:0] e; // illegal - declaration of e is already complete
// Rest of the design code
endmodule
Se a declaração de porta não incluir um tipo de rede ou variável, a porta poderá ser declarada em uma declaração de tipo de rede ou variável novamente.
module test ( input [7:0] a,
output [7:0] e);
reg [7:0] e; // Okay - net_type was not declared before
// Rest of the design code
endmodule
Verilog