Verilog - Dans une coquille de noix
Tout le code comportemental est écrit dans module
et endmodule
. Ainsi, quel que soit le design numérique que vous avez l'intention de créer, il ira à l'intérieur d'un module
bloquer. Il peut ou non avoir des ports définis - autoriser les signaux à entrer dans le bloc en tant que input
ou échapper le bloc comme output
.
Module
Le module vide dans l'exemple ci-dessous s'appelle testbench . Vous pouvez le nommer comme vous le souhaitez, sauf qu'il doit être alphanumérique et peut contenir '_'.
module testbench;
endmodule
Regardons un autre module. Il a quelques signaux (d, clk, rstb ) déclarés comme entrées et q déclaré comme sortie.
module dff (input d,
clk,
rstb,
output q);
endmodule
Types de données
Maintenant que nous avons vu à quoi ressemble un module, voyons ce qui peut être mis à l'intérieur d'un module, en regardant à nouveau le module testbench. Il existe principalement deux types de types de données dans verilog :
- reg
- fil
reg
le type de données est utilisé pour conserver des valeurs comme une variable, tandis qu'un wire
est juste analogue à un fil électrique, qui doit être entraîné en continu. Donc typiquement wire
est utilisé pour se connecter entre plusieurs modules et d'autres signaux.
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
Devoirs
Verilog a trois blocs de base :
always @ (état ) | toujours exécuté lorsque la condition est satisfaite |
initial | sera exécuté une seule fois, au début de la simulation |
assign [LHS] =[RHS] | La valeur de LHS sera mise à jour chaque fois que RHS change |
Il y a quelques règles à garder à l'esprit lors de l'écriture de Verilog :
reg
ne peut être attribué qu'eninitial
etalways
blocswire
peut se voir attribuer une valeur uniquement viaassign
déclaration- S'il y a plusieurs déclarations dans un initial/always bloc, ils doivent être enveloppés dans
begin .. end
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
initial begin
d = 0;
rst_b = 0;
clk = 0;
#100 $finish;
end
always begin
#10 clk = ~clk;
end
endmodule
Remarque ce qui suit à partir de l'exemple ci-dessus :
- Puisqu'il y a plusieurs lignes pour
initial
bloquer, commencer et fin sont utilisés - Les signaux d, rst_b et clk sont affectés dans un bloc initial, car ils sont de type
reg
- Le code à l'intérieur du bloc initial sera exécuté à 0ns, c'est-à-dire au début de la simulation
- Puisqu'il n'y a pas de condition pour le
always
bloc, il fonctionnera comme une boucle infinie en C - # est utilisé pour représenter la temporisation. #10 indique au simulateur d'avancer le temps de simulation de 10 unités.
clk = ~clk;
va basculer la valeur de l'horloge, et parce que #10 est mis avant l'instruction, l'horloge sera basculée toutes les 10 unités de temps.$finish
est le moyen de terminer une simulation. Dans ce cas, il s'exécutera pendant 100 unités de temps et se terminera.
Verilog