Accesso a Verilog Genvar ha generato istanze nel codice di simulazione
-
27-10-2019 - |
Domanda
Questa è una domanda di rilevata Verilog. Sto lavorando con Xilinx ISE come ambiente di sviluppo.
Sto cercando di accedere alle variabili nella simulazione che vengono generate automaticamente usando Genvar ma sto ricevendo il seguente errore -> HDLCompler: 71
Esempio di problema:
genvar i;
generate
for(i=0; i < N; i=i+1)
begin:Sys_Modules
TypeXModule #(.width(10)) xmod(.dataY(dataY)));
end
endgenerate
Quando ho eseguito la sintesi o la simulazione posso vedere che vengono create istanze sys_modules [0..n-1] .xmod.
Quando provo ad aggiungere una riga alla simulazione accedendo all'array Sys_modules:
Sys_modules [i] .xmod.datay
Ricevo il seguente errore:
HDLCOMPILER: 71 Datay non è dichiarato sotto il prefisso XMOD
Esiste un modo per accedere ai valori generati automaticamente nella simulazione?
Grazie!
Soluzione
È legale scrivere un riferimento gerarchico a un'istanza generata. La funzionalità è descritta nelle sezioni 2.7.2 e 12.1.3 dello standard IEEE Verilog. Tuttavia, il pedice di istanza deve essere una costante in modo che possa essere risolto al momento della compilazione.
Altri suggerimenti
Non è possibile utilizzare riferimenti gerarchici incrociati in Verilog sintetizzato.
Penso che tu sia sfortunato. I simulatori non sembrano apprezzare i riferimenti fuori modulo (OOMRS) che indicano blocchi generati come hai scoperto.
Di recente ho riscontrato un problema simile quando ho realizzato un monitor testbench parametrizzabile. Vorrei un numero variabile di sotto-blocchi istanziati a seconda di un parameter
. All'interno di questo, avevo bisogno di avere un toplevel .start()
compito che chiamava il .start()
compiti in ciascuno dei moduli istanziati. Non potevo usare un for
Loop per farlo a causa di questo problema OOMR.
Quindi ho finito per dover:
- definire a
reg
che il toplevel.start()
Attività attivata - Scrivi un
always @
blocco attivato su questoreg
- scrivere altro
generate
sezione all'interno di questo blocco sempre da chiamare.start()
su ciascuno dei sub-moduli.
Se hai davvero bisogno di sbirciare nel tuo generate
D moduli, forse potresti provare una soluzione alternativa come sopra? Ad esempio, avere un autobus al Toplevel e usa ungenerate
Dichiarazione per sbirciare all'interno del tuo originale generate
d istanziazioni per copiare/assegnare segnali interessanti su questo bus Toplevel.