2008-09-15 22 views
6

Tengo un módulo "vigilante" que actualmente usa jerarquías globales dentro de él. Necesito instanciar una segunda instancia de esto con una segunda jerarquía global.Pasar la jerarquía a un módulo Verilog

Actualmente:

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

watcher w; // instantiation 

deseado:

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 

Mi mejor idea es usar VPP (el preprocesador Verilog) a la fuerza bruta generar dos módulos prácticamente idénticos (uno con cada jerarquía) , pero ¿hay una manera más elegante?

Respuesta

8

Mi preferencia es tener un único módulo (o una pequeña cantidad de módulos) en su banco de pruebas que contenga todas las sondas pero ninguna otra funcionalidad. Todos los demás módulos en su banco de pruebas que requieren sondas se conectan a ese "módulo de sonda". Use las interfaces de SystemVerilog con preferencia a los cables sin procesar si esa es una opción para usted. Esto evita su problema ya que ningún observador requerirá jerarquías globales y su banco de pruebas en general será considerablemente más fácil de mantener. Vea el Law of Demeter.

Alternativamente ... (pero esto pone a la jerarquía en sus instanciaciones ...)

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 

Posteriormente también puede:

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

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

Gracias por la respuesta, y ciertamente estoy de acuerdo con la mayoría de sus puntos en general. Desafortunadamente, en este caso el módulo tiene ~ 100 cables de sonda internamente, por lo que convertirlos en entradas explícitas, aunque más claros, es bastante desordenado. – pdq

+1

Hola pdq. Supongo que es por eso que mencioné las interfaces SV. Al menos puede encapsularlos en varios grupos lógicos y acceder a los cables desde dentro de su módulo utilizando la notación de puntos. – DMC

2

Se puede utilizar la palabra clave SystemVerilog bind para unir el módulo en cada jerarquía que lo requiere? (Esto requiere que use SystemVerilog y tenga una licencia para un simulador).

Usar bind es como crear instancias de un módulo de la manera normal, excepto que proporciona una ruta a la jerarquía en la que el módulo se instancia "remotamente" :

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

Aún mejor: Supongamos que cada jerarquía que va a enlazar a una instancia independiente del mismo módulo. Entonces:

bind remote_module my_module instance_name(.*); 

Esto se une a su módulo en todos los casos del objetivo, no importa donde se encuentra en el diseño. Esto es muy poderoso si su módulo es un verificador de verificación.