Comment utiliser const dans Verilog
-
27-10-2019 - |
Question
Au lieu d'utiliser
module ... ( .. ) ;
#15
endmodule
Je veux utiliser
module ... ( ... ) ;
// GateDelay is a const, like in c language const int GateDelay = 15 ;
# GateDelay
endmodule
Ou même chose
module ... ( ... ) ;
// assume Wordsize is defined at " define Wordsize 15 "
reg [ Wordsize -1 : 0 ] mem ;
endmodule
Puis-je faire ce souhait en Verilog?
La solution
Vous avez quelques options:
- macros avec
`define
s -
parameter
s -
localparam
s
Voici un petit exemple avec eux tous.
`define CONSTANT_MACRO 1 /* important: no ';' here */
module mymodule
#( parameter WIDTH = 5 )
(
input wire [WIDTH-1:0] in_a,
output wire [WIDTH-1:0] out_a
);
localparam CONSTANT_LOCAL = 2;
assign out_a = in_a + `CONSTANT_MACRO - CONSTANT_LOCAL;
endmodule
Autres conseils
Pour les cas que vous avez énumérés, je recommande paramètres.
Comme la directive du compilateur C, définissez `est globale pour la compilation. Si votre code est toujours va être utilisé avec le code que vous ne contrôlez pas vous devez être prudent ici.
Les paramètres sont toujours à la portée locale de module pour les paramètres dans différents noms identiques éléments de conception ne sont pas en conflit les uns avec les autres. Ils ont aussi l'avantage de pouvoir être surchargée sur une base par exemple.
module #(parameter DATA_WIDTH = 1) busSlave(
input [DATA_WIDTH-1:0] bus_data,
input bus_wr,
...
);
endmodule
module top;
//DATA_WIDTH is 32 in this instance
busSlave #(.DATA_WIDTH(32)) slave32(
.bus_data(data_0),
.bus_wr(wr_0),
...
);
//DATA_WIDTH is 64 in this instance
busSlave #(.DATA_WIDTH(64)) slave64(
.bus_data(data_1),
.bus_wr(wr_1),
...
);
endmodule
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow