Un squelette de code
Le code départ¶
Le code de départ est le suivant:
`default_nettype none
module avalon_bram #(parameter RAM_ADD_W = 8, BURSTCOUNT_W = 4 ) (
// Avalon interface for an agent
avalon_if.agent avalon_a
);
// a vous de jouer a partir d'ici
endmodule
-
Le code (avalon_bram.sv) du contrôleur de mémoire n'a qu'un seul port d'entrée/sortie: le bus Avalon, défini par une interface SystemVerilog.
-
Le code agit comme un agent Avalon et se connecte en conséquence au modport agent de l'interface avalon_if. La définition complète de l'interface se trouve dans le fichier avalon_if.sv.
-
Le port de connection à l'interface Avalon est nommé avalon_a. Tous les signaux de l’interface seront donc accessibles par la syntaxe avalon_a.xxx ou xxx est le nom du signal voulu.
-
Enfin, le code doit être paramètrable:
- RAM_ADD_W définit le nombre de bits nécessaires à l'addressage de la mémoire BRAM interne du module. La taille de la mémoire (nombre de motes de 32 bits) devra donc être calculée à partir de cette valeur.
- BURST_COUNT définit le nombre de bits utilisés pour coder la longueur maximale du burst dans l'interface Avalon.
La liste des entrées/sorties¶
Le tableau suivant indique les signaux accessibles par l’agent Avalon. Le signal burstcount sera ignoré dans la partie 1.
Nom | Type | Bits | Commentaire | Utilisation |
---|---|---|---|---|
clk | input | 1 | Horloge du bus | |
reset | input | 1 | Initialisation du bus (actif à l’état haut) | |
address | input | 32 | Adresse | |
byteenable | input | 4 | Masque de sélection des octets à écrire | |
read | input | 1 | Requête de lecture | |
write | input | 1 | Requête d’écriture | |
writedata | input | 32 | Donnée écrite par l’hôte | |
burstcount | input | BURSTCOUNT_W | Longueur du burst (1 si pas de burst) | |
readdata | output | 32 | Donnée renvoyée par l’agent | |
waitrequest | output | 1 | Demande d’attente de l’agent | |
readdatavalid | input | 1 | Signalement, par l’agent, du retour d’une donnée lue |