2 votes

Comment utiliser un paramètre pour ajouter ou supprimer un signal d'une interface système verilog et modport

Voici un extrait d'un code d'interface qui comporte quelques tailles paramétrées. Le quatrième paramètre, HAS_BURST, est quelque chose que j'ai expérimenté, mais qui n'a entraîné que des erreurs de compilation.

En fait, je cherche un moyen d'ajouter ou de retirer un signal d'une interface en fonction d'un paramètre. Existe-t-il un moyen d'avoir une interface générique avec des signaux amovibles ?

interface axi_if 
    #(parameter ID_WIDTH   = 4, 
                ADDR_WIDTH = 40,
                DATA_WIDTH = 64,
                HAS_BURST  = 0) 
    ();

logic                      aw_ready;     
logic                      aw_valid;     
logic [ID_WIDTH-1:0]       aw_bits_id;   
logic [ADDR_WIDTH-1:0]     aw_bits_addr; 
logic [7:0]                aw_bits_len;  
logic [2:0]                aw_bits_size;
generate
if (HAS_BURST)
logic [1:0]                aw_bits_burst;
endgenerate
logic [2:0]                aw_bits_size;

modport slave (  
output aw_ready,
input  aw_valid,
input  aw_bits_id,
input  aw_bits_addr,
input  aw_bits_len,
generate
if (HAS_BURST)
input  aw_bits_burst,
endgenerate
input  aw_bits_size
);

modport master (  
input  aw_ready,
output aw_valid,
output aw_bits_id,
output aw_bits_addr,
output aw_bits_len,
generate
if (HAS_BURST)
output aw_bits_burst,
endgenerate
output aw_bits_size
);
endinterface
`endif

1voto

Steve K Points 1480

Non, il n'y en a pas. Les ports ne sont pas valides dans les blocs de génération. Les paramètres peuvent être utilisés pour ajuster la largeur d'un port mais pas pour le supprimer entièrement. Vous pourriez utiliser un `ifdef pour le compiler de manière conditionnelle mais c'est une solution tout ou rien. Il ne peut pas y avoir des instances avec le signal et d'autres sans.

La présence inconditionnelle du signal est une bonne chose dans de nombreuses situations et c'est la façon la plus simple de gérer ce problème. Reliez toutes les entrées inutilisées au 0 logique et les sorties inutilisées peuvent rester non connectées.

Si aucune de ces options ne fonctionne, il n'y a pas d'autre solution que de définir deux interfaces différentes. Faire cela à la main devient rapidement impossible à maintenir. S'il existe maintenant deux variantes, vous pouvez être sûr qu'une troisième sera bientôt nécessaire, puis une quatrième, une cinquième... De nombreuses sociétés de conception de puces disposent de générateurs de code SystemVerilog qui créent des modules personnalisés pour chaque instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X