• Aucun résultat trouvé

Modélisation structurelle du code CHP

2. Spécification synthétisable de circuits asynchrones

2.1 L E LANGAGE CHP (C OMMUNICATING H ARDWARE P ROCESS )

2.1.2 Modélisation structurelle du code CHP

Nous avons souligné plus haut que dans le CHP initial d’Alain Martin [MAR 90] l’ensemble des processus était déclaré à plat. La complexité des systèmes VLSI a imposé de définir une approche de modélisation hiérarchique. Cette hiérarchie est seulement basée sur les processus et les composants connectés via des canaux (et non des signaux), ce qui est moins modulaire et moins riche qu’en VHDL où il est nécessaire de déclarer à la fois entité, architecture, composant, processus, et configuration.

A titre indicatif, un programme CHP ressemble à ceci :

Ce programme décrit un circuit tampon ou « buffer » qui lit en boucle une donnée sur le port d’entrée « e » puis restitue cette donnée le port de sortie « s ».

2.1.2.1 Le composant

Le composant constitue la vue globale d’un circuit asynchrone et sa vue externe déclare éventuellement des ports de communication. Sa partie déclarative peut accessoirement contenir des déclarations de constantes, de canaux de communications permettant de connecter les différents processus et instances de composants, ou encore de composants locaux destinés à être instanciés. Le corps d’un composant comporte des instructions concurrentes telles que des déclarations de processus et des instances de composants.

COMPONENT buffer PORT (e : IN DR ; s : OUT DR) BEGIN PROCESS buffer_proc PORT (e : IN DR ; s : OUT DR) VARIABLE x : DR; BEGIN [e?x ; s!x ; LOOP]; END; END;

La partie déclarative d’un composant est optionnelle. Si un port est déclaré, il doit obligatoirement contenir le nom du port, sa direction, ainsi que le type de données qui y transitent, et accessoirement le type de codage ainsi que le protocole de communication des données.

Dans les circuits micropipeline de Yvan E. Sutherland [SUT 89], les données sont codées en binaire et on associe au bus de données, un signal de requête et un signal d’acquittement (codage Bundled Data). Chaque digit est représenté par sa représentation binaire. Dans les circuits quasi-insensibles aux délais [MAR 90], les données sont codées en 1 parmi N et on associe au bus de données, un signal d’acquittement. Le codage est dit DI (Delay Insensitive).

2.1.2.2 Instances de composants locaux

Les ports utilisés dans un processus ou un composant instancié sont soit ceux déclarés au niveau du composant global soit les canaux déclarés dans le composant courant. Dans tous les cas, ils doivent déjà avoir été déclarés avant d’être utilisés et leurs types doivent être les mêmes partout.

2.1.2.3 Processus

Les noms des différents processus doivent être distincts mais un processus peut avoir le même nom que le composant global dans lequel il est défini. Par ailleurs et contrairement à un processus en VHDL, un processus en CHP doit forcément déclarer ses ports de communications pour permettre de déclarer proprement les attributs de canaux (codage, direction, et protocole) et effectuer les vérifications nécessaires. Les variables locales d’un processus sont définies dans sa partie déclarative. Le corps d’un processus contient des instructions séquentielles mais également concurrentes ce qui est prohibé dans le langage VHDL par exemple. COMPONENT nom_du_composant PORT (liste_de_ports) ; CONSTANT (liste_de_constantes) ; CHANNEL (liste_de_canaux) ; COMPONENT (liste_de_composants_locaux); BEGIN (instances_des_composants_locaux) (déclaration_de_processus) END; PROCESSUS nom_du_processus PORT (liste_de_ports) ; VARIABLE (liste_de_variables) ; BEGIN (instructions_séquentielles_et_concur- rentes) END;

2.1.2.3.1 Port de processus

La syntaxe est équivalente à celle de la déclaration d’un port de composant. Les identificateurs des ports du processus doivent avoir déjà été déclarés soit au niveau du composant global soit au niveau de la déclaration des canaux. Aucun port ne peut donc être utilisé dans la liste d’instruction du processus s’il n’a pas été déclaré dans la partie déclarative du processus (alors qu’en VHDL par exemple, un port peut être utilisé dans un processus dès lors qu’il a été déclaré au niveau global). Cette re-déclaration forcée permet à l’utilisateur de savoir quels ports du composant global sont utilisés dans chaque processus.

2.1.2.3.2 Variable de processus

Seul le type SR est interdit pour la déclaration de variables car il ne porte pas d’information. Une variable est déclarée dans un processus. Elle est locale à ce processus, et ne peut en aucun cas être accédée par un autre processus. Par conséquent, deux variables déclarées dans deux processus différents peuvent avoir le même nom. Une variable peut être initialisée.

2.1.2.3.3 Liste d’instructions de processus

L’ensemble des instructions d’un processus est exécuté une et une seule fois du début à la fin. Dans un processus les instructions peuvent être séquentielles « ; » ou parallèles « , ». Les instructions parallèles sont plus prioritaires que les instructions séquentielles mais le concepteur peut avoir recours au « parenthésage » pour imposer l’ordre des priorités. La dernière instruction d’un processus doit se terminer par un « ; ». Les structures de contrôle en CHP étendu sont explicités en §2.1.2.4. Les actions de communications sont explicitées en §2.1.3.4.3.

2.1.2.4 Structures de contrôle

En CHP, la modélisation du contrôle (instruction conditionnelle, boucle, sélection) emprunte la syntaxe des commandes gardées de Djikstra [DJI 76].

Le contrôle est représenté par des commandes gardées et s’exprime comme suit « [<garde> => <liste_d_instructions> ; (LOOP|BREAK)] ; ». Sémantiquement cette syntaxe signifie que la liste d’instructions ne s’exécute que si la garde correspondante est vraie. La garde étant une expression booléenne, toute expression retournant un booléen peut être utilisée, à l’image de l’opérateur de sonde de canal (ou probe) « # », des opérateurs de comparaison, des opérateurs logiques dont les opérandes sont des booléens, et du mot réservé « OTHERS », qui prend en compte tous les cas possibles non explicitement écrits.

Lorsqu’aucune garde n’est explicitée, le booléen considéré est « TRUE » et on simplifie l’écriture par « [< liste_d_instructions > ; (LOOP|BREAK)] ; »

Avec ou sans garde, deux types de structures de contrôle sont définis en CHP. Les mots clés définissant ces deux structures sont « BREAK » et « LOOP ».

Dans les instructions sans garde, le mot clé «BREAK » renvoie à une structure de contrôle dans laquelle la liste des instructions est systématiquement exécutée, après quoi l’on passe à la suite du programme. Par ailleurs, le mot clé « LOOP » exprime une structure de contrôle dans laquelle la liste des instructions est systématiquement exécutée, après quoi le processus continue de boucler ré-exécutant ainsi la même liste d’instructions.

Dans le cas où des gardes existent, la structure est dite de sélection déterministe (@) ou

indéterministe (@@) et s’écrit comme suit :

@{@}[ garde_1 => liste_d_instructions_1 ; (BREAK|LOOP)

garde_2 => liste_d_instructions_2 ; (BREAK|LOOP)

{garde_i => liste_d_instructions_i ; (BREAK|LOOP)} ]

Ici, le mot clé « BREAK » renvoie à une structure de contrôle dans laquelle le processus est suspendu jusqu’à ce qu’une garde de la structure soit vraie. Dès lors qu’une garde est vraie, la liste des instructions qui lui est associée peut alors être exécutée et on passe à la suite du programme. Par ailleurs, le mot clé « LOOP » exprime une structure de contrôle dans laquelle la liste des instructions associées à une garde vraie est exécutée mais le processus continue de boucler tant qu’une garde est vraie exécutant ainsi les instructions correspondantes à cette garde.

Notons que dans la sélection déterministe, les gardes sont mutuellement exclusives. Ainsi une seule garde est vraie à la fois. Si plusieurs gardes son vraies simultanément, l’ambiguïté ne peut être résolue et une erreur est renvoyée. Par ailleurs, il appartient au concepteur de prévoir toutes les gardes possibles.

On peut donc constater que la modélisation structurelle offerte par cette syntaxe est suffisamment riche pour envisager l’écriture de problèmes VLSI complexes. A titre comparatif, les notions VHDL de configuration et de couple entité/architecture ne sont pas disponibles en CHP mais peuvent s’implémenter avec une politique de renommage des composants. Egalement, les possibilités de synchronisation/parallélisme en CHP sont plus riches qu’en VHDL sachant que les processus peuvent inclure des instructions concurrentes. Aussi, notons comme cela a été souligné plus haut, qu’en CHP les ports des processus sont déclarés. Cela assure une meilleure lisibilité structurelle et fonctionnelle de chaque processus.