Tableaux dynamiques, queues et tableaux associatifs
Choisir une collection de testbench pour des lots variables, des files de transactions et des résultats indexés.
Des collections pour le testbench
Les collections dynamiques permettent de gérer un nombre de transactions inconnu à la compilation. Elles sont surtout destinées à la vérification et aux modèles de haut niveau, pas au RTL synthétisable.
Trois formes répondent à des besoins différents :
- le tableau dynamique pour une taille allouée à l'exécution ;
- la queue pour ajouter et retirer facilement aux extrémités ;
- le tableau associatif pour indexer des éléments par une clé clairsemée.
Tableau dynamique
int samples[];
samples = new[128];
foreach (samples[i])
samples[i] = i * 2;
$display("count=%0d", samples.size());
samples.delete();new[128] alloue 128 éléments. Une nouvelle allocation peut conserver une partie de l'ancien contenu avec new[new_size](samples). delete() libère le tableau.
Ce format convient lorsqu'un bloc de données possède une taille connue au début d'une opération et qu'un accès direct par indice est fréquent.
Queue
typedef logic [31:0] word_t;
word_t expected_q[$];
expected_q.push_back(32'h1234_5678);
expected_q.push_back(32'hCAFE_BABE);
if (expected_q.size() != 0) begin
word_t expected = expected_q.pop_front();
check_word(expected, observed);
end[$] déclare une queue non bornée. push_back et pop_front donnent le comportement d'une FIFO. On peut aussi utiliser push_front, pop_back, insert et delete.
Une queue est pratique dans un scoreboard lorsque les résultats sortent dans le même ordre que les commandes.
Tableau associatif
logic [31:0] expected_by_id[int unsigned];
expected_by_id[transaction_id] = predicted_value;
if (expected_by_id.exists(response_id)) begin
assert (observed == expected_by_id[response_id]);
expected_by_id.delete(response_id);
end else begin
$error("Unexpected response id %0d", response_id);
endSeules les clés utilisées occupent un élément. Ce format convient aux réponses qui peuvent revenir dans un ordre différent, à condition de disposer d'un identifiant unique.
Les méthodes first, next, last et prev permettent de parcourir les clés. Leur ordre dépend du type d'index, pas de l'ordre d'insertion.
Choisir sans compliquer
Une collection doit refléter le protocole réel. Une queue suffit pour un flux ordonné. Un tableau associatif est utile pour des réponses réordonnées. Ajouter une recherche complexe alors qu'une FIFO suffit rend le scoreboard plus difficile à vérifier que le DUT.
Il faut aussi contrôler les collections vides avant pop_front et vérifier qu'elles sont vides en fin de test. Un élément attendu restant signale souvent une réponse manquante.
À retenir
- Les collections dynamiques vivent principalement dans le testbench.
- Un tableau dynamique offre une zone redimensionnable indexée de façon dense.
- Une queue correspond naturellement à un flux ordonné.
- Un tableau associatif retrouve un résultat par clé.
- Les files et tables doivent être vides ou expliquées à la fin du test.
📝 Tester mes connaissances - Quiz du chapitre