Attributs VHDL utiles
Utiliser 'range, 'length, 'high, 'low et quelques attributs de synthèse sans coder les tailles en dur.
Pourquoi les attributs sont importants
Un attribut permet de demander une information à un type, un signal ou une plage. Les plus utiles évitent de coder les tailles en dur.
signal r_data : std_logic_vector(15 downto 0);
constant c_WIDTH : natural := r_data'length;Si r_data passe de 16 à 32 bits, c_WIDTH suit automatiquement.
Les attributs de plage
| Attribut | Signification |
|---|---|
'length | Nombre d'éléments |
'range | Plage dans le même sens que l'objet |
'reverse_range | Plage dans le sens inverse |
'high | Indice le plus haut |
'low | Indice le plus bas |
'left | Indice écrit à gauche de la déclaration |
'right | Indice écrit à droite de la déclaration |
Exemple :
signal r_data : std_logic_vector(7 downto 0);Pour ce signal :
r_data'lengthvaut8;r_data'highvaut7;r_data'lowvaut0;r_data'rangevaut7 downto 0.
Boucles robustes
Au lieu d'écrire une boucle liée à une taille fixe :
for i in 0 to 7 loop
r_next(i) <= i_data(i);
end loop;utilisez la plage du signal :
for i in i_data'range loop
r_next(i) <= i_data(i);
end loop;Le code reste correct si i_data change de largeur ou si la direction de la plage change.
Conversions et tailles
Les attributs sont aussi utiles pour les conversions.
signal r_count : unsigned(7 downto 0);
signal w_vec : std_logic_vector(7 downto 0);
w_vec <= std_logic_vector(resize(r_count, w_vec'length));Ici, la largeur cible vient de w_vec. On évite donc de répéter 8 dans le code.
rising_edge plutôt que 'event
L'attribut 'event indique qu'un signal a changé de valeur. On peut rencontrer cette écriture :
if i_clk'event and i_clk = '1' then
-- ...
end if;En VHDL moderne, préférez :
if rising_edge(i_clk) then
-- ...
end if;rising_edge exprime directement l'intention et gère mieux les transitions du type std_logic.
Attributs de synthèse
Certains attributs sont interprétés par les outils de synthèse. Ils peuvent aider à guider l'outil, mais ils doivent rester exceptionnels.
attribute keep : string;
attribute keep of w_debug : signal is "true";L'exemple indique à l'outil de conserver un signal intermédiaire. Selon l'outil, le nom exact de l'attribut et les valeurs possibles peuvent varier.
Bonnes pratiques
- Utilisez
'lengthpour les conversions de taille. - Utilisez
'rangepour parcourir un bus. - Préférez
rising_edge(i_clk)à une condition basée sur'event. - Évitez les nombres magiques dans les largeurs de bus.
- Documentez tout attribut de synthèse : il dépend souvent de l'outil.
À retenir
Les attributs rendent le VHDL plus robuste. Ils permettent d'écrire un code qui suit les tailles réelles des signaux au lieu de recopier les mêmes constantes partout.
📝 Tester mes connaissances - Quiz du chapitre