Altifigence Academy

11 / 37 · Concept

Encodeurs et priorité : choisir une requête parmi plusieurs

Distinguer les hypothèses de l'encodeur one-hot et les résultats valid et index d'un encodeur prioritaire.

Le sens inverse du décodage exige aussi des conditions

Un décodeurDécodeur Circuit activant la ligne correspondant à un code binaire. Avec enable, toutes les sorties peuvent être mises à 0 lorsqu'il est désactivé. En savoir plus transforme une adresse en sélection one-hotOne-hot Représentation où exactement un bit vaut 1. Si le motif tout à zéro est aussi autorisé, on parle de one-hot-or-zero. En savoir plus. Un encodeur transforme la position d'une entrée active en adresse. Un encodeur one-hot ordinaire suppose toutefois une seule entrée active. Plusieurs entrées simultanées exigent une règle supplémentaire pour choisir la position rapportée.

Pour r3r2r1r0r_3r_2r_1r_0, donnons priorité au numéro le plus élevé. Si toutes les entrées valent 0, fixons valid=0 et index=00. L'index 00 seul ne distingue pas l'absence de requête de la requête r0.

Entrée r3r2r1r0validindex
1---111
01--110
001-101
0001100
0000000

Le tiret signifie même résultat pour 0 ou 1 ; il n'autorise pas une entrée X de simulation. Les motifs de haut en bas sont mutuellement exclusifs.

valid=r3+r2+r1+r0,index1=r3+r2,index0=r3+r2‾r1valid=r_3+r_2+r_1+r_0,\quad index_1=r_3+r_2,\quad index_0=r_3+\overline{r_2}r_1

1011 donne index=11. Pour 0110, r2 passe avant r1, donc index=10.

Chaque colonne est une combinaison indépendante de requêtes
Voir les données du chronogramme
Données du chronogramme : chaque caractère représente un intervalle ; un point maintient l'état précédent ; p représente un cycle d'horloge.
SignalForme d'ondeValeurs du bus
requests2345230000 → 0001 → 0011 → 0110 → 1011 → 1000
valid01....
index2.345.00 → 01 → 10 → 11

Le RTL doit rendre la priorité visible

SystemVerilog
always_comb begin
  valid = |request;
  index = 2'b00;
  if      (request[3]) index = 2'd3;
  else if (request[2]) index = 2'd2;
  else if (request[1]) index = 2'd1;
end

Si seul request[0] vaut 1, l'index par défaut reste 0 et valid=1. Donnez des valeurs par défaut sur tous les chemins pour éviter toute mémorisation combinatoire. Testez les seize entrées : lorsque valid=1, le bit sélectionné doit être 1 et tous les bits de numéro supérieur doivent être 0.

Sélection et équité sont deux problèmes distincts

Si r3 reste à 1, r0 n'est jamais choisi. Ce circuit ne réalise qu'une priorité fixe. Un traitement équitable exige un arbitre mémorisant les sélections précédentes, donc un circuit séquentiel.

Manipulation · Observer requêtes, index et grant

Sélectionner une seule requête parmi les requêtes simultanées

r3r2r1r0=1011; valid=1; index=11; grant=1000. Les requêtes de numéro supérieur sont prioritaires. Lorsque valid=0, index ne désigne aucune requête sélectionnée.

Avec la requête initiale 1011, r3 est choisi. Désactivez r3 : r1 est choisi, index=01 et grant=0010. Tant que r1 vaut 1, activer ou désactiver r0 ne doit rien changer.

Comparez « Tout désactiver » avec r0 seul actif. Dans les deux cas index=00, mais valid et grant diffèrent. Un circuit en aval lisant seulement index peut traiter une requête inexistante.

grant, où seule la requête retenue vaut 1, est obtenu en redécodant index avec valid.

granti=valid∧(index=i)grant_i=valid\land(index=i)

Trois invariants sont à vérifier : au plus un bit de grant vaut 1 ; ce bit correspond à une requête réelle ; toutes les requêtes de numéro supérieur valent 0. La manipulation ne consomme aucune requête et ne mémorise pas la sélection précédente. L'attente des requêtes basses lorsque r3 reste actif est une propriété de la priorité fixe.

Essayez vous-même

Donnez index, valid et grant pour 0101 puis 0001. Pourquoi ne faut-il pas traiter r0 pour 0000 sous prétexte que index=00 ?

Lire l’explication

0101 donne index=10, valid=1, grant=0100. 0001 donne index=00, valid=1, grant=0001. Pour 0000, index=00 n'est qu'une valeur par défaut : valid=0 et grant=0000 indiquent qu'il n'y a rien à traiter.

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.