Altifigence Academy

14 / 24 · Concept

Ready/valid et état bloqué

L’étage de sortie conserve A avec out_ready=0 tandis que l’entrée B est valide. Que doivent faire l’étage et le producteur au front suivant ?

Avancer uniquement sur un transfert

Un producteur active valid lorsque son élément courant est disponible. Un consommateur active ready lorsqu’il peut l’accepter. À un front montant où les deux sont actifs, un transfert a lieu. Faites avancer les coordonnées du pixel, l’état des tampons de lignes et l’entrée d’accumulation associée uniquement à ce moment. Avancer sur valid seul perd des données pendant une pause du consommateur ; avancer sur ready seul compte une entrée inexistante.

Tant que valid est haut et ready bas, conservez les mêmes données et valid. Pour continuer à accepter une entrée lorsque la sortie est bloquée, fournissez du stockage et déduisez la disponibilité de sa capacité restante. L’exemple RTL est un étage à un élément : il accepte un nouvel élément lorsqu’il est vide ou lorsque l’élément courant peut sortir.

Séquence de transfert détaillée

Pour les cycles zéro à quatre, valid=[0, 1, 1, 1, 1] et ready=[0, 1, 0, 1, 1] donnent fire=[0, 1, 0, 1, 1]. Cinq horloges acceptent trois pixels. L’élément bloqué au cycle deux reste jusqu’au cycle trois. Un compteur de lignes de largeur quatre n’a pas terminé sa première ligne. Compter les horloges au lieu des transferts décale toutes les coordonnées ultérieures des fenêtres.

Si l’étage conserve A avec out_valid haut et out_ready bas, in_ready est bas et A reste stocké. Lorsque out_ready devient haut, il peut envoyer A et accepter B au même front. Sans entrée de remplacement, il efface la validité de sortie. Documentez si le remplacement simultané est permis et la latence impliquée.

Reset efface la validité et les données. Une nouvelle image nécessite une réinitialisation définie des coordonnées et de la validité des fenêtres. Recevoir la dernière entrée diffère de consommer la dernière sortie ; activer done trop tôt peut permettre à une nouvelle image d’écraser le travail en cours.

Le code est un étage de transfert, et non un moteur complet de convolution. Si votre parcours installé prend en charge l’édition et la simulation SystemVerilog, créez manuellement un fichier et testez la stabilité sous pause et le remplacement simultané. Aucune exécution de simulateur RTL n’est revendiquée ici. Le diagramme illustre fire ; ce n’est pas une trace matérielle capturée.

SystemVerilog
module sample_stage (
  input logic clk, reset,
  input logic in_valid,
  output logic in_ready,
  input logic signed [7:0] in_data,
  output logic out_valid,
  input logic out_ready,
  output logic signed [7:0] out_data
);
  assign in_ready = !out_valid || out_ready;
  always_ff @(posedge clk) begin
    if (reset) begin
      out_valid <= 1'b0;
      out_data <= '0;
    end else if (in_ready) begin
      out_valid <= in_valid;
      if (in_valid) out_data <= in_data;
    end
  end
endmodule
Transferts acceptés pendant une pause
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
clockp....
valid01111
ready01011
fire01011

Essayez vous-même

L’étage de sortie conserve A avec out_ready=0 tandis que l’entrée B est valide. Que doivent faire l’étage et le producteur au front suivant ?

Lire l’explication

L’étage maintient in_ready bas et conserve A avec out_valid. Le producteur conserve B avec in_valid. Les éléments stables pourront ensuite être transférés exactement une fois.

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