7 / 24 · Concept
Contrats temporels des requêtes et réponses mémoire
Distinguez les lectures synchrones, les étiquettes retardées et les collisions à une même adresse.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Une mémoire est plus qu’un grand tableau de registres
Une interface mémoire nécessite un contrat temporel en plus de sa capacité. Une lecture asynchrone modifie la sortie combinatoire lorsque son adresse change. Une lecture synchrone échantillonne l’adresse à un front et modifie ensuite la sortie. Ces modèles nécessitent des ordonnancements différents. L’inférence d’une ressource mémoire du composant dépend aussi du style de codage et de l’outil cible. Ici, nous définissons seize entrées sur huit bits avec une lecture synchrone.
Échantillonnez l’adresse et l’étiquette au front k. Les données correspondantes et l’étiquette retardée apparaissent après ce front ; leur première possibilité de consommation est le front k+1. Une lecture d’un cycle ne signifie pas une réponse combinatoire immédiate. Le signal de validité de la réponse doit subir le même retard. Associer une valeur retardée à l’étiquette d’entrée courante rompt la correspondance de requêtes successives.
logic [7:0] mem [0:15];
logic [7:0] rd_data;
logic [3:0] rd_tag;
logic rd_valid;
always_ff @(posedge clk) begin
if (wr_en) mem[wr_addr] <= wr_data;
rd_valid <= req_valid;
if (req_valid) begin
rd_data <= mem[req_addr];
rd_tag <= req_tag;
end
if (rst) rd_valid <= 1'b0;
endDans ce modèle comportemental, lire et écrire simultanément à une adresse renvoie l’ancienne valeur, car les affectations non bloquantes lisent l’état précédent. Les primitives mémoire réelles ont des modes de collision et des restrictions explicites ; consultez les modes de lecture/écriture d’AMD UG901 et vérifiez le mode souhaité par rapport à la cible et au résultat de synthèse. Réinitialiser valid n’initialise pas le tableau.
| Front | Requête acceptée | Effet |
|---|---|---|
| 2 | addr=3, tag=7 | Capturer l’ancien mem[3]=42 |
| 3 | addr=4, tag=8 | Consommer 42, 7 et capturer la valeur suivante |
| 4 | Aucune requête | Effacer le signal de validité de la réponse |
Cet ordonnancement suppose que le consommateur ne se bloque jamais. S’il se bloque au front 3, la réponse suivante peut écraser rd_data. Ajoutez du stockage pour les réponses ou limitez les requêtes selon la capacité disponible, en incluant les réponses déjà en transit. Initialisez explicitement la mémoire de test avant de vérifier les valeurs. Vérifiez la correspondance entre adresse et étiquette, et pas seulement les données de réponse ; une valeur correcte associée à la mauvaise requête reste un échec.
Essayez vous-même
Avec mem[3]=42, lisez l’adresse 3 et écrivez-y 99 au même front. Que place ce modèle dans rd_data et quelle est la nouvelle valeur mémoire ? Que faut-il prévoir pour les blocages de sortie ?
Lire l’explication
rd_data devient 42, tandis que mem[3] devient 99. Les deux affectations lisent l’état précédent. Les blocages nécessitent du stockage de réponses et un contrôle d’admission comptabilisant les réponses en transit. Vérifiez séparément le mode de collision de la mémoire cible réelle.