Tableaux, structures et unions
Distinguer dimensions packed et unpacked, regrouper des champs et choisir une représentation adaptée au matériel.
Dimensions packed et unpacked
Une dimension placée avant le nom est packed. Ses bits forment un vecteur contigu sur lequel on peut faire des opérations arithmétiques, des comparaisons ou des sélections de tranches.
Une dimension placée après le nom est unpacked. Elle crée une collection d'éléments séparés.
logic [7:0] bytes [0:3];bytes est ici un tableau unpacked de quatre éléments. Chaque élément est un vecteur packed de 8 bits. bytes[2] sélectionne le troisième octet et bytes[2][7] son bit de poids fort.
Cette différence est importante dans les ports et les mémoires :
module sum4 (
input logic [7:0] i_data [0:3],
output logic [9:0] o_sum
);
always_comb begin
o_sum = {2'b00, i_data[0]} + {2'b00, i_data[1]}
+ {2'b00, i_data[2]} + {2'b00, i_data[3]};
end
endmoduleL'extension explicite évite de perdre les deux bits nécessaires à la somme maximale.
Regrouper des champs
Une structure rassemble des champs qui voyagent ensemble.
typedef struct packed {
logic [15:0] payload;
logic [2:0] channel;
logic last;
} packet_t;
packet_t packet;Avec struct packed, tous les champs forment un seul vecteur. La structure peut être copiée, comparée, passée dans un port ou découpée en bits. L'ordre des champs fixe leur position dans le vecteur, il doit donc être documenté lorsqu'un protocole externe est concerné.
Une structure unpacked est une collection de champs sans obligation de former un vecteur unique. Elle convient bien aux modèles de test, mais sa prise en charge par la synthèse et les ports peut varier.
Les unions demandent de la prudence
Une union fait partager le même stockage à plusieurs représentations.
typedef union packed {
logic [31:0] word;
logic [3:0][7:0] byte_lane;
} word_view_t;Écrire word puis lire byte_lane offre deux vues des mêmes 32 bits. Une union tagged ajoute un suivi du membre actif, surtout utile pour les modèles de haut niveau. Il faut vérifier le support de synthèse avant de l'introduire dans le RTL.
Ports et compatibilité des outils
SystemVerilog autorise des ports qui transportent des structures et des tableaux. Ils réduisent la répétition, mais une frontière destinée à un outil ancien ou à une IP externe peut demander des vecteurs plats.
Une méthode pratique consiste à garder des types riches à l'intérieur du projet et à convertir explicitement aux frontières qui exigent un format plat.
À retenir
- Une dimension packed se trouve avant le nom, une dimension unpacked après.
- Un tableau unpacked décrit une collection, souvent une mémoire ou plusieurs voies.
- Une structure packed forme un vecteur contigu avec des champs nommés.
- Une union fournit plusieurs vues du même stockage.
- La syntaxe du langage et le support réel de l'outil de synthèse ne sont pas toujours identiques.
📝 Tester mes connaissances - Quiz du chapitre