Konwencje językowe Verilog
Transkrypt
Konwencje językowe Verilog
Konwencje językowe Verilog-a APSC Podstawowe konwencje są takie same jak w C. Elementami języka są: komentarze, ograniczniki, liczby, ciągi znaków, identyfikatory i słowa kluczowe. Verilog rozróżnia małe i duże litery. Słowa kluczowe pisane są małymi literami. Spacje Spacje \b, tabulatory \t i zakończenia linii \n. Są ignorowane za wyjątkiem sytuacji gdy rozdzielają elementy języka. Wewnątrz stringów nie są ignorowane. Komentarze Jedna linia – zaczyna się od // Wiele linii – od /* do */. Nie mogą być zagnieżdżane. Operatory Jednoargumentowe, dwuargumentowe, trójargumentowe a = ~b; A = b && c; A = b ? C : d; Konwencje językowe Verilog-a APSC Liczby (1 z 3) Z wymiarem: <rozmiar>’<format><liczba> <rozmiar> - liczba dziesiętna określająca ilość bitów w liczbie <format> - D lub d – dziesiętny H lub h – szesnastkowy B lub b – dwójkowy O lub o – ósemkowy <liczba> - sekwencja znaków od 1 do f. Małe i duże litery są nierozróżnialne. 4’b111 //czterobitowa liczba dwójkowa 12’habc //dwunastobitowa liczba szesnastkowa 16’d255 //szesnastobitowa liczba dziesiętna Bez wymiaru: Jeżeli nie podajemy <rozmiar> to liczba ma 32 bity długości (lub więcej o ile pozwala na to symulator i maszyna) Jeżeli nie podajemy <format> to liczba jest dziesiętna. 23456 ’habc ’o255 //32-bitowa liczba dziesiętna //32-bitowa liczba szesnastkowa //32-bitowa liczba dziesiętna Konwencja językowe Verilog-a APSC Liczby (2 z 3) Wartości x lub z: Modelowanie rzeczywistych obwodów wymaga dwóch specjalnych wartości: x – wartość nieokreślona (nieznana) z – wartość wysokiej impedancji Symbole te określają 4-bity w zapisie szesnastkowym, 3 – w ósemkowym, 1 – w dwójkowym. Jeżeli wartości 0, x, z występują na najbardziej znaczącym miejscu, to liczba jest rozszerzana na wyższe bity także przez 0, x, z odpowiednio. 12’h13x //12-bitowa liczba szesnastkowa z 4 ostatnimi bitami nieokreślonymi 6’hx //6-bitowa liczba szesnastkowa nieznanej wartości 32’bz //32-bitowa liczba o wysokiej impedancji Ujemne: Do wyrażenia ujemnej liczby Verilog stosuje notację uzupełnienia do dwóch. Określa się je przez dodanie znaku minus przed rozmiarem liczby. Stosowanie znaku minus pomiędzy formatem a liczbą jest niepoprawne. -6’d3 6’d-2 //6-bitowa liczba ujemna przechowywana jako uzupełnienie do 2 liczby 3 //błędna specyfikacja Uzupełnienie do dwóch APSC Definicja ogólna: Uzupełnieniem do p dla n-cyfrowej liczby N o podstawie p jest liczba: n p -N Wyrażenie to możemy przepisać w postaci n n p – N = [(p – 1) – N] + 1 Wyrażenie w nawiasie kwadratowym nazywa się uzupełnieniem do (p – 1) dla n-cyfrowej liczby N o podstawie p. 2 Przykład: Uzupełnienie do p – 1 = 1 dla liczby N = (1001) wynosi: n 4 (p – 1) – N = (2 – 1) – 1001 = 1111 – 1001 = 0110 Wniosek 1: W celu uzyskania uzupełnienia do 1 dla liczby dwójkowej należy zanegować wszystkie jej cyfry. Wniosek 2: W celu uzyskania uzupełnienia do 2 dla liczby dwójkowej należy zanegować wszystkie jej cyfry a następnie dodać 1. Uzupełnienie do dwóch APSC Uzupełnienie do 2 można również otrzymać, pozostawiając, od prawej strony do lewej, wszystkie zera i pierwszą jedynkę bez zmian i negując pozostałe cyfry. Przykład: Uzupełnienie do dwóch dla liczba 10010100 otrzymujemy przez: 10010 100 zanegowanie pozostawienie bez zmian czyli wynikiem jest 01101100. Przykład: Odjąć M = (1010)2 i N = (11001)2 M= 1010 Uzupełnienie do dwóch dla N = Suma = +00111 10001 Następnie należy wziąć uzupełnienie sumy i poprzedzić je znakiem minus: (-01111)2 = 1510 Konwencja językowe Verilog-a APSC Liczby (3 z 3) Znaki podkreślenia: Można stosować w liczbach. Jego rolą jest poprawienie czytelności długich liczb. Jest ignorowany przez Verilog. 12’b1111_0000_1010 //użycie podkreśleń dla poprawienia czytelności Znak zapytania: Są alternatywnym sposobem zapisywania wartości wysokiej impedancji wewnątrz liczb. 4’b10?? //równoważne do 4’b10zz Konwencja językowe Verilog-a APSC Ciągi znaków Ciąg znaków jest ciągiem jednobajtowych wartości ASCII i zamknięty jest podwójnym cudzysłowem. Nie może zawierać znaków CR. ”Hello Verilog World” ”a / b” Identyfikatory Identyfikatory to nazwy nadawane obiektom w celu odwoływania się do nich z innych miejsc projektu. Składają się ze znaków alfanumerycznych, podkreślenia(_), dolara ($) i rozróżniają wielkość liter. Nie mogą się rozpoczynać od znaku ($) gdyż jest to zarezerwowane dla zadań systemowych. Identyfikatory muszą być różne od słów kluczowych. reg value; input clk; //reg – słowo kluczowe, value - identyfikator //input – słowo kluczowe, clk - identyfikator Słowa kluczowe Veriloga Słowa kluczowe to identyfikatory zarezerwowane do celu definiowania konstrukcji językowych. Słowa kluczowe w Verilogu pisane są małymi literami. package endpackage rtran rtranif0 module macromodule rtranif1 tran endmodule primitive tranif0 tranif1 endprimitive parameter strong0 strong1 input output pull0 pull1 inout reg weak0 weak1 integer time highz0 highz1 real event small medium task endtask large function endfunction scalared table endtable signed defparam when assign deassign wire wand force release wor tri initial always triand trior begin end trireg tri0 fork join tri1 supply0 if else case casez supply1 vectored buf not casex endcase and nand default forever or nor repeat while xor xnor for wait bufif0 bufif1 posedge negedge notif0 notif1 edge disable nmos rnmos specparam realtime pmos rpmos strength cmos rcmos attribute endattribute pulldown pullup const use Typy danych Veriloga APSC Wartość sygnału • • • • 0 1 X Z zero logiczne – fałsz jedynka logiczna – prawda wartość nieznana wysoka impedancja, nie podłączone Moc sygnału Jest stosowana w układach cyfrowych dla rozwiązywania konfliktów między modułami sterującymi ten sam węzeł układu. Nazwa supply0 Moc 7 Skrót Su0 strong0 6 St0 pull0 5 Pu0 large0 4 La0 weak0 3 We0 medium0 2 Me0 small0 1 Sm0 highz 0 HiZ0 highz1 0 HiZ1 small1 1 Sm1 medium1 2 Me1 weak1 3 We1 large1 4 La1 pull1 5 Pu1 strong1 6 St1 Cztery poziomy mocy typu sterującego (driving): supply, strong, pull, i weak. Sygnały z mocą sterującą pochodzą z wyjść bramek i przypisań ciągłych. Trzy poziomy mocy typu ładunkowego (storage): large, medium, and small. Moce sygnału typu zachowania ładunku pochodzą z węzłów typu trireg. Typy danych Veriloga APSC Węzeł (net) Jest to klasa typów danych takich jak: wire, wand, wor, tri, triand, trior, trireg i inne. Słowo net nie jest słowem kluczowym. Węzeł reprezentuje połączenie między elementami sprzętu. Węzeł ma wartość w sposób ciągły sterowaną przez wyjście przyrządu (driver), do którego jest połączony. Najczęściej używanym typem węzła jest wire. Domyślną wartością węzła jest z (za wyjątkiem węzła typu trireg). wire a; wire [3,0] b; wire d = 1’b0; //deklaracja węzła a //deklaracja magistrali czterobitowej //deklaracja i ustawienie na stałe wartości zero Rejestr (reg) Rejestr reprezentuje element przechowujący informację. Należy rozróżnić dwie rzeczy: • rejestr sprzętowy zbudowany z przerzutników, • rejestr w Verilog-u czyli zmienną utrzymującą wartość. Rejestry w przeciwieństwie do węzłów nie potrzebują układów sterujących. Zmienna typu reg może zmieniać wartość w każdej chwili symulacji przez przypisanie nowej wartości (nie jest potrzebny zegar jak w rejestrze sprzętowym). Domyślną wartością zmiennej typu reg jest x. reg reset; initial begin reset = 1’b1; #100 reset = 1’b0; end //deklaracja zmiennej reset //inicjacja zmiennej reset na 1 //po 100 jednostkach czasu reset jest zerowany Typy danych Veriloga APSC Wektory Węzły i dane typu reg mogą być deklarowane jako wektory. Nawiasy kwadratowe pomiędzy słowem kluczowym a nazwą zmiennej określają ilość bitów i ich kolejność. Pierwsza liczba w nawiasach zawsze oznacza najbardziej znaczący bit. wire a; wire [7:0] bus; wire [31:0] busA, busB, busC; reg clock; reg [0:40] virtual_addr; //deklaracja węzła a //deklaracja magistrali 8-bitowej bus //trzy magistrale 32-bitowe //skalarny rejestr //wektor rejestrowy 41-bitowy Jak odwoływać się do tak zadeklarowanych zmiennych? busA[7] bus[2:0] bus[0:2] //najbardziej znaczący bit magistrali busA //trzy najmniej znaczące bity wektora bus //niepoprawne odwołanie – gdyż najbardziej znaczący bit //zawsze musi stać po lewej stronie zakresu specyfikacji virtual_addr[0:1] //dwa najbardziej znaczące bity wektora virtual_addr Typy danych Veriloga APSC Typ rejestrowy integer Wartości typu reg są bez znaku (unsigned). Wartości typu integer są ze znakiem (signed). Wygodniejsze np. do zliczania. Typowa szerokość: 32 bity. integer counter; initial counter = -1; //deklaracja zmiennej counter //-1 wpisano do counter Typ rejestrowy real Liczby rzeczywiste mogą być w notacji dziesiętnej (decimal) lub naukowej (scientific). Kiedy wartość zmiennej real jest przypisywana do zmiennej typu integer jest ona zaokrąglana do najbliższej wartości całkowitej. real delta; initial delta = 4e10; delta = 2.13; end integer i; initial i = delta; //deklaracja zmiennej rzeczywistej //przypisanie w notacji naukowej //przypisanie w notacji dziesiętnej //i otrzymuje wartość 2 (zaokrąglone 2.13) Typy danych Veriloga APSC Typ rejestrowy time Symulacje prowadzone są względem czasu symulacji. Jest on przechowywany w specjalnym rejestrze time. Jest on co najmniej 64-bitowy. Funkcja systemowa $time służy do określania bieżącego czsu symulacji. Czas symulacji jest mierzony w sekundach symulacyjnych. Związanie tego czasu z rzeczywistym czasem upływającym w prawdziwym układzie cyfrowym odbywa się przez zdefiniowanie skali czasowej. Można to zrobić oddzielnie dla każdego modułu za pomocą dyrektywy kompilatora `timescale. time save_sim_time; initial save_sim_time = $time; //deklaracja zmiennej czasowej //zapamiętaj bieżący czas symulacji Typy danych Veriloga APSC Tablice (arrays) W Verilogu możliwe są tylko tablice jednowymiarowe. Należy je odróżnić od wektorów. Wektor to element n-bitowy, podczas gdy tablica jest obiektem wieloelementowym złożonym z 1- lub n-bitowych elementów. integer count[0:7] reg bool[31:0] time chk_point[1:100] reg [4:0] port_id[0:7] count[5] chk_point[100] port_id[3] //zmienna //zmienna //tablica //tablica tablicowa o 8-u elementach integer tablicowa o 32-u elementach reg 100 punktów czasowych 8 wektorów 5-bitowych typu reg //warość 5-ego elementu w tablicy count //warość 100-ego elementu czasowego w tablicy chk_point //5-bitowa wartość 3-ego elementu w tablicy port_id Pamięci (memories) Są to tablice rejestrów. Każdy element tablicy to jedno słowo. Słowo jest dostępne poprzez adres, którym jest indeks tablicy. reg mem1bit[0:1023] //pamięć o pojemności 1K 1-bitowych słów reg [7:0] membyte[0:1023] //pamięć o pojemności 1K 8-bitowych słów membyte[511] //pobranie 1 bajtowego słowa spod adresu 511 Typy danych Veriloga parameter Parametry APSC Stałe definiowane w module. Parametry nie mogą być używane jak zmienne. Umożliwiają indywidualizację realizacji modułów przez nadpisywanie zwartości parametrów w czasie kompilacji. Robi się to na dwa sposoby. Wykorzystanie parameter przy użyciu komendy defparam Każdy parametr może być w ten sposób nadpisywany w module wielokrotnie. //definicja modułu hello_world module hello_world() parameter id_num = 0; //definicja numeru id modułu z wartością 0 initial //wyświetlanie numeru id $display(”Wyświetlam numer id = %d”, id_num); endmodule //definicja modułu top module top //zmiana wartości id_num w urealnianych modułach za pomocą defparam //wykorzystano nazwy hierarchiczne defparam w1.id_num=1, w2.id_num=2; //dwie realizacje modułu hello_world hello_world w1(); hello_world w2(); endmodule Wynik symulacji: Wyświetlam numer id = 1 Wyświetlam numer id = 2 Typy danych Veriloga parameter APSC Wykorzystanie parameter przez przypisywanie wartości w czasie urealniania modułu //inaczej napisany top moduł module top //dwie realizacje modułu hello_world z różnymi wartościami jedynego parametru hello_world #(1) w1(); //wartość 1 dla parametru id_num w realizacji w1 hello_world #(2) w2(); //wartość 2 dla parametru id_num w realizacji w2 endmodule Jeżeli w module zdefiniowana wiele parametrów to przy urealnianiu należy przestrzegać ich kolejności definiowania. Jeżeli wartość nie jest podawana to obowiązuje wartość domyślna z definicji modułu. //definicja modułu module bus_master parameter delay1 = 2; parameter delay2 = 4; parameter delay3 = 7; ... <wnętrze modułu> ... endmodule //top moduł module top bus_master #(4,5,6) b1(); //delay1 = 4, delay2 = 5, delay3 = 6 bus_master #(9,5) b2(); //delay1 = 9, delay2 = 5, delay3 = 7(domyślne) endmodule Typy danych Veriloga string APSC Ciągi znaków (stringi) Mogą być przechowywane w rejestrach reg. Rejestr musi być odpowiedniej długości. Każdy znak to 1 bajt. Jeśli rejestr jest za długi to z lewej strony string jest uzupełniany zerami. Jeśli jest za krótki to znaki z lewej strony są obcinane. Verilog nie przechowuje znaku zakończenia stringu, więc nie jest potrzebny dodatkowy bit. module string_test; reg [8*14:1] stringvar; //deklaracja zmiennej o szerokości 14 bajtów initial begin stringvar = ”Hello world”; //mieści się z zapasem trzech znaków $display(“%s is stored as %h”,stringvar,stringvar); stringvar = {stringvar,”!!!”}; $display(“%s is stored as %h”,stringvar,stringvar); end endmodule Przykład dodatkowo demonstruje manipulacje na stringach za pomocą operatora dołączania (concatenation). Rezultatem wykonania tego modułu jest: Hello world is stored as 00000048656c6c6f20776f726c64 Hello world!!! is stored as 48656c6c6f20776f726c64212121 Typy danych Veriloga string APSC Znaki specjalne w stringach – mogą być wyświetlane w stringach jeśli są poprzedzone znakiem backslash (\), \n Znak nowej linii \t Znak tabulacji \\ slash \” Podwójny cudzysłów \ooo %% Znak zapisany jako 1 do 3 cyfrowa liczba oktalna Znak procenta Zadania systemowe Zadania systemowe (system task) APSC Wywołuje się w postaci $<słowo_kluczowe> Wyświetlanie informacji $display(p1, p2, ..., pn); $write(p1, p2, ..., pn); p1, p2, ..., pn – zmienne, wyrażenia, ciągi znaków ujęte w cudzysłów Różnica między $display a $write polega na tym, że pierwszy na końcu stringu domyślnie wstawia koniec linii a drugi nie. Dla wyświetlenie kilku stringów w jednej linii używamy $write . %h lub %H heksadecymalnie %d lub %D dziesiątkowo %o lub %O oktalnie %b lub %B binarnie %c lub %C znak ASCII %v lub %V moc sygnału w węźle %m lub %M nazwy hierarchiczne %s lub %S stringi %t lub %T bieżący czas %f lub %F liczby rzeczywiste w sposób dziesiętny %e lub %E liczby rzeczywiste w sposób wykładniczy %g lub %G liczby rzeczywiste w sposób dziesiętny lub wykładniczy, tak aby było krócej Zadania systemowe $display APSC module disp; initial begin $display("\\\t%%\n\"\123"); end endmodule Verilog-XL wyświetli: Highest level modules: disp \ % "S module printval; reg [11:0] r1; initial begin r1 = 10; $display( "Printing with maximum size - :%d: :%h:",r1,r1 ); $display( "Printing with minimum size - :%0d: :%0h:",r1,r1 ); end endmodule Verilog-XL wyświetli: Highest level modules: printval Printing with maximum size - : 10: :00a: Printing with minimum size - :10: :a: 6 simulation events Zadania systemowe $display module disp; reg [31:0] rval; pulldown (pd); initial begin rval = 101; $display("rval = %h hex %d decimal",rval,rval); $display("rval = %o octal %b binary",rval,rval); $display("rval has %c ascii character value",rval); $display("pd strength value is %v",pd); $display("current scope is %m"); $display("%s is ascii value for 101",101); $display("simulation time is %t", $time); end endmodule Verilog-XL wyświetli: Highest level modules: disp rval = 00000065 hex 101 decimal rval = 00000000145 octal 00000000000000000000000001100101 binary rval has e ascii character value pd strength value is StX current scope is disp e is ascii value for 101 simulation time is 0 APSC Zadania systemowe $monitor APSC Monitorowanie informacji $monitor(p1, p2, ..., pn); p1, p2, ..., pn – zmienne, nazwy sygnałów, ciągi znaków ujęte w cudzysłów W sposób ciągły monitoruje wartości zmiennych i sygnałów i wyświetla ich wartości w momentach zmiany choć jednego z parametrów. Zadanie to wystarczy wywołać tylko raz. Drugie wystąpienie zadania $monitor powoduje deaktywację poprzedniego. Dwa pomocnicze zadania systemowe: $monitoron; aktywacja zadania $monitor (domyślne) $monitoroff; deaktywacja zadania $monitor //monitorowanie wartości czasu i sygnałów zegara i resetu initial begin $monitor($time, ”Wartości sygnałów clock = %b reset = %b”, clock, reset); end 0 Wartości sygnałów clock = 0 reset = 1 5 Wartości sygnałów clock = 1 reset = 1 10 Wartości sygnałów clock = 0 reset = 0 Zadania systemowe $stop $finish APSC Zatrzymywanie symulacji $stop Zawiesza symulację i wprowadza tryb interaktywny np. w celu analizy sygnałów w projekcie. Zakańczanie symulacji $finish Kończy symulację. Dyrektywy kompilatora `define APSC Dyrektywy kompilatora Definiuje się w postaci `<słowo_kluczowe> Definiowanie makra tekstowego `define <nazwa_makro> <wartość> Rola i działanie podobne jak #define w C. //definicja makra określającego domyślną długość słowa //wywołanie: `WORD_SIZE `define WORD_SIZE 32 //alias – gdziekolwiek pojawi się `S wstawione zostanie $stop `define S $stop //często używany ciąg znaków `define WORD_REG reg [31:0] //definicja 32-bitowego rejestru: `WORD_REG reg32; Dyrektywy kompilatora `include Wstawianie pliku źródłowego `include <nazwa_pliku> Rola i działanie podobne jak #include w C. //wstaw plik header.v zawierający deklaracje `include header.v ... <kod Verilog’a> ... APSC