Regrouper les signaux d'un protocole, préciser le rôle de chaque bloc et réduire les erreurs de connexion.
Regrouper un protocole
Une interface rassemble les signaux qui forment une même liaison. Elle peut aussi contenir des types, paramètres, fonctions, tâches et assertions liés au protocole.
Au lieu de répéter quatre ports à chaque niveau, un module reçoit une instance de l'interface.
module stream_register ( input logic i_rst, simple_stream_if.sink upstream, simple_stream_if.source downstream); always_ff @(posedge upstream.clk) begin if (i_rst) begin downstream.valid <= 1'b0; downstream.data <= '0; downstream.last <= 1'b0; end else if (upstream.valid && upstream.ready) begin downstream.data <= upstream.data; downstream.last <= upstream.last; downstream.valid <= 1'b1; end else if (downstream.ready) begin downstream.valid <= 1'b0; end end assign upstream.ready = downstream.ready || !downstream.valid;endmodule
Le reset est un port explicite du registre. Il initialise au minimum downstream.valid, afin qu'une transaction inconnue ne soit pas annoncée au démarrage.
Le rôle des modports
Un modport décrit la vue d'un participant. Pour source, valid, data et last sont des sorties, tandis que ready est une entrée. Pour sink, les directions sont inversées.
Cette information aide le compilateur à repérer un signal piloté du mauvais côté. Elle documente aussi le protocole sans devoir relire tous les modules connectés.
Les directions d'un modport sont vues depuis le module qui l'utilise. C'est un point fréquent de confusion lors de la première écriture.
Fixer aussi le moment des échanges
Les modports décrivent qui peut lire ou piloter un signal. Le clocking block décrit quand le testbench l'échantillonne ou le pilote. Dans tb_cb, les entrées sont échantillonnées par défaut un pas de précision avant le front avec #1step, et les sorties sont pilotées au front courant avec #0.
Le testbench attend l'événement du clocking block et accède aux signaux par son nom :
@bus.tb_cb;bus.tb_cb.valid <= 1'b1;bus.tb_cb.data <= value;do @bus.tb_cb; while (!bus.tb_cb.ready);bus.tb_cb.valid <= 1'b0;
Les sorties d'un clocking block se pilotent avec des affectations non bloquantes. Écrire bus.valid à la place de bus.tb_cb.valid contournerait précisément la synchronisation que l'interface fournit.
Un clocking block possède une seule expression d'horloge. Une interface qui traverse plusieurs domaines doit donc définir un clocking block par domaine utile au testbench.
Relier les classes aux signaux
Une classe est créée dynamiquement, alors qu'une interface physique est instanciée statiquement avec le DUT. Une interface virtuelle relie ces deux mondes : c'est un handle vers une instance d'interface existante.
Le type virtuel conserve ici le modport tb. Le driver ne reçoit donc que la vue et le clocking block qui lui sont destinés. Un typedef évite de répéter une déclaration longue et réduit le risque d'oublier le modport.
Instanciation au niveau supérieur
simple_stream_if #(.WIDTH(16)) link (.clk(i_clk));producer u_producer (.bus(link.source));consumer u_consumer (.bus(link.sink));
Une seule instance link contient les signaux. Les modports limitent la vue fournie à chaque module.
Ce qu'une interface ne règle pas
Une interface ne définit pas à elle seule le comportement temporel. Il faut toujours écrire les règles du protocole : quand valid peut changer, quand un transfert a lieu, combien de cycles une donnée reste stable et comment le reset agit.
Les interfaces sont synthétisables dans de nombreux outils modernes, mais certaines limites existent sur les tâches, les paramètres, les tableaux d'interfaces ou les frontières d'IP. Une interface plate et simple est généralement la plus portable.
À retenir
Une interface regroupe les signaux et déclarations d'un protocole.
Un modport donne une vue et des directions propres à un rôle.
Les directions sont exprimées depuis le module utilisateur.
Une interface réduit les connexions répétées, pas le besoin de spécifier le protocole.
Un clocking block centralise l'horloge, l'échantillonnage et le pilotage du testbench.
Une interface virtuelle permet à une classe de travailler avec une interface physique.
Il faut vérifier le support de synthèse aux frontières du projet.