目次
- 1 1. Introduction
- 2 2. Types de données de base en Verilog
- 3 3. Concepts de base des tableaux
- 4 4. Utilisation des tableaux multidimensionnels
- 5 5. Modélisation de la mémoire avec des tableaux
- 6 6. Améliorations des tableaux en SystemVerilog
- 7 7. Bonnes pratiques pour les opérations sur les tableaux
- 8 8. Questions Fréquemment Posées (FAQ)
- 8.1 Q1. J’obtiens une erreur lors de l’utilisation de tableaux multidimensionnels en Verilog. Pourquoi ?
- 8.2 Q2. Si je décris la RAM en utilisant des tableaux en Verilog, cela fonctionnera-t-il sur du matériel ?
- 8.3 Q3. Puis-je utiliser les tableaux dynamiques, tableaux associatifs ou files d’attente de SystemVerilog dans du matériel réel ?
- 9 9. Conclusion
1. Introduction
Verilog est largement utilisé en tant que langage de description matérielle (HDL) et est indispensable dans la conception de circuits pour le développement de FPGA et ASIC. Pour concevoir efficacement avec Verilog, une compréhension solide des tableaux est cruciale. En tirant parti des tableaux, vous pouvez gérer des collections de données de manière concise et intuitive, ce qui améliore la lisibilité et la maintenabilité de vos descriptions de circuits. Les tableaux sont particulièrement efficaces pour regrouper plusieurs signaux ou représenter des structures de mémoire telles que la RAM. Cet article se concentre sur le mot-clé « tableaux Verilog » et fournit une explication complète allant des bases de la définition de tableau aux techniques d’application pratiques. Nous couvrirons les types de tableaux, les améliorations SystemVerilog, les erreurs courantes et les FAQ pour aider à approfondir votre compréhension. Même les débutants trouveront ce guide accessible, car nous incluons des exemples de code pratiques tout au long. Lisez jusqu’à la fin pour un aperçu complet.2. Types de données de base en Verilog
Avant de travailler avec des tableaux en Verilog, il est essentiel de comprendre les types de données fondamentaux. Verilog fournit plusieurs types de données clés pour gérer les signaux logiques utilisés dans la conception de circuits.Différence entre reg et wire
Les types de données les plus couramment utilisés en Verilog sont « reg » (registre) et « wire ». Ils doivent être utilisés de manière appropriée en fonction du comportement des signaux logiques.- type wire Un wire est utilisé comme une ligne de connexion entre modules ou circuits. Il doit toujours être piloté par un autre signal, et les affectations sont effectuées à l’aide de l’instruction
assign. Convient aux sorties de circuits combinatoires. Exemple :
wire a;
assign a = b & c;
- type reg Un reg est utilisé comme une variable pour stocker temporairement des valeurs. Il est affecté à l’intérieur de blocs de processus tels que
always, et est généralement utilisé pour modéliser des éléments de stockage (verrous ou bascules). Exemple :
reg q;
always @(posedge clk) begin
q <= d;
end
Types de données utilisables dans les tableaux
En Verilog, les tableaux sont souvent définis en utilisant le typereg, bien que des tableaux wire puissent également être utilisés dans certains cas. Cependant, les versions antérieures de Verilog ne prenaient pas en charge les tableaux multidimensionnels. Cette limitation a été considérablement améliorée dans SystemVerilog.
Voici un exemple simple de syntaxe de tableau :reg [7:0] data_array [0:15]; // An array storing 16 elements, each 8 bits wide
En comprenant les bases des types de données, vous pouvez éviter la confusion lors de la déclaration et de l’utilisation des tableaux. Une mauvaise utilisation de reg et wire peut entraîner des erreurs de simulation ou de synthèse, soyez donc prudent.3. Concepts de base des tableaux
En Verilog, un tableau est utilisé lorsque vous souhaitez gérer collectivement plusieurs signaux du même type. Les tableaux facilitent l’organisation des signaux, améliorant la lisibilité et la réutilisabilité du code.Déclaration des tableaux
Verilog prend principalement en charge les tableaux unidimensionnels. La syntaxe est la suivante :reg [bit-width] array_name [index-range];
Exemple :reg [7:0] data_array [0:15]; // An array of 16 elements, each storing 8-bit data
Dans ce cas, data_array possède 16 éléments indexés de 0 à 15, chaque élément stockant une valeur de 8 bits (1 octet).Accès aux éléments de tableau
Vous pouvez accéder à chaque élément d’un tableau en spécifiant son numéro d’index. Similaire à C, les indices de tableau commencent à 0.data_array[0] = 8'hFF; // Assign hexadecimal FF to the first element
data_array[1] = 8'd12; // Assign decimal 12 to the second element
Vous pouvez également utiliser une boucle à l’intérieur d’un bloc always pour initialiser ou manipuler des tableaux.integer i;
always @(posedge clk) begin
for (i = 0; i < 16; i = i + 1) begin
data_array[i] <= 8'd0;
end
end
Avantages des tableaux
- Traitement par lots : Avec une boucle
for, vous pouvez appliquer la même opération à plusieurs signaux à la fois. - Circuits structurés : Les tableaux aident à organiser plusieurs registres ou signaux, en gardant la représentation du circuit claire.
- Modélisation de mémoire : Vous pouvez implémenter des structures de mémoire simples telles que la RAM ou la ROM (expliqué dans le chapitre suivant).
Points à noter
En Verilog, vous ne pouvez pas attribuer une valeur à tout le tableau directement (par ex.,data_array = value). Au lieu de cela, les opérations doivent être effectuées élément par élément. De plus, seuls les tableaux unidimensionnels étaient officiellement pris en charge dans les premières versions de Verilog, ainsi pour les tableaux multidimensionnels vous avez besoin de Verilog 2001 ou SystemVerilog.4. Utilisation des tableaux multidimensionnels
Les tableaux en Verilog simplifient la conception et aident à organiser les structures de circuit. En utilisant des tableaux multidimensionnels, vous pouvez gérer efficacement des structures de données plus complexes. Cependant, notez que les anciennes versions de Verilog (IEEE 1364-1995) ne prenaient pas en charge les tableaux multidimensionnels. Ils ont été officiellement introduits dans Verilog 2001. Pour encore plus de flexibilité, SystemVerilog est recommandé.Déclaration de tableaux multidimensionnels
Depuis Verilog 2001, vous pouvez définir des tableaux multidimensionnels en spécifiant plusieurs indices pour une même variable. La syntaxe de base est :reg [7:0] matrix [0:3][0:3]; // Defines a 4×4 matrix of 8-bit elements
Cette déclaration crée un tableau 2D nommé matrix, contenant 16 éléments, chacun de 8 bits de largeur.Accès et affectation d’éléments
Vous pouvez accéder et affecter des éléments spécifiques d’un tableau multidimensionnel en utilisant des indices :matrix[0][0] = 8'hA5;
matrix[2][3] = 8'd255;
Utilisation des boucles for
Les tableaux multidimensionnels peuvent être manipulés à l’aide de bouclesfor imbriquées. Exemple d’initialisation :integer i, j;
always @(posedge clk) begin
for (i = 0; i < 4; i = i + 1) begin
for (j = 0; j < 4; j = j + 1) begin
matrix[i][j] <= 8'd0;
end
end
end
Applications des tableaux multidimensionnels
- Utile dans les conceptions nécessitant des opérations matricielles ou le traitement de filtres.
- Peut être appliqué en traitement d’image ou traitement du signal numérique (DSP), pour la gestion de données au niveau des pixels.
- Utilisé dans les structures de blocs ROM/RAM et pour organiser des paires adresse-données.
Limitations et considérations
- Vérifiez la compatibilité des outils de synthèse, car certains outils peuvent ne pas prendre pleinement en charge les tableaux multidimensionnels.
- Des restrictions peuvent s’appliquer lorsqu’ils sont combinés avec des instanciations ou des interfaces.
- Comprenez les différences avec SystemVerilog pour éviter les problèmes de compatibilité (expliqué plus tard).

5. Modélisation de la mémoire avec des tableaux
En Verilog, vous pouvez modéliser des structures de mémoire simples à l’aide de tableaux. Cela vous permet de décrire et de simuler des circuits de stockage tels que la RAM et la ROM de manière concise et flexible. En particulier, les modèles de mémoire basés sur des tableaux unidimensionnels sont fréquemment utilisés dans la conception de CPU et les systèmes de communication.Syntaxe de base pour les modèles de mémoire
L’exemple suivant représente une RAM simple avec des mots de 32 bits et 1024 adresses (0–1023) :reg [31:0] memory [0:1023]; // 32-bit × 1024-word memory
Cette déclaration crée un tableau nommé memory, où chaque indice (adresse) stocke un mot de 32 bits.Écriture et lecture de la mémoire
Les opérations de lecture/écriture de mémoire utilisant des tableaux peuvent être décrites comme suit :// Write operation
always @(posedge clk) begin
if (we) begin
memory[addr] <= data_in;
end
end
// Read operation
assign data_out = memory[addr];
Points clés :- Les opérations d’écriture sont synchrones avec
posedge clket conditionnelles (contrôlées parwe, enable d’écriture). - Les opérations de lecture sont généralement implémentées avec
assignpour des lectures combinatoires (asynchrones).
Initialisation de la mémoire
Pour les bancs de test ou la configuration d’un état initial, vous pouvez initialiser les tableaux à l’intérieur d’un blocinitial :integer i;
initial begin
for (i = 0; i < 1024; i = i + 1) begin
memory[i] = 32'd0;
end
end
Vous pouvez également charger des valeurs initiales à partir d’un fichier externe en utilisant $readmemh ou $readmemb :initial begin
$readmemh("rom_init.hex", memory); // Initialize from a hex file
end
Cas d’utilisation pratiques
- Fichiers de registres dans les CPU ou microcontrôleurs
- Simulation comportementale de la Block RAM (BRAM) à l’intérieur des FPGA
- Vérification du comportement de la mémoire cache
- Simulation de la lecture de données ROM
Points à noter
- À mesure que la taille du tableau augmente, le temps de simulation et les ressources de synthèse augmentent également.
- Choisissez le timing de lecture (synchrone vs. asynchrone) avec soin en fonction des spécifications du design et des outils.
- Lors du ciblage de la synthèse, suivez les règles d’inférence de mémoire spécifiques recommandées par le fournisseur de l’outil.
6. Améliorations des tableaux en SystemVerilog
Jusqu’à Verilog 2001, les fonctionnalités des tableaux étaient limitées, rendant souvent les conceptions lourdes. Pour y remédier, SystemVerilog a introduit des améliorations significatives, permettant une gestion des tableaux plus flexible et puissante. Cette section explique les trois principaux types de tableaux disponibles en SystemVerilog : tableaux dynamiques, tableaux associatifs et files d’attente. Nous couvrirons leurs caractéristiques et cas d’utilisation.Tableaux dynamiques
Caractéristiques
- La taille du tableau peut être modifiée à l’exécution.
- Utile lorsque la taille est inconnue à l’avance ou variable pendant l’exécution.
Déclaration et exemple
int dyn_array[]; // Declare a dynamic array
dyn_array = new[10]; // Initialize with 10 elements
dyn_array[0] = 100;
Cas d’utilisation
- Stockage temporaire de données dans les bancs de test
- Gestion de tampons de taille variable
Tableaux associatifs
Caractéristiques
- Les indices peuvent être des valeurs arbitraires (entiers, chaînes, etc.).
- Fonctionne comme une table de hachage.
Déclaration et exemple
int assoc_array[string]; // Associative array using strings as keys
assoc_array["id_001"] = 42;
Cas d’utilisation
- Stockage des valeurs de configuration pour les paramètres
- Recherche de valeurs par ID ou nom
Files d’attente
Caractéristiques
- Se comporte comme une structure FIFO (First-In, First-Out).
- Prend en charge une insertion et une suppression faciles, idéal pour les flux de données dynamiques.
Déclaration et exemple
int queue_array[$]; // Declare a queue array
queue_array.push_back(10); // Add element at the end
queue_array.push_front(5); // Add element at the front
int val = queue_array.pop_front(); // Remove element from the front
Cas d’utilisation
- Stockage temporaire de données (tampons FIFO)
- Gestion des événements et des transactions
Comparaison et utilisation
| Type de tableau | Resizable | Type d’index | Meilleur pour |
|---|---|---|---|
| Tableau Dynamique | Oui | Integer | Lorsque la taille est inconnue ou variable |
| Tableau associatif | Oui | N’importe quel (int, string, etc.) | Recherches semblables à une table de hachage |
| Queue | Oui | Automatique (avant/arrière) | Insertion/suppression fréquente |
Points à noter
- Ces tableaux améliorés sont des fonctionnalités propres à SystemVerilog et non disponibles dans Verilog.
- L’étendue du support de synthèse dépend de l’outil, et ils sont principalement utilisés pour les bancs de test.
- Si vous ciblez un FPGA ou un ASIC, vérifiez toujours si ces fonctionnalités sont prises en charge avant l’implémentation.
7. Bonnes pratiques pour les opérations sur les tableaux
Lorsqu’on travaille avec des tableaux en Verilog ou SystemVerilog, se concentrer sur un code efficace et lisible conduit directement à des conceptions matérielles de meilleure qualité. Ce chapitre met en avant les meilleures pratiques pour manipuler les tableaux de manière sûre et efficace.Clarifier l’intention avec des commentaires et des noms
Bien que les tableaux soient évolutifs et pratiques, il n’est pas toujours évident ce que représente chaque élément. Pour éviter la confusion, suivez ces directives :- Utilisez des noms significatifs pour les tableaux :
reg [7:0] sensor_data [0:7]; - Ajoutez des commentaires pour décrire le but ou les unités :
// Stores 8-bit data from 8 sensors
reg [7:0] sensor_data [0:7];
Faire attention aux limites des boucles
Lors de l’utilisation de bouclesfor pour manipuler des tableaux, il est crucial de définir correctement les limites d’index :- Limites supérieures incorrectes → accès hors limites (erreurs logiques ou avertissements du simulateur)
- Décidez soigneusement d’utiliser
<ou<=pour la terminaison de la boucle
integer i;
always @(posedge clk) begin
for (i = 0; i < 8; i = i + 1) begin
sensor_data[i] <= 8'd0;
end
end
Toujours initialiser explicitement
Laisser les tableaux non initialisés peut affecter les résultats de simulation. Cela est particulièrement critique pour les tableaux modélisant la RAM ou les banques de registres. Initialisez toujours explicitement :initial begin
for (i = 0; i < 256; i = i + 1)
mem[i] = 32'd0;
end
En SystemVerilog, les constructeurs ou les boucles foreach permettent une initialisation encore plus simple.Concevoir des Modules Réutilisables
Les conceptions basées sur les tableaux peuvent s’adapter flexiblement aux changements dans le nombre d’instances ou la largeur de bits. Pour maximiser la réutilisabilité, considérez :- Utiliser
parameterpour rendre les tailles de tableaux configurables :
parameter DEPTH = 16;
reg [7:0] buffer [0:DEPTH-1];
- Permettre le passage de paramètres externes améliore la réutilisabilité du module.
Considérer la Synthétisabilité
Lors de l’utilisation de tableaux, prenez toujours en compte la compatibilité avec les outils de synthèse :- Tableaux
regunidimensionnels en Verilog : généralement synthétisables - Tableaux dynamiques/associatifs/file d’attente en SystemVerilog : non synthétisables (pour simulation seulement)
reg traditionnels.Utiliser les Tableaux vs. Modules de Manière Appropriée
Bien que les tableaux puissent réduire la taille du code, les conceptions trop complexes peuvent bénéficier davantage de la division de la fonctionnalité en modules séparés pour la maintenabilité.- Opérations petites et identiques → tableaux avec boucles
for - Fonctionnalité différente ou conceptions à grande échelle → conception modulaire et hiérarchique
8. Questions Fréquemment Posées (FAQ)
Lors de l’utilisation de tableaux en Verilog ou SystemVerilog, les utilisateurs débutants à intermédiaires rencontrent souvent les mêmes obstacles. Ici, nous abordons trois questions courantes sur les « tableaux Verilog », en fournissant des réponses pratiques et des insights issus de l’expérience de conception réelle.Q1. J’obtiens une erreur lors de l’utilisation de tableaux multidimensionnels en Verilog. Pourquoi ?
A1.
Cela se produit parce que Verilog 1995 et les versions antérieures de Verilog 2001 ne supportaient pas du tout les tableaux multidimensionnels ou ne les supportaient que de manière limitée. Par exemple, le code suivant causera une erreur de compilation en Verilog 1995 :reg [7:0] matrix [0:3][0:3]; // Supported only in Verilog 2001 or later
Solution :- Assurez-vous que votre environnement de développement est conforme à Verilog 2001 ou ultérieur .
- Si des limitations persistent, réécrivez en utilisant des tableaux unidimensionnels avec des indices calculés.
reg [7:0] matrix_1d [0:15]; // Flattened 4x4 array, accessed with (i*4 + j)
Q2. Si je décris la RAM en utilisant des tableaux en Verilog, cela fonctionnera-t-il sur du matériel ?
A2.
Oui. La RAM décrite en utilisant des tableaux en Verilog est supportée par la plupart des outils de synthèse. Un exemple courant :reg [31:0] mem [0:255]; // 32-bit × 256-word RAM
Points à surveiller :- L’outil de synthèse doit reconnaître cette description comme une inférence de RAM en bloc .
- Le timing de lecture/écriture (synchrone vs. asynchrone) et le style d’accès doivent suivre des modèles spécifiques ou l’outil peut ne pas inférer la mémoire correctement.
- Suivez le guide de synthèse fourni par votre fournisseur FPGA/ASIC.
- Si le comportement diffère entre la simulation et le matériel, vérifiez les logs et déboguez étape par étape.
Q3. Puis-je utiliser les tableaux dynamiques, tableaux associatifs ou files d’attente de SystemVerilog dans du matériel réel ?
A3.
En général, les tableaux dynamiques, tableaux associatifs et files d’attente ne sont pas synthétisables (simulation seulement). Bien qu’ils fournissent un codage flexible, ils ne peuvent pas être mappés directement à la logique matérielle. Par conséquent, ces tableaux sont principalement utilisés pour :- Stockage temporaire de données dans les bancs de test
- Implémentations de randomisation ou de scoreboard dans les environnements de vérification
- Descriptions de transactions complexes
- Tout code de conception utilisant ces types de tableaux sera ignoré ou causera des erreurs dans les outils de synthèse.
- Si une implémentation matérielle est requise, convertissez-les en tableaux
regou unidimensionnels de longueur fixe.
9. Conclusion
Dans cet article, nous nous sommes concentrés sur le mot‑clé « tableaux Verilog » et avons expliqué leur utilisation des bases aux applications avancées. Maîtriser les tableaux en conception de circuits contribue directement à l’efficacité, la lisibilité et la maintenabilité.Points clés à retenir
- En comprenant les types de données de base Verilog (reg et wire), vous pouvez éviter les erreurs lors de la manipulation des tableaux.
- Les tableaux unidimensionnels sont des structures essentielles pour regrouper des données et modéliser la mémoire.
- Les tableaux multidimensionnels sont pris en charge depuis Verilog 2001 et versions ultérieures, permettant des conceptions de type matrice.
- SystemVerilog introduit des structures flexibles telles que les tableaux dynamiques, les tableaux associatifs et les files d’attente (principalement pour la simulation et la vérification).
- En suivant les meilleures pratiques de gestion des tableaux (initialisation, nommage, réutilisabilité, considérations de synthèse), vous pouvez écrire un code de meilleure qualité.
Conseils pratiques
Les tableaux sont puissants, mais ils ne doivent pas être utilisés aveuglément pour tout. Lors de l’écriture de code synthétisable ou en collaboration d’équipe, respectez toujours les contraintes et les guides de style. Les fonctionnalités avancées des tableaux de SystemVerilog doivent être utilisées en pensant à la simulation, afin d’en maximiser les avantages. Les bons concepteurs savent choisir la bonne structure pour le bon usage.Sujets suivants recommandés
Si vous maîtrisez maintenant les bases des tableaux, nous vous recommandons d’explorer les sujets connexes suivants :- Utiliser les instructions
generatepour la génération dynamique de circuits avec des tableaux - Combiner
interfaceavec des tableaux pour la conception de bus - Implémenter des FIFO, des tampons circulaires et des optimisations de ROM en utilisant des tableaux



