J'utilise le mot-clé parameter pour définir un état, par exemple RESET = 5'b00000. Si je veux utiliser $ display pour imprimer le nom de l'état au lieu de la représentation binaire, ou afficher le nom de l'état dans ma visionneuse d'ondes de simulation, comment puis-je faire cela? Cela ne fonctionne pas pour essayer de l'imprimer sous forme de chaîne (comme vous vous en doutez), donc je me demande si cela peut être fait.Utilisation du mot-clé de paramètre Verilog
Répondre
Je ne connais pas un moyen de $display
automatiquement le nom d'un parameter
. Toutefois, si vous ne me dérange pas dupliquer votre code, vous pouvez créer un task
(ou function
) pour atteindre votre objectif:
task show_name_state;
case (state)
5'b00000: $display("RESET");
5'b00001: $display("WAIT");
endcase
endtask
$display(state); show_name_state();
Je connais au moins un (coûteux) débogueur Verilog qui a la capacité de reconnaître paramètres et afficher automatiquement leurs noms dans son visualiseur de forme d'onde: l'outil nWave de Verdi (anciennement Debussy) peut le faire.
Il peut y avoir plusieurs paramètres avec la même valeur, donc vous ne pouvez généralement pas passer d'une valeur numérique au nom d'un paramètre avec cette valeur. Les paramètres sont similaires à C #define
s; Bien que vous puissiez les utiliser pour définir un ensemble d'états, il n'existe aucune association formelle entre la variable et la liste des paramètres que vous utilisez pour représenter les états possibles. Parce qu'il n'y avait pas de meilleure option, il était habituel d'utiliser des (mauvais) paramètres de cette façon, mais SystemVerilog a alors introduit un type enum
qui n'a pas les problèmes de la méthode des paramètres. Vous n'avez pas mentionné les outils que vous utilisez, mais en supposant que vos outils prennent en charge les types Enum de SystemVerilog, ce serait un meilleur choix pour une valeur d'état.
Si votre objectif est simplement l'affichage du nom de l'état pendant la simulation, je vais souvent faire quelque chose comme
`ifdef SIMULATION
reg [127:0] __state__;
case (state)
STATE_1 : __state__ = "STATE_1";
STATE_2 : __state__ = "STATE_2";
default : __state__ = "error";
endcase
`endif
Où est l'état du registre d'état qui a le paramètre en question.
Vous pouvez bien sûr remplacer le 5'b00000 dans l'instruction case par le paramètre RESET à la place. – George