Académique Documents
Professionnel Documents
Culture Documents
Plusieurs outils ont été réalisés pour automatiser cette phase de conception connue sous le nom de
synthèse architectural ou synthèse de haut niveau. Nous pouvons citer:
- L'outil AMICAL développé par le laboratoire TIMA (INPG), maintenant intégré dans les outils de
TNI Valiosys
-Le système ALLIANCE développé par le laboratoire ASIM (Université Paris 6)
- L'outil CATHEDRAL développé à l'IMEC (Université de Leuven (Belgique)), spécialisé pour la
conception des circuits de traitement du signal, devenu N2C de Coware
Ces outils produisent des circuits raisonnablement optimisés. Ils opèrent en adaptant un motif
générique au problème particulier. Ils sont considérés comme plus puissants que les outils qui partent
d'un schéma fonctionnel, puisqu'ils démarrent leur travail à partir de la description du comportement
du circuit à réaliser et non d'une structure déjà imaginée par le concepteur.
Dans ce cours nous nous intéressons plus particulièrement à l’aspect architecture et conception au
niveau RTL sans faire recours aux outils de synthèse de haut niveau. Nous commençons par construire
manuellement l’architecture des modules matériels à concevoir pour une meilleure maîtrise des
aspects architectural et des techniques de conception des modules numériques (dédiés ou à usage
général -µp). Ces derniers sont basés sur l’association des composants numériques de base pour
constituer des systèmes qui répondent aux besoins fonctionnels du concepteur. Ceci selon les
différentes approches de mise en œuvre des traitements numériques (câblé ou programmé). Dans ce
cours nous allons nous intéresser aussi à l’analyse de performances des architectures proposées.
2. Architecture générale d’un module matériel
La démarche générale de conception consiste à diviser le circuit à réaliser en deux parties qui sont
spécialisées, l'une pour la manipulation et la transformation des données (appelée chemin de donnée)
et l'autre pour le séquencement (appelée contrôleur ou séquenceur).
L’unité de contrôle (séquenceur) est une machine séquentielle dont les entrées sont les tests issus du
chemin de données et les sorties les commandes qu'elle lui envoie. Elle est responsable de contrôler
toutes les opérations du chemin de données en générant les signaux de contrôle appropriés aux bons
moments. A chaque cycle d’horloge l’unité de contrôle se trouve dans un état. Son évolution se fait en
passant d’un état à l’état suivant au front actif de l’horloge. Elle correspond à une machine à états finis
Cnew = Ca × F + Cb × (1 − F)
- La latence (The latency) d’un chemin de données mesure le nombre de cycles d’horloge
nécessaires pour terminer le calcul sur une donnée à l’entrée du système.
- Le temps de calcul (total computation time) est égal à la latence multipliée par la période
d’horloge.
- La periode d’initiation (initiation period cadence) mesure le nombre de cycles d’horloge
nécessaires entre une donnée et la donnée suivante
- Le débit (throughput) d’un chemin de données représente le nombre de données d’entré
traitées par unité de temps. Baisser la période d'initiation (fournir plus souvent de données à
l'entrée) ou diminuer la période de l'horloge augmente le débit.
contrainte temps seulement par la latence et la période d’initiation qui sont mesurées en cycles
d’horloge. Nous n’utilisons pas la période d’horloge car elle dépend de la technologie
d’implémentation (exemple une famille particulière d’FPGA).
Plusieurs solutions architecturales peuvent être proposées pour l’implémentation d’un
traitement donné. Ces solutions présentent différentes performances (surface, temps) l’étude
et le choix de solution s’inscrit dans le cadre de l’étape d’exploration architecturale dont le but
et d’assurer un meilleur compromis entre surface et latence pour répondre au mieux aux
contraintes imposées. Le chois d’une solution ou autre dépend de l’application visée.
L’exemple suivant montre trois différentes architectures du chemin de données correspondant
à l’équation Y avec différentes performances en terme de surface et de temps.
Y = (A * B) + (C * D) + (E * F) + (G * H);
Cnew = Ca × F + Cb × (1 − F)
Avec la valeur de couleur Cnew, Ca et Cb sont au format 0.8 en virgule fixe (8 bits), c € [0–
1.0) 0 ≤ C < 1.0, et F est codé sur 9 bits, F € [0.0–1.0] 0 ≤ F ≤ 1.0
La figure suivante donne une implémentation directe du graphe flot de données (DFG) : cette
implémentation est simplement une assignation un à un des noeuds du DFG à des unité
d’exécution.
Le délai combinatoire le plus long à travers ce chemin de données est 0.4+2.0 + 1.0 = 3.4
unités de temps. La période d’horloge du système est donc au moins :
Tcq (register clock-to-q delay) + 3.4 + Tsu (register setup time) = 3.6 unités de temps
Avec Tcq et Tsu = 0.1 et en supposant que les entrées et les sorties du chemin de données
sont synchronisées (registred).
La figure suivante donne une meilleure implémentation. Ceci en introduisant des registres de
pipeline pour couper les longs chemins combinatoires. Le plus long chemin tR2R est de 2.6
qui est plus court que le plus long chemin combinatoire dans la solution précédente. Ceci
permet une fréquence d’horloge plus élevée. Le timing cycle-par-cycle de cette deuxième
implémentation est donné par le chronogramme suivant. La latence du chemin de données
utilisé est de 2 cycles. Selon le fonctionnement donné par le chronogramme la période
d’initiation est de 2 cycles d’horloge puisque les nouvelles valeurs des entrées sont appliquées
chaque 2 cycles. Mais en réalité cette solution architecturale supporte une période d’initiation
de seulement un cycle comme le montre le deuxième chronogramme. Ceci en exploitant le
pipeline introduit par les registres utilisés. Grâce à ce pipeline une sortie sera générée à
chaque cycle d’horloge.
Dans cette solution d’implantation nous observons que les chemins tR2R n'ont pas été
équilibrées ce qui est indésirable comme le plus long chemin tR2R détermine la période de
l'horloge. Distribuer les délais de façon plus équilibrée permet de produire une période
d'horloge plus petite. Dans le cas de notre exemple on note que le chemin de délai le plus long
contient l’unité de calcul de 1-F et les unités de multiplication, avec le multiplicateur qui a le
plus long délai. Une étape de pipeline à introduire dans le multiplicateur (par l’insertion de
DFFs) permettra de réduire la longueur de ce chemin.
La figure suivante représente une implémentation modifiée en utilisant le multiplieur pipeliné.
Le plus long délai tR2R a été réduit de 2.6 à 1.6 avec une latence d’un cycle de plus. Le
chronogramme de cette solution diffère de celui de la solution suivante seulement par un
cycle d’horloge supplémentaire pour la latence.
Le tableau suivant donne une comparaison entre les chemins de données discutés jusqu’à
maintenant relativement à la période d’horloge, la latence, la période d’initiation et le débit.
Le débit mesure le nombre d’entrées traitées par unité de temps. Il est calculé par la formule
suivante (en supposant que le pipeline est rempli) :
Les chemins de données présentés jusqu’à ce point associent à chaque nœud du DFG une
unité d’exécution séparée. Cependant, dans des chemins de données plus complexes, les
contraintes sur les ressources matérielles nécessitent le mappage de plusieurs nœuds à une
Une machine à états finis permet de générer les signaux de contrôle nécessaire aux cycles
d’horloge appropriés : msel, ld n2, ld n3 et ld cnew. Elle constituée de trois états puisque les
opérations du chemin de données est un calcul répétitif qui couvre trois cycles de l'horloge.
Dans l’exemple précédent nous avons supposé que le flux de données d’entrée est continu.
Cependant, dans plusieurs cas le chemin de données doit attendre que les données d’entrée
soient disponibles et doit aussi donner une indication lorsque la sortie soit disponible. Des
signaux additionnels appelés signaux de handshaking sont utilisés par l’FSM pour cette
raison. Dans ce cas l’FSM reste dans l’état S0 jusqu’à ce que l’entrée irdy soit activée pour
indiquer que le bus d’entrée contient une donnée valide. Le signal ordy est activé pour un
cycle d’horloge lorsque une donnée valide est placée sur le bus de sortie Cnew. Le signal
ldcnew est activé dans l’état S2 pour un cycle d’horloge.
Dans les implémentations précédentes nous avons utilisé des bus séparés pour F, Ca et Cb.
Cependant, les buses sont aussi des ressources importantes comme pour les unités de
traitement et le concepteur peut ne pas avoir la possibilité d’utiliser des bus séparés pour les
différentes entrées. En fait, les pins externes d’un circuit intégré des ressources extrêmement
précieuses et ils sont souvent multiplexé dans le temps entre différentes fonctions.
L’architecture de la figure suivante donne une implémentation avec un bus partagé pour entrer
successivement les valeurs de F, Ca et Cb (une valeur à chaque cycle). Nous utilisons un
ordonnancement avec une latence = 4 et une période d’initiation = 4. Seulement un
multiplieur est utilisé. Ce dernier reste au repos pendant le cycle i+0 puisque la valeur de Ca
n’est pas encore disponible. Un nouveau registre rF est utilisé pour retenir la valeur de F qui
est demandé pour les calculs des noeud n2 et n3 aux clocks i + 1 et i + 2. Dans
l’implémentation précédente nous avons supposé que la valeur de F reste disponible sur un
bus de donnée séparé pendant la duré du calcul.
(a) (b)
(c)
Pour mettre le chemin de données en exécution nous devons lui fournir les signaux de
contrôle appropriés aux moments appropriés. On se réfère au mot de contrôle comme étant
l’ensemble des signaux de contrôle nécessaires pour commander le fonctionnement du chemin
de données. Une opération de transfert de registre est donc déterminée par les valeurs des bits
du mot de contrôle. Chaque opération définie par un mot de contrôle prend un cycle d’horloge
pour être effectuée. En combinant plusieurs mots de contrôle dans une certaine séquence, le
chemin de données va réaliser les opérations spécifiées dans l’ordre désiré. La spécification
de la séquence de contrôle est définie sous forme d’une FSM.
Exemple : l’architecture (c’) admet deux signaux de contrôle ALoad et Mux. Les mots de
contrôle pour exécuter l’opération A=A+3 et l’opération A=B+C sont donnés par le tableau
suivant :
Mot de
opération ALoad Mux
Contrôle
1 A= A+ 3 1 1
2 A= B+ C 1 0
Une fois on a décidé sur le nombre de registres à utiliser, il nous reste à déterminer si on va
utiliser une unique table de registres avec suffisamment d’emplacement mémoire, des
registres séparés ou un mélange de deux. De plus, des registres avec des fonctions spéciales
peuvent être utilisés, comme par exemple les registres à décalage et les compteurs. Exemple,
si l’algorithme admet une boucle FOR, un seul compteur peut être utilisé à la fois pour stocker
la variable et incrémenter le comptage. De cette façon on ne réduit pas seulement le nombre
de composants, mais aussi les ressource de connections entre les composant. La décision sur
la sélection du type de registres à utiliser va donc affecter la manière dont les connections de
transfert de données entres les registres et les unités fonctionnelles sont connectés.
Par exemple, si un algorithme exige l'addition de deux nombres, alors le chemin de données
doit inclure un additionneur. Cependant, nous avons besoin encore de décider si on utilise un
additionneur dédié, une combinaison d’additionneur-soustracteur ou une UAL. Ces questions
peuvent être répondues en sachant de quelles autres opérations on a besoin pour l'algorithme.
Si l'algorithme a seulement une addition et une soustraction, alors vous pouvez utiliser l'unité
combinant un adiitioneur-soustracteur. De l'autre côté, si l'algorithme exige plusieurs
opérations d’addition, est-ce que nous utilisons juste un additionneur ou plusieurs
additionneurs? Utiliser un additionneur peut diminuer la taille du datapath en terme de
nombre d’unités fonctionnelles mais il peut aussi augmenter la taille du datapath en terme de
surface parce que des chemins de transfert plus complexes sont nécessaires.
Par exemple, si l'algorithme contient les deux opérations d’addition suivantes:
a=b+c;d=e+f
L’un des deux architecture suivantes peut être adoptée : architecture avec un seul additionneur
ou architecture à deux additionneurs.
Le deuxième datapath exige deux signaux du contrôle de plus pour les deux multiplexeurs.
Quant à la vitesse d'exécution, le chemin de données avec deux additionneurs peut exécuter
les deux additions simultanément dans le même cycle de l'horloge, puisqu'ils sont
indépendants l'un de l'autre. Cependant, le chemin de données à un seul additionneur doit
exécuter séquentiellement ces deux additions dans deux cycles d'horloge différents. La
dernière décision reste au concepteur.
Multiples Destinations
Une source qui a des multiples destinations n'exige aucun circuit supplémentaire. Une source
peut être connectée à différentes destinations directement et toutes les destinations qui n’on
pas besoin de données transmis ignorent simplement la source du données.
Le chemin de données doit fournir au contrôleur les résultats de tests conditionnels pour lui
permettre de déterminer l’opération qui sera exécutée à l’étape suivante. Chaque test
conditionnel de l’algorithme nécessite un signal d’état. Les signaux d’état sont généralement
générés par des comparateurs.
Exemple 2: Contage 1 à 10
1 i = 0
2 WHILE (i#10){
3 i = i + 1
4 OUTPUT i
5 }
Exemple de mot de contrôle : pour charger une valeur de l’entrée externe au registre
1 i = 0
2 WHILE (i#10){
3 i = i + 1
4 OUTPUT i
5 }
Exemple 1: Contage 1 à 10
1 Sum = 0
2 begin loop
3 input X
4 Sum = Sum + X
5 if (X = 0) then
6 exit loop
7 end if
8 output X
9 end loop
10 output Sum