Notions avancées de VHDL
Distinguer élaboration, simulation et synthèse, puis aborder CDC, latence et généricité avancée.
Pourquoi ce chapitre
À ce stade, le plus important n'est pas d'empiler de nouvelles syntaxes. C'est de comprendre quand une instruction agit :
- à l'élaboration du design ;
- pendant la simulation ;
- ou dans le matériel synthétisé.
Les chapitres suivants détaillent les fonctions IEEE, generate, fixed_pkg, les packages et les attributs. Ici, on garde une vue d'ensemble pour éviter les confusions.
Élaboration, simulation, synthèse
| Phase | Rôle | Exemple |
|---|---|---|
| Élaboration | Construire la hiérarchie avant simulation/synthèse | generic, generate |
| Simulation | Exécuter le modèle dans le simulateur | wait for, assert, fichiers |
| Synthèse | Transformer le RTL en registres, LUT, DSP, BRAM | process, signaux, opérateurs |
Un for ... generate ne boucle pas à l'exécution. Il crée des blocs matériels au moment de l'élaboration.
g_regs : for i in 0 to g_WIDTH - 1 generate
U_FF : entity work.dff
port map (
i_clk => i_clk,
i_d => i_d(i),
o_q => o_q(i)
);
end generate g_regs;Si g_WIDTH = 8, le design contient 8 instances. Ce n'est pas une boucle logicielle dans le FPGA.
Synthétisable ou testbench
Tout ce qui est valide en VHDL n'est pas forcément synthétisable.
| Construct | Usage conseillé |
|---|---|
wait for 10 ns | Testbench |
file, textio, hread | Testbench |
real comme signal | Simulation, pas RTL |
assert simple | RTL possible, surtout vérification/simulation |
rising_edge(i_clk) | RTL synchrone |
process(i_clk) | RTL synchrone |
La règle pratique : si le code décrit une durée absolue, un fichier ou un scénario, il appartient probablement au testbench.
Généricité avancée
Les generic classiques paramètrent une largeur, une profondeur ou une option. VHDL-2008 permet aussi des formes plus avancées, comme les types génériques.
entity delay_line is
generic (
type t_DATA;
g_DEPTH : positive := 4
);
port (
i_clk : in std_logic;
i_d : in t_DATA;
o_q : out t_DATA
);
end entity delay_line;L'idée est de rendre un bloc indépendant du type de donnée transporté. C'est puissant pour des bibliothèques internes, mais le support exact dépend des outils. Pour débuter, gardez d'abord les generic simples : largeur, profondeur, option booléenne.
Traversée de domaines d'horloge
Un signal qui passe d'une horloge à une autre peut devenir métastable. Pour un signal 1 bit lent, l'idiome minimal est un synchroniseur à deux bascules dans le domaine destination.
process(i_clk_dst)
begin
if rising_edge(i_clk_dst) then
r_meta <= i_async;
r_sync <= r_meta;
end if;
end process;Pour un bus, ce n'est pas suffisant. Il faut un protocole de handshake, une FIFO asynchrone ou un mécanisme équivalent. Synchroniser chaque bit séparément peut produire un mot incohérent.
Latence et contrat d'interface
Un design avancé a souvent de la latence : pipeline, FIFO, filtre, calcul itératif. Cette latence doit faire partie du contrat.
-- Exemple : i_valid entre au cycle N.
-- o_valid doit sortir au cycle N+3 avec la donnée correspondante.Le testbench doit vérifier :
- la valeur ;
- le cycle où elle devient valide ;
- le comportement pendant le reset ;
- les cycles où
i_valid = '0'.
Un pipeline plus rapide n'est pas utile si la sortie n'est plus alignée avec son signal de validité.
Garder le bon niveau d'abstraction
Les notions avancées ne rendent pas un design meilleur automatiquement. Elles sont utiles si elles clarifient le contrat ou réduisent une duplication réelle.
- Utilisez
generatepour les structures répétées. - Utilisez un package pour les types partagés.
- Utilisez les attributs pour éviter les tailles codées en dur.
- Utilisez un pipeline quand le chemin critique est trop long.
- Évitez de cacher une logique simple derrière trop d'abstraction.
À retenir
| Sujet | Question à se poser |
|---|---|
generate | Est-ce une structure matérielle répétée ? |
| Testbench | Est-ce un scénario de simulation ? |
| CDC | Le signal change-t-il de domaine d'horloge ? |
| Pipeline | Quelle est la latence exacte ? |
| Généricité | Est-ce réellement réutilisable ? |
Le VHDL avancé consiste surtout à écrire un design dont le comportement, la latence et les limites sont explicites.
📝 Tester mes connaissances - Quiz du chapitre