Connecter producteurs et consommateurs : le protocole ready/valid

Producteurs et consommateurs

Dans un système typique de traitement du signal, un flux de données traverse une chaîne de fonctions qui consomment des échantillons d’entrée et produisent des échantillons de sortie de manière synchronisée. Par exemple, dans la structure du vocodeur que nous devons développer, le contrôleur d’entrée audio et les oscillateurs sont des producteurs, le contrôleur de sortie audio est un consommateur, et les autres fonctions jouent les deux rôles à la fois.

Schéma de principe du système

Lorsque ces fonctions sont réalisées en matériel, il faut prévoir des signaux de contrôle pour que chaque composant sache à quel moment il doit travailler. Il faut également tenir compte du fait que le temps d’exécution d’un pas de calcul peut être différent selon les composants. On peut envisager deux stratégies de synchronisation :

Dans ce projet, nous allons choisir la seconde stratégie.

Dans ce document, nous choisissons d’utiliser les termes « producteur » et « consommateur », mais selon les auteurs, les mêmes concepts pourront être désignés sous d’autres noms, en français comme en anglais :

Producteur (producer) Consommateur (consumer)
Émetteur (transmitter, sender) Récepteur (receiver)
Source (source) Destination (destination, sink)
Maître (master) Esclave (slave)

Le protocole ready/valid

Il s’agit d’une technique de synchronisation très répandue qui repose sur le principe de la poignée de mains (handshake). Pour qu’un échange de données entre un producteur et un consommateur s’accomplisse, il faut que le producteur ait une donnée disponible et que le consommateur soit prêt à la recevoir. Ces deux conditions sont représentées par les signaux valid et ready.

Schéma de principe du système

Le protocole proposé ici s’inspire de l’interface AXI (Advanced eXtensible Interface) spécifiée par ARM et très utilisée dans le développement de SoC.

À chaque instant, la liaison entre producteur et consommateur peut se trouver dans l’un des états suivants :

valid ready Signification
0 0 Le producteur et le consommateur sont occupés ou inactifs.
1 0 Le producteur présente une nouvelle donnée. Il attend que le consommateur l’accepte.
0 1 Le consommateur est prêt à recevoir une nouvelle donnée. Il attend que le producteur la fournisse.
1 1 Handshake, le producteur présente une nouvelle donnée et le consommateur l’accepte.

Le chronogramme ci-dessous illustre plusieurs exemples d’échanges de données respectant ce protocole.

Exemples de transactions ready/valid

Le producteur et le consommateur échantillonnent les signaux ready et valid sur les fronts d’un même signal d’horloge. Si le producteur laisse valid à 1 après le handshake, cela signifie qu’il a encore une nouvelle donnée disponible (exemples 4 et 6). Selon les situations, le consommateur peut se déclarer prêt à recevoir une nouvelle donnée avant (exemples 2 et 5), après (exemples 1 et 4), ou pendant (exemples 3 et 6) le cycle d’horloge où valid devient actif.

Dans la spécification de l’interface AXI, le producteur est tenu de respecter les deux règles suivantes :

Débit et architecture en pipeline

Considérons un circuit composé de quatre composants connectés en cascade comme sur le schéma ci-dessous :

Exemples de chaîne de composants

Supposons que le comportement de chaque composant est géré par une machine à états comportant les états suivants :

Voici une traduction sous forme de graphes d’états du comportement des trois types de composants. Au démarrage, les consommateurs sont tous dans l’état R, prêts à recevoir une nouvelle donnée.

Machines à états producteurs et consommateurs

Observons à présent un exemple de scénario de fonctionnement avec quatre composants :

Exemples de scénario en pipeline

Après un temps de démarrage représenté en jaune, le système se met à travailler à un rythme régulier. Les couleurs mettent en évidence un fonctionnement qui évoque le travail à la chaîne: les quatre composants peuvent se trouver simultanément dans leur état Busy, chacun occupé à faire un calcul dont il passe le résultat au consommateur suivant. Dans le domaine des circuits numérique, on dit que les quatre composants forment un pipeline.

Pour augmenter encore le débit dans ce pipeline, les composants qui sont à la fois producteurs et consommateurs peuvent gagner un peu de temps en passant directement de l’état V à l’état B et en activant leur sortie ready au plus tôt.

Machines à états producteurs et consommateurs rapide

Dans ce scénario de fonctionnement idéal, les composants 2 et 3 sont dans leur état R au démarrage et n’y reviennent plus ensuite :

Exemples de scénario en pipeline

Cette solution peut cependant poser des problèmes car les signaux ready forment alors une chaîne combinatoire qui va du dernier consommateur au premier producteur. Si cette chaîne devient trop longue, cela peut poser des problèmes de timing.