Kurs Verilog cz.3 - symulacja

Wpis w kategorii [ Verilog ]

Masz własną stronę WWW (prywatną lub firmową)? Dodaj ją do katalogu stron związanych z elektroniką. Wpis jest całkowicie darmowy!

Komputer

Znamy już najważniejszy element każdego projektu w Verilogu. Gdy moduł jest zaprojektowany możemy (a nawet musimy, chyba że jest on banalnie prosty) sprawdzić jego działanie. Najlepszym sposobem na zweryfikowanie poprawności projektu jest przygotowanie i przeprowadzenie odpowiedniej symulacji.

Dla zawziętych elektroników, praktyków symulacja nie kojarzy się najlepiej. W przypadku układów programowalnych jest to jednak nieodzowny element każdego projektu, ale nie ma się czego bać - wygląda to o niebo lepiej niż w przypadku układów analogowych.

O tym, jakie narzędzie do przygotowania symulacji udostępnia opis sprzętu przekonasz się czytając poniższy tekst.

1. Testbench

Aby przeprowadzić symulację niezbędne jest stworzenie dodatkowego bloku, który określi wymuszenia dla testowanego modułu. Blok taki nosi nazwę testbench i definiuję się go tak, jak każdy inny moduł w Verilogu. Testbench stanowi niejako opis środowiska zewnętrznego układu.

Najlepiej zrozumieć to analizując przykład. Mamy 4-bitowy licznik z możliwością wpisania wartości początkowej, taki jak na rysunku poniżej.

Licznik

Rysunek 1. Licznik 4-bitowy

Finalnie do naszego układu podłączymy inne układy (źródło impulsów zliczanych, sterowanie, odczyt aktualnej wartości). Symulacją takiego właśnie środowiska zajmuje się testbench.

Licznik testbench

Rysunek 2. Testbench licznika

Aby zilustrować powyższe informacje napiszemy moduł licznika, oraz testbench dla niego.

Zacznijmy od licznika, ta część jest dość prosta:

module licznik(
input wire clk,
input wire load,
input wire [3:0] i_Q,
output reg [3:0] o_Q
);
 
always @(posedge clk or posedge load)
   if(load)
      o_Q <= i_Q;
   else if(clk)
      o_Q <= o_Q + 1;
 
endmodule

Licznik będzie zliczał impulsy na narastającym zboczu sygnału clk, ładowanie wartości początkowej nastąpi na narastającym zboczu sygnału load.

Testbench będzie symulował źródło zliczanych impulsów, oraz zajmie się wpisaniem początkowej wartości równej 6.

module licznik_tb();
 
reg sys_clk;
reg load;
reg [3:0] Q;
wire [3:0] cnt;
 
licznik UUT(
.clk(sys_clk),
.load(load),
.i_Q(Q),
.o_Q(cnt)
);
 
initial
   begin
      sys_clk = 0;
      Q = 8'd6;
      load = 0;
      load = #100 1;
      load = #100 0;
   end
 
initial
   begin
   // wyświetlenie wyników symulacji
      $monitor ($time, " | %d", cnt);
   end
 
//-----------------------------------
 
always #25 sys_clk <= ~sys_clk;
 
//-----------------------------------
 
endmodule

Szczegółowo testbench omówimy w kolejnych częściach kursu, tutaj przedstawiona jest pewna idea.

Wyniki można obserwować jako przebiegi czasowe oraz w konsoli symulacji (dzięki zastosowaniu funkcji $monitor).

2. Kilka uwag

  • warto stosować nazwy modułów testbenchy z przyrostkiem _tb, jest to dobry zwyczaj ułatwiający orientację w plikach projektu,
  • testowanie układu przed jego implementacją jest jednym z najważniejszych i nabardziej czasochłonnych etapów projektowania,
  • testowanie odbywa się na dwóch poziomach: behawioralnym oraz tzw. post-route czyli uwzględniającą rozmieszczenie elementów (oraz opóźnienia z tego wynikające) wewnątrz układu programowalnego.

W następnej części przyjrzymy się bliżej składni języka Verilog.

Oceń ten wpis:
1 gwiazdka2 gwiazdki3 gwiazdki4 gwiazdki5 gwiazdek (głosów: 1, średnia ocen: 5)
Loading ... Loading ...
Wyświetleń: 1,402
dodajdo

Podobne artykuły

Możesz śledzić komentarze do tego wpisu poprzez kanał RSS 2.0. Możesz także dodać własny komentarz, lub trackback z własnej strony WWW.

Dodaj komentarz