Język HDL - VERLOG Hardware Description Language (Syntetyzowalna warstwa języka) RUS RUS
VERLOG rzegląd zagadnień RUS RUS
prowadzenie do języka Reprezentacja układu cyfrowego w Verilogu opis strukturalny - elementy + połączenia opis behawioralny funkcja jako zachowanie odstawowe elementy i konstrukcje języka moduł, instrukcje współbieżne i proceduralne instancja (powielanie), struktura hierachiczna wartości sygnałów, węzły i typy węzłów zapis wektorowy, parametry, sieci i zmienne operacje arytmetyczne i reprezentacja liczb operatory w VERLOGu RUS 4 3
Opis strukturalny Elementy konstrukcji: Zbiór prymitywów, odpowiadających typowym bramkom logicznym - bramka => nazwy funkcji, wyjścia i wejść np. 2-we AND and (y, x1, x2) // y wyjście, x1, x2 - wejścia 4-we OR or (y, x1, x2, x3, x4) NO not (y, x) Specyfikacja (forma opisu): moduł zawiera instrukcje i wyrażenia definiujące układ, wejścia i wyjścia (porty), sygnały, połączenia jawne i ukryte; nazwy modułów i sygnałów muszą zaczynać się literą i mogą zawierać dowolną literę lub liczbę plus znaki _ i $ VERLOG rozróżnia wielkość liter znak // poprzedza komentarz (do końca linii) RUS 4 4
Opis strukturalny rzykład: x 1 x 2 f x 3 Rys. 2.30. rosta funkcja logiczna (mux2-1) RUS 4 5
Opis strukturalny module example1 (x1, x2, x3, f); input x1, x2, x3; output f; endmodule and (g, x1, x2); not (k, x2); and (h, k, x3); or (f, g, h); Rys. 2. 31. Opis w Verilog u układu z rys. 2.30. RUS 4 6
Opis strukturalny module example2 (x1, x2, x3, x4, f, g, h); input x1, x2, x3, x4; output f, g, h; endmodule and (z1, x1, x3); and (z2, x2, x4); or (g, z1, z2); or (z3, x1, ~x3); or (z4, ~x2, x4); and (h, z3, z4); or (f, g, h); Rys. 2.32. Opis w VERLOGu układu o 4-wejściach RUS 4 7
Opis strukturalny x 1 x 3 g x 2 x 4 f h Rys. 2.33. Schemat układu opisanego kodem z rys. 2.32 RUS 4 8
Opis behawioralny Opis strukturalny przy użyciu prymitywów nieefektywny dla dużych układów! alternatywa bardziej abstrakcyjny opis za pomocą wyrażeń logicznych i konstrukcji programowych (instrukcji i przypisań) definicja funkcji za pomocą równań słowo kluczowe assign określa przypisania ciągłe (typ instrukcji współbieżnej), które są realizowane równolegle, bez względu na porządek występowania zachowanie układu może być zdefiniowane za pomocą instrukcji if-else (typ instrukcji proceduralnej), której konstrukcja znajduje się wewnątrz bloku always - blok ten może zawierać wiele instrukcji, przy czym są one realizowane ściśle w kolejności występowania w bloku always po symbolu @ w nawiasach znajduje się ciąg sygnałów (lista wrażliwości): instrukcje wewnątrz bloku są wykonywane tylko wtedy, gdy zmienia się sygnał z tej listy RUS 4 9
Opis behawioralny module example3 (x1, x2, x3, f); endmodule input x1, x2, x3; output f; assign f = (x1 & x2) (~x2 & x3); // symbol ~ (tylda) oznacza negację Rys. 2.34. Specyfikacja układu z rys. 2.30 z użyciem przypisania ciągłego RUS 4 10
Opis behawioralny module example4 (x1, x2, x3, x4, f, g, h); input x1, x2, x3, x4; output f, g, h; assign g = (x1 & x3) (x2 & x4); assign h = (x1 ~x3) & (~x2 x4); assign f = g h; endmodule Rys. 2.35. Specyfikacja układu z rys. 2.33 z użyciem przypisania ciągłego RUS 4 11
Opis behawioralny // Specyfikacja behawioralna module example5 (x1, x2, x3, f); input x1, x2, x3; output f ; reg f ; // zmienna dla przypisań w instrukcjach proceduralnych always @(x1 or x2 or x3) if (x2 == 1) f = x1; else f = x3; endmodule Rys. 2.36. Opis układu z rys. 2.30 z użyciem instrukcji if-else RUS 4 12
Elementy języka Sygnały deklarowane jako typ net lub variable, termin net odnosi się do połączeń punktów układu; dentyfikatory nazwy zmiennych i innych elementów języka, mogą się składać z dowolnych liter lub cyfr i znaków _ i $; artości sygnałów, liczby i parametry pojedyncze sygnały mogą przyjmować cztery wartości: 0 wartość logiczna 0 1 wartość logiczna 1 z tri-state (stan wysokiej impedancji) x wartość nieznana artości zmiennych wektorowych są określone za pomocą stałych o postaci: [size][ radix]constant, gdzie size jest liczbą bitów stałej, a radix podstawą systemu liczbowego RUS 4 13
Elementy języka Radix podstawa może być: d = dziesiętna b = binarna h = heksadecymalna o = oktalna Jeśli podstawa nie jest określona, to domyślnie jest dziesiętna Gdy size określa większą liczbę bitów niż potrzebna do reprezentacji stałej, to uzupełnia się ją zerami rzykłady: 0 liczba 0 10 dziesiętna liczba 10 b10 binarna liczba 10 = (2) 10 h10 heksadecymalna liczba 10 = (16) 10 4 b100 binarna liczba 0100 = (4) 10 4 bx nieznana 4-bitowa liczba xxxx RUS 4 14
Elementy języka arametr -wiąże nazwę identyfikatora ze stałą rzykłady deklaracji: parameter n = 4; parameter S0 = 2 b00, S1 = 2 b01, S3 = 2 b11; dentyfikator n może być użyty w miejsce liczby 4, nazwę S0 można podstawić w miejsce wartości 2 b00 itd.. ażnym zastosowaniem parametrów jest jest parametryzowanie podukładów RUS 4 15
ypy sieci i zmiennych Elementy języka Sieć (Net) - reprezentuje węzeł w układzie, do syntezy stosuje się dwa typy: wire i tri yp wire stosuje się do połączeń wyjść jednego elementu logicznego z wejściami innego rzykład deklaracji typu skalar wire (dla pojedynczych węzłów): wire x; wire Cin, AddSub; Oraz wektor wire (dla grupy węzłów): wire [3:0] S RUS 4 16
ypy zmiennych Elementy języka Zmienna (Variable) - sieci reprezentują połączenia między elementami logicznymi nie oddając istoty zachowania; do tego celu używa się zmiennych, którym w jednej instrukcji przypisuje się pewną wartość do czasu wykonania następnej instrukcji, Rozróżnia się dwa typy zmiennych: reg i integer rzykład: Count = 0; // reg [2:0] Count; for (k = 0; k < 4; k = k +1) // integer k; if (S[k]) Count = Count + 1; RUS 4 17
Elementy języka Moduł podstawowa konstrukcja języka Opisuje układ lub podukład; w 1-ej linii deklaracji modułu znajduje się jego nazwa np. identyfikator, w następnych liniach lista portów; typy portów input, output i inout (dwukierunkowe) oraz skalarne i wektorowe, przykłady portów: input Cin, x, y; input [3:0] X, Y; inout [7:0] Bus; output Cout, s; RUS 4 18
Elementy języka module module name [(port name{, port name})]; [parameter declarations] [input declarations] [output declarations] [inout declarations] [wire or tri declarations] [reg or integer declarations] [function or task declarations] [assign continuous assignments] [initial block] [always blocks] [gate instantiations] [module instantiations] Endmodule Rys. A.1. Ogólna deklaracja modułu RUS 4 19
Język VERLOG w praktyce RUS RUS
Specyfikacja układów arytmetycznych module fulladd (Cin, x, y, s, Cout); input Cin, x, y; output s, Cout; xor (s, x, y, Cin); and (z1, x, y); // instancje (kopie) bramki AND and (z2, x, Cin); // symbol and można pominąć and (z3, y, Cin); // symbol and można pominąć or (Cout, z1, z2, z3); endmodule Rys. 5.23. Opis pełnego sumatora z użyciem bramek. RUS 4 21
Specyfikacja układów arytmetycznych module fulladd (Cin, x, y, s, Cout); input Cin, x, y; output s, Cout; assign s = x ^ y ^ Cin; // równania logiczne ^ = XOR assign Cout = (x & y) (x & Cin) (y & Cin); // symbol assign endmodule Rys. 5.23. Opis pełnego sumatora z użyciem przypisania ciągłego. RUS 4 22
Specyfikacja układów arytmetycznych module adder4 (carryin, x3, x2, x1, x0, y3, y2, y1, y0, s3, s2, s1, s0, carryout); input carryin, x3, x2, x1, x0, y3, y2, y1, y0; output s3, s2, s1, s0, carryout; fulladd stage0 (carryin, x0, y0, s0, c1); // instancja modułu fulladd fulladd stage1 (c1, x1, y1, s1, c2); // każda instancja musi mieć unikalną nazwę fulladd stage2 (c2, x2, y2, s2, c3); // połączenia między instancjami są niejawne fulladd stage3 (c3, x3, y3, s3, carryout); endmodule module fulladd (Cin, x, y, s, Cout); input Cin, x, y; output s, Cout; // oryginał modułu fulladd assign s = x ^ y ^ Cin, assign Cout = (x & y) (x & Cin) (y & Cin); endmodule Rys. 5.27. Opis 4-bitowego sumatora RUS 4 23
Specyfikacja układów arytmetycznych wykorzystanie notacji wektorowej module adder4 (carryin, X, Y, S, carryout); input carryin; input [3:0] X, Y; output [3:0] S; output carryout; wire [3:1] C; // połączenia jawne fulladd stage0 (carryin, X[0], Y[0], S[0], C[1]); fulladd stage1 (C[1], X[1], Y[1], S[1], C[2]); fulladd stage2 (C[2], X[2], Y[2], S[2], C[3]); fulladd stage3 (C[3], X[3], Y[3], S[3], carryout); endmodule Rys. 5.28. Opis cztero-bitowego sumatora z użyciem notacji wektorowej RUS 4 24
Specyfikacja układów arytmetycznych iteracja zamiast kopiowania x n 1 y n 1 x 1 y 1 x 0 y 0 c n FA c n 1 c 2 FA c 1 FA c 0 s n 1 s 1 s 0 MSB pozycja LSB pozycja Rys 5.6. N-bitowy sumator kaskadowy RUS 4 25
Specyfikacja układów arytmetycznych iteracja zamiast kopiowania module addern (carryin, X, Y, S, carryout); parameter n=32; input carryin; input [n-1:0] X, Y; output [n-1:0] S; output carryout; reg [n-1:0] S; reg carryout; reg [n:0] C; integer k; always @(X or Y or carryin) begin C[0] = carryin; for (k = 0; k < n; k = k+1) // pętla for powtarza n razy begin // funkcje sumy i przeniesienia S[k] = X[k] ^ Y[k] ^ C[k]; C[k+1] = (X[k] & Y[k]) (X[k] & C[k]) (Y[k] & C[k]); end carryout = C[n]; end endmodule RUS 4 Rys 5.29. 32-bitowy sumator kaskadowy 26
Specyfikacja układów arytmetycznych użycie operacji arytmetycznych module addern (carryin, X, Y, S); parameter n = 32; input carryin; input [n-1:0] X, Y; output [n-1:0] S; reg [n-1:0] S; always @(X or Y or carryin) S = X + Y + carryin; // bez wyjścia przeniesienia endmodule Rys 5. 30. Specyfikacja n-bitowego sumatora przy użyciu operacji arytmetycznych. RUS 4 27
Specyfikacja układów arytmetycznych użycie operacji arytmetycznych module addern (carryin, X, Y, S, carryout, overflow); parameter n = 32; input carryin; input [n-1:0] X, Y; output [n-1:0] S; output carryout, overflow; reg [n-1:0] S; reg carryout, overflow; always @(X or Y or carryin) begin S = X + Y + carryin; carryout = (X[n-1] & Y[n-1]) (X[n-1] & ~S[n-1]) (Y[n-1] & ~S[n-1]); overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1]; end endmodule Rys 5. 31. Specyfikacja n-bitowego sumatora z wyjściami przeniesienia i przepełnienia RUS 4 28
Specyfikacja układów arytmetycznych użycie operacji arytmetycznych module addern (carryin, X, Y, S, carryout, overflow); parameter n = 32; input carryin; input [n-1:0] X, Y; output [n-1:0] S; output carryout, overflow; reg [n-1:0] S; reg carryout, overflow; reg [n:0] Sum; always @(X or Y or carryin) begin Sum = {1'b0,X} + {1'b0,Y} + carryin; S = Sum[n-1:0]; carryout = Sum[n]; // Suma Sum rozszerzona o jeden bit = 0 overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1]; end Rys 5. 32. Alternatywna specyfikacja n-bitowego sumatora z wyjściami przeniesienia i przepełnienia endmodule RUS 4 29
Specyfikacja układów arytmetycznych użycie operacji arytmetycznych module addern (carryin, X, Y, S, carryout, overflow); parameter n = 32; input carryin; input [n-1:0] X, Y; output [n-1:0] S; output carryout, overflow; reg [n-1:0] S; reg carryout, overflow; always @(X or Y or carryin) begin {carryout, S} = X + Y + carryin; // konkatenacja przeniesienia i sumy overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1]; end endmodule Rys 5. 33. Uproszczona specyfikacja pełnego n-bitowego sumatora RUS 4 30
Specyfikacja układów arytmetycznych + X Y + użycie operacji arytmetycznych 0 1 1 1 0 1 0 1 + 7 5 Z carry 1 1 0 0 + 0 1 1 0 1 0 0 1 0 S = 2 12 + X Y + 1 0 0 0 1 0 0 1 + 8 9 Z carry 1 0 0 0 1 + 0 1 1 0 1 0 1 1 1 17 S = 7 Rys 5. 39. Sumator liczb w kodzie BCD RUS 4 31
Specyfikacja układów arytmetycznych użycie operacji arytmetycznych X Y carry-out 4-bit adder Z c in Detect if sum > 9 6 0 Adjust MUX c out 4-bit adder 0 Rys 5. 40. Schemat blokowy sumatora w kodzie BCD S RUS 4 32
Specyfikacja układów arytmetycznych użycie operacji arytmetycznych module bcdadd (Cin, X, Y, S, Cout); input Cin; input [3:0] X, Y; output [3:0] S; output Cout; reg [3:0] S; reg Cout; reg [4:0] Z; always@ (X or Y or Cin) begin Z = X + Y + Cin; if (Z < 10) {Cout, S} = Z; else {Cout, S} = Z + 6; end Rys 5. 41. Specyfikacja sumatora endmodule w kodzie BCD RUS 4 33
Specyfikacja układów arytmetycznych użycie operacji arytmetycznych x 3 x 2 x 1 x 0 y 3 y 2 y 1 y 0 Four-bit adder c in z 3 z 2 z 1 z 0 wo-bit adder c out s 3 s 2 s 1 s 0 RUS 4 Rys 5. 43. Uproszczony układ sumatora w kodzie BCD 34