Menu
CoddyTech

Paramètres

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 11 sur 90.

Tu peux créer plusieurs copies du même module et les utiliser à différents endroits. C’est ce qu’on appelle des **instances multiples**. Au lieu de réécrire le même code encore et encore, tu l’écris une seule fois et tu le réutilises autant de fois que nécessaire. Chaque instance est une copie distincte de ce matériel sur la puce.

Mais que faire si tu as besoin que chaque copie soit différente ? Par exemple, un compteur de 8 bits, un compteur de 16 bits et un compteur de 32 bits. Sans paramètres, tu devrais écrire trois modules distincts.

Les paramètres résolvent ce problème.

Un paramètre est une valeur constante que tu peux définir lorsque tu crées une instance. Il te permet de configurer chaque copie du module différemment.

Déclarer des paramètres

module counter #(
  parameter WIDTH = 8
)(
  input clk,
  output reg [WIDTH-1:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

Le #(parameter WIDTH = 8) définit un paramètre appelé WIDTH avec une valeur par défaut de 8.

Lors de la déclaration des paramètres, nous utilisons le symbole # juste après le nom du module et avant la liste des ports. # indique à Verilog que ce qui suit est une liste de paramètres qui configurent le module. Si votre module n’a aucun paramètre, omettez simplement entièrement #.

Utilisation des paramètres

Les paramètres peuvent être utilisés partout où une constante est nécessaire :

reg [WIDTH-1:0] data;        // Taille du vecteur
count <= count + 1;           // Fonctionne quelle que soit la largeur
assign out = data[WIDTH-1];   // Position du MSB

Redéfinir les paramètres

Lorsque vous utilisez le module, vous pouvez modifier la valeur du paramètre :

// Largeur par défaut (8 bits)
counter u1 (.clk(clk), .count(count1));

// Définir la largeur à 16 bits
counter #(.WIDTH(16)) u2 (.clk(clk), .count(count2));

Paramètres multiples

Vous pouvez avoir plusieurs paramètres :

module fifo #(
  parameter DEPTH = 16,
  parameter WIDTH = 8
)(
  input clk, wr_en, rd_en,
  input [WIDTH-1:0] data_in,
  output [WIDTH-1:0] data_out
);
  reg [WIDTH-1:0] memory [0:DEPTH-1];
endmodule

Paramètre local

Un localparam est similaire, mais ne peut pas être remplacé de l’extérieur :

module example;
  localparam STATE_IDLE = 2'b00;
  localparam STATE_RUN = 2'b01;
  localparam STATE_STOP = 2'b10;
  // These values are fixed inside this module
endmodule

Utilise localparam pour les constantes qui ne doivent pas changer.

challenge icon

Défi

Ajoute un paramètre appelé WIDTH avec une valeur par défaut de 4.

À faire :

  1. Ajoute un paramètre nommé WIDTH
  2. Définis sa valeur par défaut à 4
  3. Le paramètre se place à l’intérieur de #( ), après le nom du module

Essayez vous-même

module counter #(
  // Ajoutez ici le paramètre WIDTH avec la valeur par défaut 4
  
)(
  input clk,
  input reset,
  output reg [WIDTH-1:0] count
);

endmodule
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Compilateur Verilog en ligne