Altifigence Academy

30 / 37 · Concept

Ready/valid et tampon élastique d'une place

Définir transferts sans perte ni doublon et entrées/sorties simultanées dans un chemin pouvant s'arrêter.

Le transfert a lieu si valid et ready valent 1 au même front

L'émetteur affirme valid quand il présente une donnée utilisable ; le récepteur affirme ready quand il peut la recevoir. La décision se prend en échantillonnant les deux au front d'horloge.

transferk=validk∧readyk\mathrm{transfer}_k=\mathrm{valid}_k\land\mathrm{ready}_k

Pendant valid=1,ready=0, l'émetteur doit conserver valid et la donnée. Attendre ready avant même d'affirmer valid peut provoquer un interblocage selon les règles du partenaire. Tous les signaux sont ici dans le même domaine : ready/validHandshake Contrat validant le transfert lorsque valid de l'émetteur et ready du récepteur valent 1 au même front. Il définit aussi la conservation des données en attente. ne résout pas un CDC.

Transmettre une seule fois la donnée en attente

Les colonnes représentent les cycles d'échantillonnage 0–5, avec valeurs juste avant le front montantFront montant Instant où l'horloge passe de 0 à 1, distinct du niveau désignant tout l'intervalle CLK=1. En savoir plus. A attend aux cycles 1 et 2, valid=1,ready=0 : données et valid restent constants. A est accepté au front 3, B au front 4. Le schéma illustre le contrat, pas les délais setupSetup Durée minimale de stabilité de la donnée avant le front de capture. En cas de violation, le résultat mémorisé n'est pas garanti. En savoir plus/hold.

Ready/valid · attente et transferts consécutifs
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
clkp.....
valid01...0
ready10.1..
transfer0..1.0
datax3..4xA → B

Un valid haut plusieurs cycles ne signifie pas un seul transfert. Chaque front où ready est aussi haut constitue un transfert distinct.

Construire un tampon d'une place

Il reste de la place si le tampon est vide ou si son contenu actuel peut sortir sur ce front.

in_ready=¬out_valid∨out_ready\mathrm{in\_ready}=\neg\mathrm{out\_valid}\lor\mathrm{out\_ready}
SystemVerilog
module elastic_buffer (
    input  logic       clk,
    input  logic       rst,
    input  logic       in_valid,
    output logic       in_ready,
    input  logic [7:0] in_data,
    output logic       out_valid,
    input  logic       out_ready,
    output logic [7:0] out_data
);
    assign in_ready = !out_valid || out_ready;

    always_ff @(posedge clk) begin
        if (rst) begin
            out_valid <= 1'b0;
        end else if (in_ready) begin
            out_valid <= in_valid;
            if (in_valid) out_data <= in_data;
        end
    end
endmodule

Depuis l'état vide, accepter l'entrée met à jour out_valid et out_data après le front. Sans bypass combinatoire, cette nouvelle donnée ne compte pas comme transférée en sortie au même front. Ne comptez aucun transfert pendant reset. Avec out_valid=0, out_data n'a pas de signification : il n'est donc pas indispensable de réinitialiserReset Commande ramenant l'état à la valeur initiale spécifiée. Son caractère synchrone/asynchrone et sa priorité sur les autres commandes doivent être définis. En savoir plus le registreRegistre Circuit stockant plusieurs bits d'état. Les registres synchrones du cours capturent leur entrée définie sur un front d'horloge. En savoir plus de données lui-même.

Remplacer même un tampon plein

État avant le frontout_readyin_validAction au front
Vide0 ou 11Stocker l'entrée, valid=1
Plein00 ou 1Conserver donnée et valid
Plein10Transférer puis vider
Plein11Transférer l'ancienne donnée et stocker la nouvelle

La dernière ligne permet un élément par cycle après remplissage. La latence ne divise pas automatiquement le débitDébit Nombre d'opérations acceptées ou terminées par unité de temps. Un pipeline peut l'augmenter sans réduire la latence d'une opération individuelle. En savoir plus par deux.

Un modèle vérifiant l'ordre

Utilisez une queue de longueur maximale 1. Décidez sortie et acceptation à partir des anciennes valeurs au front ; comparez d'abord la sortie au premier élément, puis ajoutez l'entrée. Dequeue et enqueue pouvant coïncider, définissez bien leur ordre.

0≤Naccepted−Ndelivered≤10\le N_{\mathrm{accepted}}-N_{\mathrm{delivered}}\le1

Cet invariant s'applique à un intervalle de comptage recommencé au reset. Vérifiez aussi stabilité pendant stall, ordre et absence de doublons. Le compte seul ne prouve pas les valeurs.

Une longue chaîne combinatoire de ready allonge le chemin temporel inverse. Vérifiez aussi l'absence de boucle combinatoire entre tampons.

Pour aller plus loin : AMD UG934 — READY/VALID Handshake

Essayez vous-même

Le tampon contient A et une entrée B attend avec in_valid=1. out_ready vaut 0 au premier front puis 1 au suivant. Que deviennent A et B, et jusqu'à quand l'émetteur conserve-t-il B ?

Lire l’explication

Au premier front, in_ready=0 : A reste et B n'est pas accepté. L'émetteur conserve B et in_valid=1. Au suivant, in_ready=1 : A est transféré et B stocké simultanément. Après ce front, B est présenté en sortie, mais n'a pas encore été transféré ; il le sera à un front ultérieur avec out_valid=out_ready=1.

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