Synthèse VHDL
La Synthèse ?
´ La synthèse est l’opération qui consiste, à partir du fichier texte, à produire
la netlist contenant le schéma électrique destiné aux outils de placement
routage (fichier au format NGC).
´ Cette étape est particulièrement délicate dans le cas des FPGA à cause
de la complexité élevée (granularité) de la cellule de base du FPGA.
´ La description VHDL n’utilise pas de bibliothèque propriétaire et elle est
assez générale.
´ La portabilité est donc bien meilleure qu’avec la saisie de schéma (les langages
VHDL et Verilog sont normalisés),
´ Le rôle du synthétiseur est ici de comprendre et d’interpréter une
description abstraite du design afin de générer un fichier NGC
compréhensible par les outils d’implémentation, c’est-à-dire une netlist
NGC composée de primitives simples.
La Synthèse ?
´ Le produit du synthétiseur est communément appelé «liste des
interconnexions» (netlist):
• les composantes de base
• et les liens qui les relient.
´ Les synthétiseurs n’infèrent que des modules qui peuvent être décrits sans
ambiguïté:
´ le code HDL doit être non ambigu;
´ le code HDL doit correspondre à une structure disponible sur la technologie
ciblée,
Le synthétiseur respecte un contrat,
p. ex. la norme IEEE 1076.6-2004.
Les étapes de synthèses
HDL
HDL Parsing
Identification des erreurs de
syntaxe
HDL Synthesis
Macro recognition+ SM extraction
Resource sharing
Low Level Optimization
Constraints
Macro implememntaion, timing optimization, LUT
mapping, register replication
NGC LOG
La norme IEEE 1076.6-2004
´ IEEE Standard for VHDL Register Transfer Level (RTL) Synthesis
´ “This document specifies a standard for use of VHDL to model synthesizable
RTL digital logic.
A standard syntax and semantics for VHDL register-transfer level synthesis is
defined.
The subset of the VHDL language, which is synthesizable, is described, and
nonsynthesizable VHDL constructs are identified that should be ignored or
flagged as errors.”
´ http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=1342563&isnu
mber=29580
Synthétiseur : XST
´ « The XST User Guide:
´ Describes Xilinx® Synthesis Technology (XST) support for Hardware Description
Language (HDL), Xilinx devices, and design constraints for the Xilinx ISE® Design
Suite software
´ Discusses FPGA and CPLD optimization and coding techniques when creating
designs for use with XST »
´ Le document fournit beaucoup d’exemples sur la façon de coder
différents modules matériels.
Types utilisés pour la synthèse
´ Les types std_logic ou std_logic_vector ne devraient être utilisés que pour
des valeurs logiques.
´ Pour représenter des nombres pour les ports d’une entité, les types préférés sont
tirés du package numeric_std :
´ unsigned pour une interprétation non signée
´ signed pour une interprétation signée en complément à deux.
´ Pour représenter des signaux internes d’un module, on a avantage à utiliser les
types plus abstraits comme integer, character ou string, même s’il est plus
difficile de retrouver ces signaux pour débogage dans les produits de la
synthèse ou de l’implémentation.
´ Pour les constantes et les paramètres d’un module, on peut en général utiliser
tous les types abstraits supportés par VHDL, comme real, integer, ou string.
Opérateurs synthétisables
´ La plupart des synthétiseurs peuvent synthétiser des circuits matériels qui
réalisent les opérateurs suivants:
´ logique: and, or, nand, nor, xor, xnor, not
´ relation: =, /=, <, <=, >, >=
´ concaténation: &
´ arithmétique et décalage:
´ +, - ,*, abs
´ /, rem et mod, si l’opérande de droite est une constante égale à une puissance de 2
´ sll, srl, sla, sra, rol, ror
´ Les opérateurs ne sont pas définis pour tous les types, il faut utiliser les
librairies correspondantes.
Le niveau RTL
´ Est-ce tout code VHDL est synthétisable ?
´ Pour qu’un code soit synthétisable, il faut qu’il soit écrit au niveau RTL.
C’est-à-dire processus cloqué et processus combinatoire
´ RTL: Logique combinatoire alimentant des registres en sortie
´ Avec cette définition, un processus cloqué résulte après synthèse en :
´ une logique combinatoire
´ et des registres à la sortie.
Synthèse niveau RTL
• Règle 1 : dans un processus ´ Règle 2 : dans un processus
combinatoire il faut que la liste de cloqué la logique combinatoire
sensibilité soit complète doit être après le test du front de
l’horloge
synthèse niveau RTL
´ Après synthèse, chaque
affectation dans un registre
cloqué entraine un registre
(ou bascule D).
Niveau RTL
´ En RTL les registres sont utilisés entre les différents étages
Exercice :
´ Quelle allure de circuit est synthétisé par le code VHDL suivant ?
A-B X Z
+
CLK +
CLK
C-D Y
+
CLK
Contrôle des latchs transparent
implicitement:
else
Q<=Q;
Le processus que nous avons vu
génère des LATCH transparents pour
que Q retienne sa valeur (lorsque
EN=‘0’)
Contrôle des latchs transparents
´ Une description générale de ce
que nous avons vu est lorsqu’un
signal est affecté dans une
branche de code mais pas dans
les autres, alors un LATCH
transparent est généré.
´ Les affectations incomplètes
génèrent des LATCH
TRANSPARENTS
´ Pour éviter des latch , il faut
vérifier que tous les signaux sont
affectés dans chaque branche
du code.
Contrôle des latchs transparents
´ Règle: pour tout processus
combinatoire, il faut faire des
affectations par défaut au début
pour que le code soit
correctement synthétisé.
Synthèse de logique combinatoire
Liste de sensibilité complète
´ Règle : Dans la synthèse des logiques combinatoire, tous les signaux
d’entrées doivent figurer dans la liste de sensibilité!!!!
´ Signaux d’entrées signifie les signaux qui sont lus par le processus.
Liste de sensibilité complète
SEL is missing
• Le processus s’exécute sur des évènements sur A ou B. Un évènement sur
SEL n’entraine aucune activation du processus, donc Z ne changera pas.
• Cette erreur est difficile à déboguer surtout que Z pourrait avoir la bonne
valeur dans certains cas.
Liste de sensibilité complète
process(A, B)
begin
T1 <= A and B;
T2 <= not(T1);
end process;
process (A, B, T1)
begin
T1 <= A and B;
T2 <= not(T1);
end process;
1. Synthèse de LC : Exemple 1
Synthèse de LC : Exemple 2 if / case
´ L’énoncé if, est plus général avec les clauses elsif ainsi qu’une clause else.
Il est possible de l’utiliser pour donner priorité à certaines conditions par rapport
à d’autres. Cela peut résulter en un circuit plus complexe que nécessaire,
parce que le comportement décrit peut être plus restrictif que ce que le
concepteur a en tête.
Synthèse de LC : Exemple 3 if / case
´ L’énoncé case a l’avantage de représenter des choix qui sont mutuellement exclusifs
et qui ont la même priorité. Il correspond assez exactement à l’action d’un
multiplexeur.
Case est un meilleur choix quand
on n’a pas besoin de priorité!
Synthèse de LC : Exemple 4 boucle for
´ Synthèse d’une Boucle for (n fois) duplication du circuit synthétisé n fois : la
valeur n doit être statique au moment de la synthèse.
´ Boucle while non synthétisable ( nombre d’itération non définit à l’avance)
Synthèse de LC : Exemple 4 boucle for
entity boucledynamique is
port (
x0, xmax : in integer range 0 to 255;
´ Ce code est il synthétisable ?? somme : out integer range 0 to 65535
);
end boucledynamique;
architecture arch of boucledynamique is
begin
process(x0, xmax)
variable sommet : integer;
begin
sommet := 0;
for k in x0 to xmax loop
sommet := sommet + k;
end loop;
somme <= sommet;
end process;
Boucle à bornes indéfinies.
end arch;
Synthèse flot de donnéesà LC
Architecture A1 of E is
Begin Évaluation de
S <= W+X+Y+Z; gauche à droite
End architecture
Architecture A2of E is
Begin Effet de la
S <= (W+X)+(Y+Z); parenthès
End architecture e
Z X Y
Architecture A3 of E is
Begin
S1 <=W+Z; S1
S2 <=S1+X;
S <=S2+Y; S2
End architecture
Synthèse de logique séquentielle
2. Synthèse de logique avec registre: Règle
process(CLK, A) process(CLK)
begin begin
if rising_edge(CLK) then if rising_edge(CLK) then
Z <= A; Z <= A;
end if; end if;
end process; end process;
process(CLK, reset)
begin
if (reset = ‘1’) then
Z <= ‘0’;
elsif rising_edge(CLK)then
Z <= A;
end if;
end process;
2. Synthèse de logique avec registre: Règle
´ Ce code est il synthétisable ?? library ieee;
use ieee.std_logic_1164.all;
entity registremanque1 is
port (
clk, D : in std_logic;
Q : out std_logic
);
end registremanque1;
àUn seul front et une seule architecture arch of registremanque1 is
horloge begin
process(clk)
begin
if (rising_edge(CLK) or falling_edge(CLK))
then
Q <= D;
end if;
end process;
end arch;
2. Synthèse de logique avec registre: Règle
´ Ce code est il synthétisable ??
library ieee;
use ieee.std_logic_1164.all;
entity registremanque is
port (
clk, reset, enable, D : in std_logic;
Q : out std_logic • Pas de
);
end registremanque;
combinatoire
avec l’horloge
architecture arch of registremanque is
begin
process(clk, reset)
begin
if (rising_edge(CLK) and reset = '0' and enable = '1') then
Q <= D;
end if;
end process;
end arch;
-- 4-bit Unsigned Up Accumulator with Asynchronous Reset
--
library ieee;
use ieee.std_logic_1164.all; use
ieee.std_logic_unsigned.all;
entity accumulators_1 is
port(C, CLR : in std_logic;
D : in std_logic_vector(3 downto 0);
Q : out std_logic_vector(3 downto 0));
end accumulators_1;
architecture archi of accumulators_1 is
signal tmp: std_logic_vector(3 downto 0);
begin
process (C, CLR)
begin
if (CLR=’1’) then
tmp <= "0000";
elsif (C’event and C=’1’) then
tmp <= tmp + D;
end if;
end process;
Q <= tmp;
end archi;
2. Synthèse de logique avec registre:
Règle
Avec cette définition, un
processus cloqué résulte
après synthèse en une logique
combinatoire et des registres
à la
sortie.
Exemple 1
´ Écrire le code synthétisable
de ce circuit
Exemple 2
Les astuces de synthèse
´ Pour les processus décrivant des bascules: placer seulement clk et reset dans
la liste de sensibilité
´ Pour les processus décrivant de la logique combinatoire: placer tous les
signaux faisant partie d’expressions dans la liste de sensitivité
´ Transport et after non synthétisable : délais ignorés par le synthétiseur
´ Pour les process combinatoire : Liste de sensibilité préférable au « wait on »
´ Wait until : Supporté en première ligne d'un PROCESS synchrone :
´ wait until clock = value;
´ wait until clock'event and clock = value;
´ wait until not clock'stable and clock = value;
´ Pour représenter des nombres, les types préférés sont unsigned pour une
interprétation non signée et signed pour une interprétation signée en
complément à deux. Ces types sont définis dans le package numeric_std.
´ Uniquement les attribut event et stable sont synthétisable.
´ …