2013-02-11 16 views
5

Ho un componente VHDL che implementa una sequenza di test DRAM. Contiene un'entità figlio che è il controller DRAM.Architettura di submodulo VHDL alternativa per simulazione

Voglio simulare (eseguire il debug) la sequenza di test DRAM ma utilizzare un semplice stub falso per il controller DRAM piuttosto che la cosa reale e complicata.

C'è un modo per configurarlo, magari utilizzando le configurazioni VHDL per utilizzare una semplice versione dell'entità controller per la simulazione? Sono abbastanza nuovo per la simulazione e non ho molta esperienza con VHDL in generale.

Questo utilizza Xilinx ISE e ISim che puntano su Spartan-6, se questo fa la differenza.

+0

C'è un _need_ avere un controller DRAM più piccolo/più veloce? C'è un limite nel simulatore o nel lago di potenza di calcolo? In caso contrario, non farei lo sforzo e/o correre il rischio. – vermaete

+0

Interessante domanda: questo è esattamente ciò che le configurazioni sono per! Tuttavia, utilizzarli in questo modo - o addirittura a tutti - è sorprendentemente raro e quindi incline a bug di strumenti dispari. Sia che risponda o no, sto guardando questo con interesse! –

+2

@Vermaete: se il controller DDR è Xilinx MIG: insiste su una sequenza di calibrazione della durata di 50us prima che ti consenta di eseguire un singolo ciclo utile di simulazione. Combinalo con un altro dei loro core che simula (follemente) solo a livello di gate e stai aspettando mezz'ora per simulazione. Quello non può contare come "bisogno" ma è vicino! –

risposta

5

Un modo che non fa uso di configurazioni:

Ricordate che è possibile creare diverse architetture per ogni entità.

Pertanto è possibile creare un'istanza di un'unità nel vostro banco di prova come

Controller_1 : entity work.DRAM_controller(simple) 
       port map (... 

o

Controller_2 : entity work.DRAM_controller(rtl) 
       port map (... 

dove "semplice" e "rtl" sono due architetture. A tale scopo, potrebbe essere necessario avere l'entità e entrambe le architetture in file diversi; Gli strumenti Xilinx non sono molto efficaci nella gestione di casi non comuni (una volta mi hanno detto che le configurazioni non erano unità di progettazione!)

Quindi è possibile creare un'istanza del controller DRAM con un'architettura in un banco di prova.

Come dice vermaete, devi anche testare l'architettura semplificata. Un modo è eseguire test unitari su di esso istanziando entrambi i controller in un altro banco di prova, uno con ciascuna architettura e confrontando i loro output per ciascuna operazione.

Stranamente l'esempio di Ashenden per l'istanziazione diretta dell'entità (Designer's Guide to VHDL ch 5.4, p.136 nella mia edizione del 1996) è un controller DRAM!

EDIT: (questo era un commento ma è sempre troppo lungo)

Per il test di unità, entrambi i controller possono essere istanziati nel banco di prova, e tutto va bene.

Per il test di sistema, non ho capito che il controller DRAM era all'interno dell'UUT (progettazione di livello superiore) - si desidera un'istanza (quella reale) per test di DRAM sintetici e semplici e un'altra (semplice) per test completi di DRAM. Sì, una configurazione è il modo corretto e più pulito per farlo. Crea un'istanza del controller ENTITY nel progetto di livello superiore (UUT) e seleziona le architetture in una configurazione.

Tuttavia esiste un'alternativa meno pulita, come un piano di fallback nel caso in cui le configurazioni non funzionino. Crea 2 architetture per l'entità di primo livello; differiscono SOLO nell'arco selezionato per il controller. È possibile selezionare un'architettura quando si crea un'istanza dell'entità di livello superiore nel banco di prova. È un dolore però, perché devi mantenere sincronizzate le due versioni.

+0

Sembra che richiederebbe che il controller e il mio UUT siano figli del banco di prova, giusto? Al momento il controller DRAM è figlio dell'UUT (che sarebbe l'unico figlio del banco di prova). Questo approccio funzionerebbe? – blueshift

4

Un altro modo senza la configurazione è quello di utilizzare generate per raggiungere questo obiettivo:

sim:if in_simulation generate 
    Controller_1 : entity work.DRAM_controller(simple) 
        port map ... 
else 
    Controller_1 : entity work.DRAM_controller(rtl) 
        port map ... 
end generate; 

È possibile utilizzare this answer per creare un in_simulation costante.

(Se non si dispone di strumenti VHDL2008 conformi, non si può fare un if...else..end generate e avrete a che fare una coppia if in_simulation/if not in_simulation invece. Sollevare un bug report :)

+0

Buona presa, mi sono dimenticato di quell'approccio. Tendo ad usare una funzione di "simulazione" piuttosto che costante, ma la stessa idea. –