VHDL Today, Verilog HDL is an accepted IEEE standard. In 1995, the original standard IEEE 1364-1995 was approved. IEEE 1364-2001 is the latest Verilog HDL standard that made significant improvements to the original standard
VHDL, Verilog VHDL – bardziej podobny do ADA, Pascal Verilog – bardziej podobny do C Większość firm US używa Verilog Większość firm europejskich + Intel + Texas Instruments używa VHDL VHDL jest lepiej wyposażony do tworzenia złożonych, zmieniających się projektów
Cztery poziomy abstrakcji opisu Behawioralny (algorytmiczny) Ścieżka danych (Strukturalny) Poziom bramek (Gate Level) Poziom przełącznikowy – zależny od technologii programowalnego układu
RTL, Synteza Mieszanka stylu behawioralnego i ścieżki danych, to tzw. RTL – Register Transfer Level W trakcie syntezy następuje Przejście z RTL na Gate Level – poziom bramek Im wyższy poziom abstrakcji, tym bardziej niezależny od implementacji i elastyczny projekt
Przykład
Przykład module ripple_carry_counter(q, clk, reset); output [3:0] q; input clk, reset; T_FF tff0(q[0],clk, reset); T_FF tff1(q[1],q[0], reset); T_FF tff2(q[2],q[1], reset); T_FF tff3(q[3],q[2], reset); endmodule
Przykład module T_FF(q, clk, reset); output q; input clk, reset; wire d; D_FF dff0(q, d, clk, reset); not n1(d, q); endmodule
Przykład module D_FF(q, d, clk, reset); output q; input d, clk, reset; reg q; always @(posedge reset or negedge clk) if (reset) q <= 1'b0; else q <= d; endmodule
Test bench
Test bench module stimulus; reg clk; reg reset; wire[3:0] q; ripple_carry_counter r1(q, clk, reset); initial clk = 1'b0; always #5 clk = ~clk; initial begin reset = 1'b1; #15 reset = 1'b0; #180 reset = 1'b1; #10 reset = 1'b0; #20 $finish; end initial $monitor($time, " Output q = %d", q); endmodule
Notacja Zapis liczby z rozmiarem: <rozmiar> '<format bazy> <liczba> Przykłady: 4'b1111 12'habc 16'd255
Notacja Liczby bez rozmiaru: 23456 // domyślnie – 32 bity 'hc3 'o21
Operatory a = ~ b; // jednoargumentowe a = b && c; // dwuargumentowe a = b ? c : d; // trójargumentowe
Operatory arytmetyczne: + - * / % (mod) relacyjne: > >= < <= == != logiczne: && (and) || (or) bitowe: & (and) | (or) ^ (xor) ^~ (not-xor) przesunięcia bitowe: << (shl) >> (shr)
Operatory Warunkowy A ? B : C (jeśli warunek A spełniony, to wartość B, w przeciwnym wypadku – wartość C) Sklejenie: { A, B, C } Powtórzenie N razy: { N{A} }
Wartości logiczne Wartości: 0, 1, x, z Przykład: strong1, weak0
Wire, reg W VHDL – signal W Verilog: Deklaracje: np. wire – połączenie między blokami w opisie strukturalnym reg – zmienna (alokacja pamięci do przechowywania jakiejś wartości) Deklaracje: np. reg reset; wire a;
Wektory W VHDL – tablice bitów W Verilog – wektory: wire a; wire [7:0] bus; wire [31:0] busA,busB,busC; reg [0:40] virtual_addr;
Selekcja fragmentu wektora busA[7] bus[2:0]
Selekcja fragmentu wektora
Selekcja fragmentu wektora Normalna: busA[7] bus[2:0] Ze zmienną: [<bit_pocz>{+|-}:<szer>] : data2[31-:8]; //start=31, szer=8 => data[24:31] data2[24+:8]; //start=24, szer=8 => data[24:31]
Selekcja fragmentu wektora Bit startowy może być zmienną: for (j=0; j<=31; j=j+1) byte = data1[(j*8)+:8]; data1[(byteNum*8)+:8] = 8'b0; Oczywiście możliwe w VHDL: pamiec(conv_integer(addr))
Typy danych Typy proste: Tablice: Integer, Real, Time integer count[0:7]; reg bool[31:0]; time chk_point[1:100][0:255];
Stałe parameter port_id = 5; parameter cache_line_width = 256;
Stałe Deklaracja w module: parameter port_id = 5; parameter cache_line_width = 256; Nadanie wartości w instancji modułu: defparam (jak generic map w VHDL) Parametr, który nie podlega defparam: localparam
Moduł Verilog Definicja bloku, odpowiada parze entity/architecture Lista wejść/wyjść – jak deklaracja port w entity Pozostałe instrukcje – jak wnętrze architekture
Moduł Verilog Jednak moduł jest jedynie szablonem bloku Musi nastąpić deklaracja instancji Musi więc ostatecznie wystąpić strukturalny poziom specyfikacji
Moduł – deklaracja portów Poza wyliczeniem portów w nagłówku, deklaracja kierunków: module SR_latch(Q, Qbar, Sbar, Rbar); output Q, Qbar; input Sbar, Rbar; //inout xx; nand n1(Q, Sbar, Qbar); nand n2(Qbar, Rbar, Q); endmodule
Opis strukturalny
Opis strukturalny Lista połączeń: Wg kolejności: Z nazwami:
Opis ścieżką danych Składnia: przypisanie ::= assign [siła] [opóźn] lista_przypisań ; lista_przypisań ::= elem_przyp { , elem_przyp } elem_przyp ::= l_strona = wyrażenie Przykłady: assign addr[15:0] = addr1_bits[15:0] ^ addr2_bits[15:0]; assign {c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in; wire #10 out = in1 & in2;
Opis behawioralny Odpowiednik procesu: struktury always, initial Przykład: module clock_gen (output reg clock); initial clock = 1'b0; always #10 clock = ~clock; initial #1000 $finish; endmodule
Lista czułości always @( reset, clock, d) begin if (reset) q = 1'b0; else if(clock) q = d; end
Wyrażenie warunkowe
Instrukcja wyboru
Pętle
Egzekucja sekwencyjna i równoległa Przetwarzanie sekwencyjne: begin .. end Przetwarzanie równoległe: fork .. join