Packages et sous-programmes
Organiser le VHDL avec des packages, fonctions et procédures réutilisables.
Pourquoi utiliser un package
Un package sert à regrouper ce qui doit être partagé entre plusieurs fichiers VHDL :
- types personnalisés ;
- constantes communes ;
- sous-types ;
- déclarations de fonctions et procédures ;
- déclarations de composants, si le projet en utilise.
Sans package, on recopie les mêmes définitions dans plusieurs architectures. Cela finit souvent par créer des incohérences.
Déclaration de package
La déclaration du package expose l'interface : ce que les autres fichiers peuvent utiliser.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
package video_pkg is
subtype t_color is unsigned(7 downto 0);
type t_rgb is record
red : t_color;
green : t_color;
blue : t_color;
valid : std_logic;
end record t_rgb;
constant c_RGB_BLACK : t_rgb := (
red => (others => '0'),
green => (others => '0'),
blue => (others => '0'),
valid => '0'
);
function is_valid_pixel(i_pixel : t_rgb) return boolean;
end package video_pkg;Le package ne décrit pas du matériel à lui seul. Il fournit des définitions réutilisables.
Corps de package
Le package body contient l'implémentation des fonctions et procédures déclarées dans le package.
package body video_pkg is
function is_valid_pixel(i_pixel : t_rgb) return boolean is
begin
return i_pixel.valid = '1';
end function is_valid_pixel;
end package body video_pkg;Une constante ou un type peut être entièrement défini dans la déclaration du package. Une fonction déclarée dans le package doit avoir son corps dans le package body.
Utiliser un package
Dans un autre fichier :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library work;
use work.video_pkg.ALL;
entity pixel_gate is
port (
i_pixel : in t_rgb;
o_red : out std_logic_vector(7 downto 0)
);
end entity pixel_gate;
architecture rtl of pixel_gate is
begin
o_red <= std_logic_vector(i_pixel.red) when is_valid_pixel(i_pixel) else x"00";
end architecture rtl;Si un type est utilisé dans les ports d'une entité, il doit être visible avant la déclaration de l'entité. C'est l'un des usages les plus importants des packages.
Fonction
Une fonction calcule une valeur et la retourne. Elle doit rester simple, déterministe et sans attente temporelle.
function parity_even(i_data : std_logic_vector) return std_logic is
variable v_parity : std_logic := '0';
begin
for i in i_data'range loop
v_parity := v_parity xor i_data(i);
end loop;
return v_parity;
end function parity_even;Utilisation :
w_parity <= parity_even(i_data);En RTL, une fonction doit décrire un calcul combinatoire. Elle ne doit pas contenir de wait, de génération d'horloge ou de scénario de test.
Procédure
Une procédure ne retourne pas une valeur unique. Elle peut modifier des paramètres out ou inout. En RTL, on l'utilise surtout pour factoriser de petites séquences combinatoires. En testbench, elle sert souvent à appliquer des stimuli.
procedure drive_byte(
signal o_bus : out std_logic_vector(7 downto 0);
constant i_value : in natural
) is
begin
o_bus <= std_logic_vector(to_unsigned(i_value, o_bus'length));
end procedure drive_byte;Utilisation en testbench :
drive_byte(w_data, 16#A5#);
wait until rising_edge(i_clk);Fonction ou procédure
| Besoin | Choix |
|---|---|
| Calculer une valeur | Fonction |
| Factoriser une vérification de testbench | Procédure |
| Modifier plusieurs sorties | Procédure |
| Partager des types et constantes | Package |
Bonnes pratiques
- Mettez les types partagés dans un package clair et court.
- Gardez les fonctions RTL sans
waitet sans effet de bord. - Utilisez des noms explicites :
video_pkg,spi_pkg,test_utils_pkg. - Évitez les packages fourre-tout qui mélangent types, testbench, constantes projet et composants sans logique.
- Importez seulement les packages nécessaires dans chaque fichier.
À retenir
Un package améliore la cohérence du projet. Une fonction exprime un calcul. Une procédure factorise une action. Ensemble, ils permettent d'écrire du VHDL plus maintenable sans rendre le design plus complexe.
📝 Tester mes connaissances - Quiz du chapitre