2013-02-11 14 views
5

Mam komponent VHDL, który implementuje sekwencję testową DRAM. Zawiera jednostkę podrzędną, która jest kontrolerem DRAM.Alternatywna architektura submodule VHDL do symulacji

Chcę symulować (debugować) sekwencję testową DRAM, ale używaj prostego fałszywego kodu pośredniczącego dla kontrolera DRAM, a nie rzeczywistego, skomplikowanego elementu.

Czy jest sposób, w jaki mogę to ustawić, być może używając konfiguracji VHDL do użycia prostej wersji jednostki kontrolera do symulacji? Jestem całkiem nowy w symulacji i niezbyt doświadczony w VHDL.

Używa Xilinx ISE i ISim targetowania Spartan-6, jeśli to robi różnicę.

+0

Czy istnieje _need_ mieć mniejszy/szybszy kontroler DRAM? Czy istnieje symulator lub jezioro mocy obliczeniowej? Jeśli nie, nie podejmę wysiłku i nie podejmę ryzyka. – vermaete

+0

Interesujące pytanie: do tego właśnie służą konfiguracje! Jednak korzystanie z nich w ten sposób - lub nawet w ogóle - jest zaskakująco rzadkie i dlatego podatne na dziwne błędy narzędzi. Niezależnie od tego, czy odpowiem, czy nie, oglądam ten z zainteresowaniem! –

+2

@Vermaete: jeśli kontrolerem DDR jest Xilinx MIG: nalega na sekwencję kalibracji trwającą 50 sekund, zanim pozwoli na uruchomienie jednego użytecznego cyklu symulacji. Połącz to z innym swoim rdzeniem, który (szaleńczo) symuluje tylko na poziomie bramki i czeka cię pół godziny na symulację. To nie może się liczyć jako "potrzeba", ale jest blisko! –

Odpowiedz

5

Jednym ze sposobów, który nie korzysta z konfiguracji:

pamiętać, że można utworzyć kilka architektur dla każdego podmiotu.

Dlatego można instancję jednostkę w testbench jak

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

lub

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

gdzie "proste" i "rtl" to dwie architekturach. W tym celu konieczne może być posiadanie encji i obu architektur w różnych plikach; Narzędzia Xilinx nie radzą sobie z rzadkimi przypadkami (kiedyś powiedziały mi, że konfiguracje nie są jednostkami projektowymi!).

Następnie można utworzyć instancję kontrolera DRAM w dowolnej architekturze na stole testowym.

Jak mówi vermaete, trzeba również przetestować uproszczoną architekturę. Jednym ze sposobów jest przeprowadzenie testów jednostkowych na nim poprzez utworzenie instancji obu kontrolerów w innym testbench, po jednym przy każdej architekturze i porównanie ich wyników dla każdej operacji.

Co ciekawe, przykład Ashendena do bezpośredniej instancji obiektu (Przewodnik projektanta do VHDL ch 5.4, p.136 w wydaniu z 1996 roku) to kontroler DRAM!

EDIT: (był to komentarz, ale robi się zbyt długo)

Do testów jednostkowych, oba kontrolery mogą być instancja w testbench, i wszystko jest dobrze.

Dla testu systemowego, nie zrozumiałem, że kontroler DRAM był wewnątrz testowanego egzemplarza (projekt najwyższego poziomu) - chcesz jedno wystąpienie (prawdziwe) dla synth i prostych testów DRAM, i inne (proste) dla pełne testy DRAM. Tak, konfiguracja jest prawidłowym i najczystszym sposobem na to. Utwórz instancję kontrolera ENTITY w projekcie najwyższego poziomu (UUT) i wybierz architektury w konfiguracji.

Jednak istnieje mniej czysta alternatywa, jako plan awaryjny w przypadku, gdy konfiguracje nie działają. Utwórz 2 architektury dla jednostki najwyższego poziomu; różnią się TYLKO w łuku wybranym dla kontrolera. Możesz wybrać architekturę podczas tworzenia instancji najwyższego poziomu w testbench. Jest to jednak problem, ponieważ musisz zsynchronizować dwie wersje.

+0

Wygląda na to, że kontroler i moje UUT będą musiały być dziećmi testbench, prawda? W tej chwili kontroler DRAM jest dzieckiem testowanego egzemplarza (który byłby jedynym dzieckiem testbench). Czy to podejście zadziała? – blueshift

4

Inna konfiguracja wolna sposobem jest użycie generate do osiągnięcia tego celu:

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; 

Można użyć this answer stworzyć in_simulation stała.

(Jeśli nie masz narzędzi VHDL2008 zgodnych, nie można zrobić if...else..end generate i będziesz musiał zrobić if in_simulation/if not in_simulation parę zamiast. Podnieść raport o błędzie :)

+0

Dobry połów, zapomniałem o tym podejściu. Zwykle używam funkcji "symulowania", a nie stałej, ale tego samego pomysłu. –