Pipelining
Découper un calcul en étages enregistrés pour augmenter le débit d'un circuit FPGA.
Idée générale
Le pipeline consiste à séparer un chemin combinatoire long en plusieurs étages, puis à placer des registres entre ces étages.
Sans pipeline, une donnée traverse toute la logique avant d'être capturée. Avec pipeline, plusieurs données avancent en même temps, chacune dans un étage différent. Le circuit ne donne pas le premier résultat plus vite, mais il peut produire des résultats plus souvent une fois le pipeline rempli.

Latence et débit
Deux notions sont à distinguer :
| Notion | Sens |
|---|---|
| Latence | Temps entre l'entrée d'une donnée et sa sortie |
| Débit | Nombre de résultats produits par unité de temps |
Ajouter un pipeline augmente souvent la latence en cycles. En revanche, le chemin critique de chaque cycle devient plus court, donc la fréquence maximale peut augmenter.
Exemple avec 4 étages :
- sans pipeline : 1 donnée doit traverser les 4 calculs avant la sortie ;
- avec pipeline : après le remplissage, 1 résultat peut sortir à chaque cycle ;
- la première donnée sort après plusieurs cycles, les suivantes sortent cadencées.

Chemin critique
La période d'horloge doit couvrir le pire étage :
Tclk >= Tmax_etage + Tsetup + TcqTsetup et Tcq sont les coûts des registres. Un pipeline très profond n'est donc pas toujours meilleur : si les étages deviennent trop petits, le coût des registres domine.
Un bon pipeline cherche surtout à équilibrer les étages. Si un étage prend 40 ns et les autres 15 ns, la fréquence reste limitée par les 40 ns. Il faut déplacer ou réorganiser la logique pour obtenir des étages proches.
Exemple VHDL
Calcul non pipeline :
o_y <= std_logic_vector(unsigned(i_a) * unsigned(i_b) + unsigned(i_c));Calcul pipeline sur deux cycles :
P_PIPE : process(i_clk)
begin
if rising_edge(i_clk) then
if i_rst = '1' then
r_mul <= (others => '0');
o_y <= (others => '0');
else
r_mul <= unsigned(i_a) * unsigned(i_b);
o_y <= std_logic_vector(r_mul + unsigned(i_c));
end if;
end if;
end process P_PIPE;Le registre r_mul coupe le chemin critique entre multiplication et addition. La sortie correspond aux entrées d'un cycle précédent : il faut toujours vérifier la latence dans le testbench.
Points à retenir
- Le pipeline augmente le débit, pas forcément la latence d'une donnée.
- Chaque registre ajoute un coût de timing et de surface.
- Les signaux qui appartiennent à la même donnée doivent avancer ensemble dans les registres.
- Un testbench doit vérifier le décalage temporel entre entrée et sortie.
📝 Tester mes connaissances - Quiz du chapitre