Comprendre les ports Verilog : Entrées, sorties et communication de modules
Les ports sont un ensemble de signaux agissant comme entrées/sorties d'un module, moyen principal de communication. Imaginez un module comme une puce fabriquée sur un PCB : la seule communication se fait via ses broches. Les ports sont comme des broches pour envoyer/recevoir signaux du monde extérieur.

Types de ports
| Port | Description |
|---|---|
| Input | Le module ne peut que recevoir des valeurs via ses ports input |
| Output | Le module ne peut que envoyer des valeurs via ses ports output |
| Inout | Le module peut envoyer ou recevoir via ses ports inout |
Les ports sont par défaut considérés comme nets de type wire.
Syntaxe
Ports déclarés inout agissent comme entrée et sortie.
input [net_type] [range] list_of_names; // Port input
inout [net_type] [range] list_of_names; // Port input & output
output [net_type] [range] list_of_names; // Port output piloté par wire
output [var_type] [range] list_of_names; // Port output piloté par variable
Exemple
Trois ports input, un output, un inout :
module my_design (
input wire clk,
input en,
input rw,
inout [15:0] data,
output int
);
// Comportement de la conception en Verilog
endmodule
Illégal d'utiliser le même nom pour plusieurs ports.
input aport; // Première déclaration - valide
input aport; // Erreur - déjà déclaré
output aport; // Erreur - déjà déclaré
Ports signés
L'attribut signed peut être attaché à déclaration de port ou net/reg ou les deux. Nets implicites sont par défaut non signés.
module (input a, b, output c); // a, b, c non signés par défaut
endmodule
Si net/reg a attribut signed, l'autre est aussi considéré signé.
module (input signed a, b, output c);
wire a, b; // a, b signés par déclaration port
reg signed c; // c signé par déclaration reg
endmodule
Variations de ports
Verilog 1995
Version IEEE originale 1995 : déclaration module liste d'abord noms de ports, puis directions définies plus tard dans le corps.
module test (a, b, c);
input [7:0] a; input [7:0] b;
output [7:0] c; // c par défaut wire
wire [7:0] a; wire [7:0] b; wire [7:0] c; // Redéclaration possible
endmodule
module test (a, b, c);
input [7:0] a, b;
output [7:0] c;
reg [7:0] c; // c changé en type reg
endmodule
Verilog 2001 et versions ultérieures
Style de nommage de ports ANSI-C introduit en 2001 : type spécifié dans la liste de ports.
module test (input [7:0] a, b, output [7:0] c); // b considéré input 8-bit
// Contenu conception
endmodule
module test (input wire [7:0] a, input wire [7:0] b, output reg [7:0] c);
// Contenu conception
endmodule
Si déclaration port inclut type net/variable, port considéré complètement déclaré. Illégal de redéclarer même port en déclaration net/variable.
module test (input [7:0] a, output reg [7:0] e);
wire signed [7:0] a; // illégal - déclaration a déjà complète
wire [7:0] e; // illégal - déclaration e déjà complète
endmodule
Si déclaration port n'inclut pas type net/variable, port peut être redéclaré en déclaration net/variable.
module test (input [7:0] a, output [7:0] e);
reg [7:0] e; // OK - net_type non déclaré avant
endmodule
Verilog
- Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
- Maîtriser la concaténation Verilog : Guide pratique
- Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
- Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
- Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
- Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
- Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
- Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace
- Maîtriser Verilog $timeformat : Contrôle de Précision et d'Affichage