Cette section présente la façon avec laquelle vous pouvez ajouter un esclave à la structure du SoC et donne un exemple simple de modèle d’esclave WishBone.
Pour commencer on vous propose un esclave simple, celui-ci contient un compteur de requêtes qui s’incrémente à chaque écriture. On peut récupérer la valeur de ce compteur en lisant à n’importe quelle adresse dans la plage d’adresses réservées à l’esclave WishBone.
Dans le sous-dossier IPs/wb_simple_slave vous trouverez
les trois fichiers suivants:
.cpp contenant le code du module.sd contenant la description des dépendances
pour l’outilsoclib-cc.top.cpp:#include "wb_simple_slave.h"maptab.add(Segment("wb_slave" , WBS_BASE , WBS_SIZE , IntTab(3), false));N’oubliez pas de définir les adresses dans le fichier
segmentation.h.
soclib::caba::WbSignal<wb_param> signal_wb_slave("signal_wb_slave");soclib::caba::WbInterco<wb_param> wbinterco("wbinterco",maptab, 1,4);soclib::caba::WbSimpleSlave simple_slave ("WB_simple_slave");
simple_slave.p_clk (signal_clk);
simple_slave.p_resetn (signal_resetn);
simple_slave.p_wb (signal_wb_slave);
...
wbinterco.p_to_slave[3](signal_wb_slave);Il faut modifier le fichier de description de plateforme utilisé par soclib-cc (platform_desc) en y ajoutant l’esclave à la liste des modules utilisés.
Uses('caba:wb_simple_slave'),
Le nom du module pour soclib-cc est celui qui est
indiqué dans le fichier .sd.
De plus, pour que l’outil soclib-cc le retrouve, il faut
donner le chemin vers le répertoire qui contient le fichier
.sd de l’esclave. Ceci peut être fait en lui passant le
chemin avec l’option -I. soclib-cc cherche
récursivement aussi dans les sous-répertoires.
Modifiez éventuellement le Makefile où une variable
SOCLIB_INCLUDES est déjà prévue.
Pour tester l’esclave WishBone, vous pouvez modifier le fichier le
programme principal (soft/main.c).
Faites des lectures/écritures aux adresses réservées à l’esclave et observez le résultat sur la console et sur les traces de simulation.
Vous pouvez par exemple:
*((volatile unsigned int*) WB_TARGET) = valeur;
valeur = *((volatile unsigned int*) WB_TARGET);
N’oubliez pas de définir WB_TARGET à partir de
WBS_BASE et WBS_SIZE.