14 / 24 · Concept
Concevoir un registre élastique à un emplacement
Acceptez dans un emplacement vide ou remplacez un élément consommé simultanément.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Déduire ready du stockage disponible
Un tampon à un emplacement contient un bit full et un registre de charge utile. Vide, il peut accepter une entrée même si le récepteur est bloqué. Plein, il peut accepter un remplacement si le récepteur consomme la sortie existante au même front. Ainsi, input-ready vaut !full OU output-ready et output-valid vaut full. Ce tampon enregistré n’a pas de passage combinatoire direct des données.
Si input-ready est haut, le prochain full égale input-valid. Capturez la charge utile lorsqu’une entrée existe ; sinon, videz l’emplacement. Si input-ready est bas, conservez full et la charge utile. Effacer full simplement parce qu’une sortie a été transférée perd un remplacement simultané. Capturer sur input-valid seul écrase un emplacement plein et bloqué.
module elastic_byte (
input logic clk, rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data, in_tag,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data, out_tag
);
logic full;
assign in_ready = !full || out_ready;
assign out_valid = full;
always_ff @(posedge clk) begin
if (rst) full <= 1'b0;
else if (in_ready) begin
full <= in_valid;
if (in_valid) begin
out_data <= in_data;
out_tag <= in_tag;
end
end
end
endmodule| Ancien full | out-ready | in-valid | Action |
|---|---|---|---|
| 0 | 0 | 1 | Stocker l’entrée |
| 1 | 0 | 1 | Refuser l’entrée et conserver la sortie |
| 1 | 1 | 1 | Livrer l’ancien élément et stocker son remplacement |
| 1 | 1 | 0 | Livrer l’ancien élément et vider l’emplacement |
Stockez tag0, y9 au front 0. Bloquez au front 1. Au front 2, consommez tag0 et stockez tag1, y12 ; l’emplacement reste plein. Au front 3, consommez tag1 et videz-le s’il n’y a aucune entrée. Le remplacement permet une transaction par cycle.
Connecter plusieurs étages crée un chemin combinatoire ready vers l’amont. Enregistrer ready exige du stockage supplémentaire pour les arrivées précédant la prise d’effet du blocage. Vérifiez séparément les restrictions de chemins combinatoires propres à un bus. Quelle que soit la largeur de charge utile, stockez les données et tous les champs associés sous la même condition, puis vérifiez les quatre cas de mise à jour.
Essayez vous-même
À un front avec full=1, out-ready=1 et in-valid=1, consommez tag7 et proposez tag8. Quels sont le prochain full et out-tag ? Que se passe-t-il si full est toujours effacé à la consommation ?
Lire l’explication
Input-ready est haut : stockez donc tag8 et gardez full=1. Out-tag devient 8. Toujours effacer full perd tag8 après son acceptation.