Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Paramètres Verilog

Les paramètres sont des constructions Verilog qui permettent à un module d'être réutilisé avec une spécification différente. Par exemple, un additionneur 4 bits peut être paramétré pour accepter une valeur pour le nombre de bits et de nouvelles valeurs de paramètre peuvent être transmises lors de l'instanciation du module. Ainsi, un additionneur N bits peut devenir un additionneur 4 bits, 8 bits ou 16 bits. Ils sont comme des arguments à une fonction qui sont passés lors d'un appel de fonction.

  
  
	parameter MSB = 7;                  // MSB is a parameter with a constant value 7
	parameter REAL = 4.5;               // REAL holds a real number
	
	parameter FIFO_DEPTH = 256, 
	          MAX_WIDTH = 32;           // Declares two parameters
	          
	parameter [7:0] f_const = 2'b3;     // 2 bit value is converted to 8 bits; 8'b3

  

Les paramètres sont essentiellement des constantes et il est donc illégal de modifier leur valeur au moment de l'exécution. Il est illégal de redéclarer un nom déjà utilisé par un réseau, une variable ou un autre paramètre.

Il existe deux principaux types de paramètres, module et spécifiez et les deux acceptent une spécification de plage. Mais, ils sont normalement rendus aussi larges que la valeur à stocker l'exige et, par conséquent, une spécification de plage n'est pas nécessaire.

Paramètres des modules

Les paramètres de module peuvent être utilisés pour remplacer les définitions de paramètres dans un module, ce qui fait que le module a un ensemble de paramètres différent au moment de la compilation. Un paramètre peut être modifié avec le defparam instruction ou dans l'instruction d'instance de module. Il est courant d'utiliser des lettres majuscules dans les noms des paramètres pour les rendre immédiatement visibles.

Le module illustré ci-dessous utilise des paramètres pour spécifier la largeur du bus, la largeur des données et la profondeur du FIFO dans la conception, et peut être remplacé par de nouvelles valeurs lorsque le module est instancié ou en utilisant defparam déclarations.

  
  
	// Verilog 1995 style port declaration
	module design_ip  ( addr,  
	                    wdata,
	                    write,
	                    sel,
	                    rdata);
	                    
	     parameter  BUS_WIDTH    = 32, 
	                DATA_WIDTH   = 64,
	                FIFO_DEPTH   = 512;
	                
	     input addr;
	     input wdata;
	     input write;
	     input sel;
	     output rdata;
	     
	     wire [BUS_WIDTH-1:0] addr;
	     wire [DATA_WIDTH-1:0] wdata;
	     reg  [DATA_WIDTH-1:0] rdata;
	     
	     reg [7:0] fifo [FIFO_DEPTH];
	                
	     // Design code goes here ...
	endmodule

  

Dans le nouveau style ANSI de déclaration de port Verilog, vous pouvez déclarer des paramètres comme indiqué ci-dessous.

  
  
module design_ip 
	#(parameter BUS_WIDTH=32, 
		parameter DATA_WIDTH=64) (	
		
		input [BUS_WIDTH-1:0] addr,
   	// Other port declarations
   );

  

Remplacer les paramètres

Les paramètres peuvent être remplacés par de nouvelles valeurs lors de l'instanciation du module. La première partie instancie le module appelé design_ip par le nom d0 où de nouveaux paramètres sont passés dans #( ) . La deuxième partie utilise une construction Verilog appelée defparam pour définir les nouvelles valeurs des paramètres. La première méthode est la méthode la plus couramment utilisée pour transmettre de nouveaux paramètres dans les conceptions RTL. La deuxième méthode est couramment utilisée dans les simulations de banc d'essai pour mettre à jour rapidement les paramètres de conception sans avoir à réinstancier le module.

  
  
module tb;
	
	  // Module instantiation override
		design_ip  #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]);
		
		// Use of defparam to override
		defparam d0.FIFO_DEPTH = 128;
		
endmodule

  

Exemple

Le compteur du module a deux paramètres N et DOWN déclarés pour avoir une valeur par défaut de 2 et 0 respectivement. N contrôle le nombre de bits dans la sortie contrôlant effectivement la largeur du compteur. Par défaut, il s'agit d'un compteur 2 bits. Le paramètre DOWN contrôle si le compteur doit incrémenter ou décrémenter. Par défaut, le compteur décrémentera car le paramètre est mis à 0.

Compteur progressif 2 bits

  
  
module counter
  #( 	parameter N = 2,
   		parameter DOWN = 0)
   		
  ( input 							clk,
    input 							rstn,
    input 							en,
   	output 	reg [N-1:0] out);
  
  always @ (posedge clk) begin
    if (!rstn) begin
      out <= 0;
    end else begin
      if (en)
        if (DOWN)
          out <= out - 1;
        else
          	out <= out + 1;
      else
         out <= out;     
    end
  end
endmodule

  

Le compteur de module est instancié avec N comme 2 même s'il n'est pas requis car la valeur par défaut est de toute façon 2. DOWN n'est pas transmis lors de l'instanciation du module et prend donc la valeur par défaut de 0, ce qui en fait un compteur.

  
  
module design_top (    input clk,
                input rstn,
                input en,
                output [1:0] out);

    counter #(.N(2)) u0 (	.clk(clk),
                          .rstn(rstn),
                          .en(en));
endmodule

  

Voir que les paramètres par défaut sont utilisés pour implémenter le compteur où N est égal à deux, ce qui en fait un compteur 2 bits et DOWN est égal à zéro, ce qui en fait un compteur. La sortie du compteur est laissée non connectée au niveau supérieur.

Décompteur 4 bits

Dans ce cas, le compteur de module est instancié avec N comme 4, ce qui en fait un compteur 4 bits. DOWN reçoit la valeur 1 lors de l'instanciation du module et donc un décompteur est implémenté.

  
  
module design_top (    input clk,
                input rstn,
                input en,
                output [3:0] out);

    counter #(.N(4), .DOWN(1)) 
    		u1 (	.clk(clk),
              .rstn(rstn),
              .en(en));
endmodule

  

Spécifier les paramètres

Ceux-ci sont principalement utilisés pour fournir des valeurs de temporisation et de retard et sont déclarés à l'aide du specparam mot-clé. Il est autorisé à être utilisé à la fois dans le specify bloc et le corps du module principal.

  
  
	// Use of specify block
	specify
		specparam  t_rise = 200, t_fall = 150;
		specparam  clk_to_q = 70, d_to_q = 100;
	endspecify
	
	// Within main module
	module  my_block ( ... );
	 	specparam  dhold = 2.0;
	 	specparam  ddly  = 1.5;
	 	
	 	parameter  WIDTH = 32;
	endmodule

  

Différence entre les paramètres de spécification et de module

Spécifiez le paramètre Paramètre de module
Déclaré par specparam Déclaré par parameter
Peut être déclaré dans specify bloc ou dans le module principal Ne peut être déclaré que dans le module principal
Peut se voir attribuer des specparams et des paramètres Ne peut pas recevoir de specparams
SDF peut être utilisé pour remplacer les valeurs Valeurs des paramètres de déclaration d'instance ou defparam peut être utilisé pour remplacer

Verilog

  1. Tutoriel Verilog
  2. Concaténation Verilog
  3. Verilog - Dans une coquille de noix
  4. Affectations Verilog
  5. Verilog bloquant et non bloquant
  6. Fonctions Verilog
  7. Tâche Verilog
  8. Portée de référence hiérarchique Verilog
  9. Générateur d'horloge Verilog