Différence entre "paramètre" et "localparam"
j'écris un projet avec Verilog et je veux utiliser parameter
pour définir un paramètre dans mon module. Mais quand j'ai lu dans certains code source, localparam
parfois est utilisé au lieu de parameter
.
Quelle est la différence entre eux?
2 réponses
en général, l'idée derrière le localparam
(ajouté à la norme Verilog-2001) est de protéger la valeur de localparam
d'une redéfinition accidentelle ou incorrecte par un utilisateur final (contrairement à un parameter
valeur, cette valeur ne peut pas être modifiée par une redéfinition des paramètres ou par un defparam
déclaration).
basé sur IEEE 1364-2005 (ch. 4.10.2):
Verilog les paramètres locaux HDL sont identiques aux paramètres sauf qu'ils ne peuvent pas être modifiés directement par defparam les instructions ou le module attribuent les valeurs des paramètres. Les paramètres locaux peuvent se voir attribuer des expressions constantes contenant des paramètres, qui peuvent être modifiés avec des instructions defparam ou des attributions de valeurs de paramètres d'instance de module.
de plus, dans SystemVerilog ( IEEE 1800-2012(ch. 6.20.4)):
Contrairement aux paramètres non locaux, les paramètres locaux peuvent être déclarés dans un bloc de génération, un paquet, un corps de classe ou une unité de compilation. portée. Dans ces contextes, le paramètre mot-clé sera un synonyme du mot-clé localparam.
Les paramètres locaux peuvent être déclarés dans la liste parameter_port_list d'un module. Toute déclaration de paramètre apparaissant dans une telle liste entre un mot-clé localparam et le mot-clé suivant (ou la fin de la liste, s'il n'y a pas de mot-clé suivant) doit être un paramètre local. Toute autre déclaration de paramètre dans une telle liste est un paramètre non local qui peut être remplacer.
si vous voulez en savoir plus sur ce sujet, je vous recommande Clifford E. Cummings papier "Nouveau Verilog-2001 les Techniques de Création de Modèles Paramétrés (ou vers le Bas Avec " définir et la Mort d'un defparam!)".
exemple Minimal
Voici un exemple de ce Qiu mentionné.
dans une mémoire vive, la taille de la mémoire est fonction de la taille des mots et des adresses.
donc si le module parent spécifie la taille du mot et de l'adresse, il ne devrait pas être en mesure de spécifier la taille de la mémoire.
module myram #(
parameter WORD_SIZE = 1,
parameter ADDR_SIZE = 1
) (
input wire [ADDR_SIZE-1:0] addr,
inout wire [WORD_SIZE-1:0] data,
// ...
);
localparam MEM_SIZE = WORD_SIZE * (1 << ADDR_SIZE);
// Use MEM_SIZE several times in block.
...
Et sur le module parent, c'est très bien:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2)
) top (
/* wires */
)
mais ce devrait une erreur:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2),
.MEM_SIZE(2)
) top (
/* wires */
)
iverilog
ne pas échouer, et je crois que c'est un bug: https://github.com/steveicarus/iverilog/issues/157
Incisive donne une erreur comme prévu.