Verilog Język Opisu Sprzętu ardware escription anguage Część I. Elementy języka dr inż. Paweł Tomaszewicz 1
istoria krótko ata '80 potrzeba stworzenia jednego języka do symulacji na różnych poziomach opisu Język Verilog stworzony przez Phila Moore'a w 1983-4 w Gateway esign Automation wykorzystuje elementy języków Modula, Stimula, C 1989 Gateway esign Automation (i prawa do Veriloga) przejęta przez Cadence rok później język Verilog upubliczniony (public domain) 1992 rozpoczęcie prac nad standaryzowaniem 12.1995 Verilog stał się międzynarodowym standardem IEEE Std.1364-1995 2001 rozszerzenie standardu IEEE Std. 1364-2001 Politechnika Ostatnie Warszawska lata Verilog stał się językiem opisu sprzętu 2
Język Verilog Opisuje układy cyfrowe (trwają prace nad opisem układów analogowych) Opis układu cyfrowego możliwy na poziomie: funkcjonalnym (behavioral), strukturalnym (przesłań międzyrejestrowych RT, bramkowym - gate level), ataflow równania boolowskie 3
Język Verilog Układ cyfrowy może być opisany za pomocą: współbieżnych sygnałów (concurrency) struktury bloków (structure) procedur i komend (procedural statements) zdarzeń w czasie 4
Identyfikatory {[A-Z], [a-z], [0-9], _, $} Nie może zaczynać się od $ lub cyfry [0-9] Przykłady: shiftreg_a 4fun busa_index $address error_condition merge_ab _bus3 n$657 Rozróżnia wielkość liter (case( sensitive) myid Myid Nazwy specjalne zaczynają się od znaku \ Przykłady: \busa+index \-clock \a*(b+c) \***error-condition*** \net1/\net2 \{a,b} 5
Komentarze // komentarz do końca linii /* komentarz bloku tekstu */ /* Nie można /* zagnieżdżać komentarzy*/ blokowych*/ Białe znaki są ignorowane (znak spacji, tabulacji, nowej linii) 6
iczby [sign][size][ radix] value [sign] znak + - [size] liczba bitów zapisana liczbą dziesiętną ['radix] podstawa systemu liczbowego b B liczba dwójkowa o O liczba ósemkowa d liczba dziesiętna h liczba szesnastkowa value znaki określające wartość 0..9 a..f A..F x X z Z? 7
iczby (2) iczby bez określonej długości bitowej są zapisywane na 32 bitach 659 // liczba dziesiętna h 837FF // liczba szesnastkowa o7460 // liczba ósemkowa 4af // błędny zapis wymagane 'h dla liczby szesnastkowej iczba bez określonej podstawy jest liczbą dziesiętną Nie może być znaku spacji między znakiem apostrofu i podstawy 8
iczby (3) iczby o określonej długości bitowej 4 b1001 // 4-bitowa liczba dwójkowa 5 3 // 5-bitowa liczba dziesiętna 3 b01x // 3-bitowa liczba dwójkowa z dowolną wartością na najmłodszym bicie 12 hx // 12-bitowa liczba o dowolnej wartości 16 hz // 16-bitowa liczba o wysokiej impedancji 9
iczby (4) iczby ze znakiem iczby ujemne są kodowane w U2 iczby bez określonej długości i podstawy są liczbami ze znakiem iczby o określonej podstawie poprzedzonej literą s S są liczbami ze znakiem iczby o określonej podstawie bez dodatkowego znaku s S są liczbami bez znaku Znak s S nie zmienia wartości liczby a jedynie interpretację 10
iczby (5) Przykłady liczb ze znakiem 8 d -6 // niedozwolone umieszczenie znaku minus -8 d 6 // 8-bitowa liczba -6 zapisana w kodzie U2 można też zapisać -(8 d 6) 4 shf // 4-bitowa liczba 1111 2 w kodzie U2 o wartości -1, można też zapisać -4 h 1-4 sd15 // inaczej zapisana liczba -(-4 d 1), lub 0001 2 11
iczby (6) Automatyczne uzupełnianie reg [11:0] a, b, c, d; a = h x; // oznacza xxx uzupełnienie x b = h 3x; // oznacza 03x uzupełnienie zerami c = h z3; // oznacza zz3 uzupełnienie z d = h 0z3; // oznacza 0z3 reg [84:0] e, f, g; e = 'h5; // oznacza {81{1'b0},4'b0101} uzupełnienie zerami, czyli 00...05 f = 'hx; // oznacza {85{1'hx}} uzupełnienie x g = 'hz; // oznacza {85{1'hz}} uzupełnienie z 12
iczby (7) Używanie znaku podkreślenia _ w formatowaniu liczby dla zwiększenia czytelności 27_195_000 16 b0011_0101_0001_1111 32 h 12ab_f001 Znak? zastępuje liczbę o wysokiej impedancji 13
Typy danych W urządzeniach cyfrowych typy danych reprezentują dane zapamiętane oraz przesyłane pomiędzy elementami Wartości sygnałów: 0 wartość logiczna zero lub fałsz 1 wartość logiczna jeden lub prawda x wartość logiczna nieznana z wartość wysokiej impedancji Rozróżnia się dwa typy danych: sieć (net) zmienna (variable) 14
Sieć net Sieć (net) reprezentuje fizyczne połączenia pomiędzy elementami Nie jest elementem pamiętającym Wartość jest ustalana na podstawie sygnałów zasilających Jeżeli nie ma połączenia zasilającego, to jest w stanie wysokiej impedancji Typy sieci: wire, tri węzeł, węzeł trójstanowy supply0, supply1 stała wartość logiczna wand, wor iloczyn, suma na drucie (brak implementacji w układach reprogramowalnych) 15
Sieć przykład Wartość sygnału Y jest automatycznie wyznaczana jeżeli zmieni się wartość sygnału A lub B wire Y; assign Y = A & B; wand Y; assign Y = A; assign Y = B; wor Y; assign Y = A; assign Y = B; // nie realizowane w kompilatorach fpga // nie realizowane w kompilatorach fpga tri Y; assign Y = (B)? A : z; 16
Zmienna variable Zmienna jest abstrakcyjnym elementem pamiętającym wartość do czasu następnej zmiany W układzie cyfrowym zmienna realizowana jest jako przerzutnik Typy zmiennych: reg, integer (real brak obsługi) Zmienne inicjowane są wartością nieznaną x Przykład: reg A, C; // deklaracja // przypisania są wewnątrz procesu A = 1; C = A; // C ma wartość logiczną 1 A = 0; // C ma wciąż 1 C = 0; // C ma teraz wartość 0 17
Wektory Zmienna lub sieć bez zadeklarowanego zakresu jest skalarem wektorem o długości jednego bitu eklaracja szyny danych wire [3:0] busa; reg [1:4] busb; reg [1:0] busc; iczba po lewej stronie zakresu określa najbardziej znaczący bit MSB Wektor traktowany jako wartość bez znaku Ze znakiem, jeżeli zadeklarowany typu signed lub dołączony do sygnału ze znakiem 18
Wektory przykłady wire [3:0] busa; reg [1:4] busb; reg [1:0] busc; busc = busa[2:1] busc[1] = busa[2]; busc[0] = busa[1]; busb = busa; busb[1] = busa[3]; busb[2] = busa[2]; busb[3] = busa[1]; busb[4] = busa[0]; 19
Wektory przykłady wire w; // skalar net typu wire tri [15:0] busa; // 16-bitowa szyna trójstanowa reg a; // skalar reg reg [3:0] v; // 4-bitowy wektor reg gdzie najstarszym bitem jest v[3], a najmłodszym v[0] reg signed [3:0] signed_reg; // 4-bitowy wektor o zakresie od -8 do 7 reg [-1:4] b; // 6-bitowy wektor reg wire w1, w2; // dwa sygnały wire reg [4:0] x, y, z; // trzy 5-bitowe wektory reg 20
Macierze Macierz może składać się z elementów sieci (net) lub zmiennych (variable) typu skalar lub wektor Przykłady deklaracji: reg x[11:0]; // macierz 12 skalarów typu reg wire [0:7] y[5:0]; // macierz 6 wektorów 8-bitowych typu wire reg [31:0] x [127:0]; // macierz 128 wektorów 32- bitowych typu reg reg [7:0] x [127:0], y [63:0]; // dwie macierze wektorów 8-bitowych typu reg 21
Macierze Jednowymiarowa macierz z elementami typu reg pamięć (ROM, RAM) Można przypisać wartość dowolnemu n-bitowemu elementowi macierzy (słowu) Nie można przypisać wartości całej lub części pamięci 22
Macierze - przykład reg [7:0] mema[0:255]; // pamięć 256 słów 8-bitowych reg arrayb[7:0][0:255]; // dwuwymiarowa macierz 1-bitowych rejestrów wire w_array[7:0][5:0]; // macierz węzłów sieci integer inta[1:64]; // macierz 64 elementów typu integer Przykłady przypisań mema = 0; // Nie można nadać wartości elementom całej macierzy arrayb[1] = 0; // Próba przypisania wartości elementom części macierzy [1][0]..[1][255] arrayb[1][12:31] = 0; // Próba pisania do elementów [1][12]..[1][31] mema[1] = 0; // Wpisanie 0 do drugiego elementu macierzy arrayb[1][0] = 0; // Ustawienie 0 dla bitu o adresie [1][0] inta[4] = 33559; // Wpisanie wartości dla elementu o adresie [4] 23
Macierze - różnice Pamięć n 1-bitowych rejestrów a n-bitowy wektor reg [1:n] rega; // n-bitowy rejestr //... to nie to samo co... reg mema [1:n]; // pamięć n 1-bitowych rejestrów 24
Operatory Jednoargumentowe (unary) arytmetyczne: +, - redukcji: &, ~&,, ~, ^, ~^ (^~) negacja logiczna:! negacja bitowa: ~ wuargumentowe (binary) arytmetyczne: +, -, *, /, % relacyjne: <, >, <=, >=, ==,!=, ===,!=== logiczne: &&, bitowe: &,, ^, ~^ Trójargumentowe (ternary) Warunkowy:?: 25
Operatory 26
Operatory arytmetyczne + - * /... % reszta z dzielenia ** potęgowanie la operacji / i % jeżeli drugi argument jest równy zero to wynikiem jest x la operacji % znak wyniku jest brany z pierwszego argumentu Jeżeli jeden z argumentów jest x lub z to wynikiem jest x Operatory + - są także operatorami jedno argumentowymi 27
Operatory arytmetyczne iczby typu integer w operacjach arytmetycznych: bez długości i bez podstawy, 12 bez długości i z podstawą, 'd12 'sd12 z długością i z podstawą, 16'd12 16'sd12 Negacja wartości integer bez podstawy jest traktowana jako liczba ze znakiem U2 Negacja wartości integer z podstawą bez znaku jest traktowana jako liczba bez znaku 28
Operatory arytmetyczne Przykład: dzielenie -12 przez 3 // liczby -12 i -'d12 są zapisane w U2, ale -'d12 w operacji dzielenia gubi zapis o znaku integer IntA; IntA = -12 / 3; // wynikiem jest -4 IntA = - d 12 / 3; // wynikiem jest 1431655761 IntA = - sd 12 / 3; // wynikiem jest -4 IntA = -4'sd 12 / 3; // -4'sd12 jest negacją 4-bitowej liczby 1100, która ma wartość -4. Czyli -(-4) = 4 a wynikiem jest 1 29
Operatory arytmetyczne Przykłady operacji % (a modulo b): Operacja Wynik 10 % 3 1 11 % 3 2 12 % 3 0 // nie ma reszty z dzielenia -10 % 3-1 // znak minus z pierwszego argumentu 11 % -3 2 // znak minus z pierwszego argumentu -4 'd12 % 3 1 // -4 'd12 jest brana jako duża dodatnia liczba, która daje wynik = 1 reszty dzielenia przez 3 30
Operatory arytmetyczne iczby typu reg bez znaku są liczbami bez znaku iczby typu reg ze znakiem są liczbami ze znakiem w U2 integer inta; reg [15:0] rega; reg signed [15:0] regs; inta = -4 d12; rega = inta / 3; // wynikiem operacji jest -4, rega = 65532 rega = -4 d12; // rega = 65524 inta = rega / 3; // wynikiem jest 21841 inta = -4 d12 / 3; // wynikiem jest 1431655761, bo -4 d12 jest brane jako 32-bitowa liczba 11...10011 2 rega = -12 / 3; // wynikiem jest -4, rega = 65532 regs = -12 / 3; // wynikiem jest -4, regs = -4 signed reg regs = -4 sd12 / 3; // wynikiem jest 1. -4 sd12 = 4, stąd 4/3=1 31
Operatory przesunięcia << >> przesunięcie logiczne <<< >>> przesunięcie arytmetyczne W operacji przesunięcia logicznego i arytmetycznego w lewo (<<, <<<) bity uzupełnione są zerami W operacji przesunięcia logicznego w prawo (>>) bity uzupełnione są zerami W operacji przesunięcia arytmetycznego w prawo (>>>) bity uzupełnione są bitem znaku reg [3:0] start, result; reg signed [3:0] start, result; start = 1; start = 4 b1000; result = (start << 2); result = (start >>> 2); Politechnika //start=0001, Warszawska result=0100 //start=1000, result=111032
Operatory relacji > większy niż < mniejszy niż >= większy lub równy <= mniejszy lub równy Wynikiem operacji jest skalar Jeżeli w jednym z operatorów jest x lub z to wynikiem jest 1-bitowy skalar x Przykład: 1 > 0 // wynikiem jest 1 b1x1 <= 0 // wynikiem jest x 10 < z // wynikiem jest x 33
Operatory porównania == równość logiczna wynikiem jest 0, 1 lub x!= nierówność logiczna === równość stanów bitów wynikiem jest 0 lub 1!== nierówność stanów bitów Wynikiem operacji jest skalar W porównaniu logicznym jeżeli występuje x lub z to wynikiem jest 1-bitowy skalar x Przykład: 4 b 1z0x == 4 b 1z0x // wynikiem jest x 4 b 1z0x!= 4 b 1z0x // wynikiem jest x 4 b 1z0x === 4 b 1z0x // wynikiem jest 1 4 b 1z0x!== 4 b 1z0x // wynikiem jest 0 34
Operatory bitowe & AN OR ^ XOR ^~ ~^ XNOR ~ NOT Jeżeli jeden z operatorów jest krótszy to jest on uzupełniony zerami na najstarszych pozycjach Przykład: a = 4'b1010 d = ~a // 0101 b = 4'b1100 e = a & b // 1000 c = 2'b11 f = b ^ c // 1100 XOR 0011 = 0011 35
Operatory redukcji & AN ~& NAN OR ~ NOR ^ XOR ^~ ~^ XNOR Wynikiem operacji na wektorze jest jeden bit Przykład: a = 4'b1100; b = &a; // b = 0 c = a; // c = 1 36
Operatory logiczne && logiczny AN logiczny OR! logiczna negacja Przykład 1: alfa = 237, beta = 0 rega = alpha && beta; // (true AN false) rega jest 0 regb = alpha beta; // (true OR false) regb jest 1 Przykład 2: Użycie nawiasów dla lepszej czytelności a < size-1 && b!= c && index!= lastone (a < size-1) && (b!= c) && (index!= lastone) Przykład 3: Użycie operatora! if (!inword) // częściej używane... if (inword == 0) 37
Operator warunkowy cond_expr? true_expr : false_expr Przykład mux 4-1: o = (s == 2'b00)? I0 : ((s == 2'b01)? I1 : (s == 2'b10)? I2 : I3 ); Przykład AU: d = (f==add)? (a+b) : ((f==substract)? (a-b) : ((f==compl)? ~a : ~b)); 38
Operatory łączenia (concatenation, replication) { } Łączy dwa lub więcej wektorów Każdy z wektorów musi mieć określoną długość Przykład: {a, b[3:0], w, 3 b101} // odpowiada kolejnej linii {a, b[3], b[2], b[1], b[0], w, 1 b1, 1 b0, 1 b1} {a, 1} // iczba 1 nie ma określonej długości Przykład powielania: {4{w}} // odpowiada {w, w, w, w} {b, {3{a, b}}} // odpowiada {b, a, b, a, b, a, b} nie może być zerem, x lub z 39