Un projet complet de démonstration de cocotb 2.0.1 avec 3 exemples pratiques de vérification matérielle en VHDL. Idéal pour comprendre les concepts clés : simulation hardware, interfaces AXI-Stream, et traitement d'image en temps réel.
- Aperçu
- Prérequis
- Installation
- Les 4 Démos
- Utilisation
- Architecture du projet
- Résolution de problèmes
Ce projet démontre 4 scénarios de test matériel avec cocotb :
| # | Démo | Description | Concept clé |
|---|---|---|---|
| 1 | 🔄 Compteur | Contrôle d'horloge et arrêt dynamique sur condition | Event-based simulation |
| 2 | 📊 AXI-Stream | Interface de flux de données avec gain 2x + Matplotlib | Protocol verification |
| 3 | 🖼️ Image Pipeline | Traitement multi-étages (RGB→BW→Inverse) | Signal hierarchy |
| 4 | 🎮 Sandbox | Template prêt à modifier pour vos propres designs | Learn & Experiment |
Tous les tests passent ✅ sur GHDL 7.0.0-dev avec cocotb 2.0.1
- Linux ou Windows 10+
- Python 3.11+
- Git
- GHDL 7.0.0+ : Installation
- Miniconda/Anaconda : Installation
# Vérifier GHDL
ghdl --version
# Vérifier Python
python --version
# Vérifier Conda
conda --versiongit clone https://github.com/Vstick/Cocotb_exemple.git
cd Cocotb_exempleconda env create -f environment.yml
conda activate cocotb_demoSi vous avez des erreurs de DLL sur Windows, vérifiez que GHDL est dans votre PATH :
# Ajouter GHDL au PATH permanent (Windows)
$env:PATH += ";C:\Users\<votre_user>\ghdl\bin;C:\Users\<votre_user>\ghdl\lib"Description : Un compteur 8-bit avec horloge générée par cocotb qui s'arrête automatiquement quand le compteur atteint 32.
Concepts :
- Génération d'horloge avec
Clock() - Vérification de signaux
- Arrêt conditionnel de la simulation
Fichiers :
- VHDL:
01-Compteur/counter.vhd - Test:
01-Compteur/test_counter.py
Résultats :
✅ TEST PASSÉ - 660.00ns
🎯 Cible atteinte : 32! Arrêt de la simulation.
Description : Un module matériel qui reçoit des données via AXI-Stream, les multiplie par 2, et retourne le résultat. Validation avec graphique matplotlib.
Concepts :
- Interface AXI-Stream (tvalid/tready/tdata)
- Abstraction du bus avec classe helper
- Génération de graphiques de validation
Fichiers :
- VHDL:
02-AXI/axi_gain.vhd - Test:
02-AXI/test_axi_data.py - Helper:
axi_helper.py(classeAxiStreamBusSimple)
Résultats :
✅ TEST PASSÉ - 150.00ns
📊 Graphique généré: 02-AXI/sim_build/resultat_verification.png
Graphique : Affiche côte à côte les données d'entrée et le résultat (x2)
Description : Pipeline 3 étages :
- RGB to Grayscale : Convertit RGB en niveaux de gris
- Pixel Invert : Inverse les couleurs
Injection d'image 64x64, traitement pixel par pixel, sortie 3 images PNG.
Concepts :
- Hiérarchie de signaux (accès via
dut.submodule.signal.value) - Traitement d'images en temps réel
- Capture de signaux internes
Fichiers :
- VHDL:
03-Image/image_top.vhd,rgb_to_bw.vhd,pixel_invert.vhd - Test:
03-Image/test_image_pipeline.py
Résultats :
✅ TEST PASSÉ - 40990.00ns
🖼️ Images générées:
- input_color.png (original)
- output_intermediaire_bw.png (après RGB→BW)
- output_final_inverse.png (après inversion)
Description : Un template prêt à modifier pour que vous puissiez expérimenter avec vos propres designs VHDL. Inclut horloge, reset, et structure de test minimaliste.
Concepts :
- Setup minimal (clock, reset)
- Structure de test réutilisable
- Point de départ pour nouveaux projets
- Plateforme d'apprentissage pratique
Fichiers :
- VHDL:
04-Sandbox/sandbox_top.vhd - Test:
04-Sandbox/test_sandbox.py - Doc:
04-Sandbox/README.md(tutoriel complet)
Résultats :
✅ TEST PASSÉ - 170.00ns
🎮 Prêt à modifier pour vos designs !
Idées d'expérimentation :
- Compteur simple
- Multiplexeur
- Registre à décalage
- Machine à états
- Accumulateur
Consulter 04-Sandbox/README.md pour des exemples détaillés et des templates.
Exécuter une démo spécifique :
# Démo 1 : Compteur
python run_testbench.py --demo 1
# Démo 2 : AXI-Stream
python run_testbench.py --demo 2
# Démo 3 : Image Processing
python run_testbench.py --demo 3
# Démo 4 : Sandbox (votre terrain de jeu!)
python run_testbench.py --demo 4Démo interactive avec visualisations inline :
jupyter notebook demo.ipynbFonctionnalités du notebook :
- ✅ Exécution des 4 démos dans des cellules séparées
- 📊 Affichage du graphique Matplotlib pour la démo 2
- 🖼️ Affichage des 3 images côte à côte pour la démo 3
- 🎮 Test du sandbox avec instructions de modification pour la démo 4
- 📝 Logs détaillés de chaque simulation
Cocotb_exemple/
├── README.md # Ce fichier
├── environment.yml # Dépendances conda
├── config_demo.json # Configuration (chemins GHDL, env)
├── run_testbench.py # Script principal orchestrateur
├── axi_helper.py # Helper AXI-Stream (classe AxiStreamBusSimple)
├── demo.ipynb # Notebook Jupyter interactif
│
├── 01-Compteur/
│ ├── counter.vhd # Compteur 8-bit
│ ├── test_counter.py # Test cocotb
│ └── sim_build/ # Résultats simulation (ignoré par git)
│
├── 02-AXI/
│ ├── axi_gain.vhd # Module gain x2 (AXI-Stream)
│ ├── test_axi_data.py # Test cocotb
│ └── sim_build/
│ └── resultat_verification.png # Graphique matplotlib
│
└── 03-Image/
├── image_top.vhd # Top-level du pipeline
├── rgb_to_bw.vhd # Étage RGB → Grayscale
├── pixel_invert.vhd # Étage inversion
├── test_image_pipeline.py # Test cocotb
└── sim_build/
├── input_color.png # Image originale
├── output_intermediaire_bw.png # Après RGB→BW
└── output_final_inverse.png # Résultat final
│
├── 04-Sandbox/
│ ├── README.md # Guide sandbox avec idées d'expérimentation
│ ├── sandbox_top.vhd # Template VHDL (à modifier!)
│ ├── test_sandbox.py # Template test (à modifier!)
│ └── sim_build/ # Résultats simulation
│
├── tuto/ # 📚 Tutoriels cocotb
│ ├── README.md # Index et parcours d'apprentissage
│ ├── 01-SIGNAL_HIERARCHY.md # Hiérarchie des signaux
│ ├── 02-TIMING_AND_SYNCHRONIZATION.md # Déclencheurs et timing
│ ├── 03-SIGNAL_OPERATIONS.md # Manipulation de signaux
│ ├── 04-TESTING_PATTERNS.md # Patterns de test
│ ├── 05-CLOCK_AND_RESET.md # Gestion horloge et reset
│ └── 06-DEBUGGING_AND_INSPECTION.md # Débogage et inspection
│
└── SIGNAL_HIERARCHY.md # Guide avancé hiérarchie (voir tuto/)
Exemple sous Windows :
{
"ghdl_bin": "C:/Users/maraninc/ghdl/bin",
"ghdl_lib": "C:/Users/maraninc/ghdl/lib",
"conda_env": "c:/Users/maraninc/miniconda3/envs/cocotb_demo"
}Exemple sous Linux (les chemins d'accès doivent être adaptés à votre environnement) :
{
"ghdl_bin": "/usr/bin",
"ghdl_lib": "/usr/lib",
"conda_env": "/home/leguig/miniconda3/envs/cocotb_demo"
}Modifiez selon votre installation GHDL et conda.
Contient toutes les dépendances Python :
- cocotb 2.0.1 : Framework de vérification
- cocotb-tools : Runner GHDL
- matplotlib : Graphiques
- pillow : Traitement images
- jupyter/notebook : Notebooks interactifs
run_testbench.py
├── load_environment() # Configure PATH + conda
└── run_demo(demo_num)
├── Demo 1: test_counter.py
├── Demo 2: test_axi_data.py → resultat_verification.png
└── Demo 3: test_image_pipeline.py → 3 images PNG
Solution :
conda activate cocotb_demo
pip install cocotb cocotb-toolsCause : cocotbext-axi 0.1.28 incompatible avec cocotb 2.0.1
Solution : Le projet utilise déjà axi_helper.py custom qui remplace la librairie cassée.
Cause : GHDL pas dans PATH
Solution :
# Vérifier GHDL
ghdl --version
# Si erreur, ajouter au PATH
$env:PATH += ";C:\Users\<votre_user>\ghdl\bin;C:\Users\<votre_user>\ghdl\lib"
# Puis relancer
python run_testbench.py --demo 1Cause : Le répertoire sim_build n'existe pas ou chemin incorrect
Solution :
# Vérifier que sim_build existe
dir 03-Image\sim_build
# Si vide, relancer la démo
python run_testbench.py --demo 3Info : C'est un avertissement mineur, les tests fonctionnent correctement.
À corriger dans les sources :
# ❌ Ancien
Clock(dut.clk, 20, units="ns")
# ✅ Nouveau
Clock(dut.clk, 20, unit="ns")Le projet utilise un .gitignore complet pour ignorer :
__pycache__/- Cache Pythonsim_build/- Résultats simulation*.pyc,*.pyo- Fichiers compilés Python.vscode/,.idea/- Dossiers IDE
- ✅ Linux & Windows 10+
- ✅ Python 3.11+
- ✅ cocotb 2.0.1
- ✅ GHDL 7.0.0-dev
- ✅ Jupyter Notebook
| Démo | Temps sim | Real time | Ratio |
|---|---|---|---|
| Compteur | 660ns | 0s | ∞ |
| AXI-Stream | 150ns | 0.12s | 1273 ns/s |
| Image (64x64) | 40990ns | 0.12s | 341 kns/s |
Libre d'utilisation à titre éducatif.
Pour toute question ou problème :
- Vérifiez la section Résolution de problèmes ci-dessus
- Consultez les logs détaillés :
python run_testbench.py --demo X - Vérifiez les issues GitHub du projet