2008-09-15 6 views
6

J'ai un module "observateur" qui utilise actuellement des hiérarchies globales à l'intérieur. J'ai besoin d'instancier une deuxième instance de ceci avec une deuxième hiérarchie globale.Passage de la hiérarchie dans un module Verilog

Actuellement:

module watcher; 
wire sig = `HIER.sig; 
wire bar = `HIER.foo.bar; 
... 
endmodule 

watcher w; // instantiation 

souhaitee:

module watcher(input base_hier); 
wire sig = base_hier.sig; 
wire bar = base_hier.foo.bar; 
... 
endmodule 

watcher w1(`HIER1); // instantiation 
watcher w2(`HIER2); // second instantiation, except with a different hierarchy 

Ma meilleure idée est d'utiliser VPP (le préprocesseur Verilog) à force brute générer deux modules quasi-identiques (une avec chaque hiérarchie) , mais y a-t-il une manière plus élégante?

Répondre

8

Ma préférence est d'avoir un seul module (ou un petit nombre de modules) dans votre testbench qui contient toutes vos sondes mais aucune autre fonctionnalité. Tous les autres modules de votre banc d'essai nécessitant des sondes se connectent alors à ce "module de sonde". Utilisez les interfaces SystemVerilog de préférence aux fils bruts si c'est une option pour vous. Cela contourne votre problème, car aucun observateur n'aura besoin de hiérarchies globales et votre banc d'essai dans son ensemble sera considérablement plus facile à maintenir. Voir le Law of Demeter.

Sinon ... (mais cette hiérarchie met dans vos instanciations ...)

module watcher(sig, bar); 
    input sig; 
    input bar; 
... 
endmodule 

watcher w1(`HIER1.sig, `HIER1.foo.bar); // instantiation 
watcher w2(`HIER2.sig, `HIER2.foo.bar); // second instantiation, except with a different hierarchy 

vous pouvez ensuite aussi:

`define WATCHER_INST(NAME, HIER) watcher NAME(HIER.sig, HIER.foo.sig) 

`WATCHER_INST(w1, `HIER1); 
`WATCHER_INST(w2, `HIER2); 
+0

Merci pour la réponse, et je suis certainement d'accord avec la plupart de vos points en général. Malheureusement, dans ce cas, le module a ~ 100 fils de sonde en interne, donc les convertir en entrées explicites, bien que plus clair, est assez salissant. – pdq

+1

Salut pdq. Je suppose que c'est pourquoi j'ai mentionné les interfaces SV. Vous pouvez au moins les encapsuler dans plusieurs groupes logiques et accéder aux fils depuis l'intérieur de votre module en utilisant la notation par points. – DMC

2

Pouvez-vous utiliser le mot-clé SystemVerilog bind pour lier le module dans chaque hiérarchie qui l'exige? L'utilisation de bind équivaut à instancier un module de la manière habituelle, sauf que vous fournissez un chemin vers la hiérarchie dans laquelle le module est instancié "à distance". :

bind top.my.hier my_module instance_name(.*); 
bind top.my_other.hier my_module instance_name(.*); 

Encore mieux: supposons que chaque hiérarchie à laquelle vous vous liez est une instance distincte du même module. Puis:

bind remote_module my_module instance_name(.*); 

Ce module dans votre lie tous les cas de la cible, peu importe où il est dans la conception. C'est très puissant si votre module est un vérificateur de vérification.

Questions connexes