Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011 Jiří Douša, katedra číslicového návrhu (K18103), České vysoké učení technické v Praze, fakulta informačních technologií Přednáška 8: VERILOG srovnání s VHDL, celková charakteristika Stručný obsah: deklarace modulu, logické a numerické datové typy, příslušné operátory, sítě a proměnné.
Použitá literatura: 1. Donald E. Thomas, Philip R. Moorby: The Verilog Hardware Description Language, Kluwer Academic Publishers 1991, 2. Eliezer Sternheim, Rajvir Singh, Yatin Trivedi: Digital Design with Verilog, 3. Michael D. Ciletti: Starter s Quide to Verilog 2001, Prentice Hall 2004, 4. Zainalabedin Navabi: Verilog Digital Design, McGraw- Hill, 2nd Edition 2006, 5. Michael D. Ciletti: Advanced Digital Design with the Verilog HDL, Prentice Hall 2003, 6. Samir Palnitkar: Verilog HDL ( A guide for Digital Design and Synthesis), Prentice Hall 1996. 10.1.2012 MI-SIM Jiří Douša 2
Verilog a VHDL standard v r. 1995 (IEEE Std 1364): v95, v r. 2001 revize: V01 syntax vychází z jazyka C: rozlišuje malá a velká písmena, // jednořádkový komentář, */ víceřádkový komentář /*, neexistují operátory ++ a -, místo { begin, místo } end obor simulačních hodnot: čtyř-hodnotový (+ síly) - nelze měnit, datové typy: omezené ve srovnání s VHDL: logický typ: 0, 1, x, z (nosiče: reg, sítě), reg: síla strong ( ve smyslu proměnná, nikoliv registr), sítě: různé síly numerické typy: integer, real, time, realtime (nosiče: proměnná příslušného typu) nelze deklarovat nové typy, resoluční funkce: zabudována v propojovacích sítích ( nelze měnit) zpoždění: setrvačné (moduly), transportní (sítě), zdrojový program: množina modulů 10.1.2012 MI-SIM Jiří Douša 3
Verilog a VHDL delta zpoždění: paralelní prostředí a strukturní popis : ne, sekvenčním prostředí: lze jeho efekt vyvolat pomocí neblokujících přiřazení, proměnné jsou statické ( vyjma některých procedur ), modul: samostatná jednotka programu analogie entity a architektury z VHDL, umožňuje mixovat: strukturní popis ( propojení modulů a hradel pomocí sítí ), paralelní prostředí ( continuous assignments ): pouze pro popis kombinačních sítí, nelze ukládat hodnoty do proměnných sekvenční prostředí (procedurální bloky): nelze ukládat hodnoty do sítí, ukládání hodnot pouze do proměnných, blokující nebo neblokující příkazy, existuje knihovna elementárních vestavěných modulů, existuje možnost uživatelsky definovat další elementární moduly ( např. pomocí pravdivostních tabulek ), program: modul nebo zahnizděná množina modulů 10.1.2012 MI-SIM Jiří Douša 4
Deklarace modulu Syntax modulu: module [ # ( < parametry modulu > ) V01 ] endmodule < identifikator modulu > [ (< porty modulu >V01 i specif. ) ] [ < parametry modulu-deklarace konstant > ] V95 i V01 [ < specifikace portů modulu > V95 i V01 ] [ < deklarace proměnných > ] // shared variables [ < deklarace sítí > ] // signály [ < deklarace funkcí > ] [ < deklarace procedur > ] [ < příkazy initial > ] // sekvenční proces [ < příkazy always > ] // sekvenční proces [ < příkazy assign > ] // data-flow příkazy [ < instalace vnitřních modulů, vestavěných elem. členů, modulů UDP ( user-defined primitives ) > ] [ < příkaz generate > ] < deklarace konstant > ::= parameter < identifikátor > = < literál > ; < deklarace proměnných > ::= reg reg signed integer real realtime < deklarace sítí > ::= wire wand wor, trireg Poznámka: nezáleží na pořadí jednotlivých příkazů, 10.1.2012 MI-SIM Jiří Douša 5
Verilog a datové typy skalární: logický ( fyzikální ) interpretace: bez znaménka nebo se znaménkem, počáteční hodnota: x, obor hodnot: 0, 1, x,z nosiče proměnné délky: V95: proměnné typu reg, všechny typy sítí V01: navíc: reg signed, wire signed (interpretace se znaménkem), jednobitové proměnné typu wire není třeba deklarovat numerický typ (abstraktní): integer ( 32 bitů ), poč. hodnota: 0, interpretace: se znaménkem genvar (32 bitů), poč. hodnota: 0 (pouze V 01), interpretace: bez znaménka (nezáporný integer), real ( 64 bitů ), poč. hodnota: 0.0, time ( 64 bitů ), poč. hodnota: 0, interpretace: bez znaménka, realtime ( 64 bitů ), poč. hodnota 0.0, formát jako real nosiče: proměnné ( nutno deklarovat ), strukturované typy V 95: pouze jednorozměrné pole nosiče reg, integer, time V01: libovolný počet dimensí nosiče: reg, reg signed, integer, time, realtime, sítě ( včetně signed) 10.1.2012 MI-SIM Jiří Douša 6
Typy sítí účel: modelovat elektrická propojení => slouží k přenosu hodnot buzení: pouze paralelní příkazy a výstupy modulů, syntax deklarace sítě: < typ sítě>[signed] [<síla>][<#zpoždění sítě>] <seznam identifikátorů>; <typ sítě>: určuje dimensi sítě a typ resoluční funkce pro případ více budičů, wire ( tri ).síť pro spojení více budičů, wand ( triand ).montážní and, wor ( trior ) montážní or, tri0...resoluční funkce jako wire, místo z produkuje vždy 0 síly pull (vodič připojený na zem přes odpor), tri1...resoluční funkce jako wire, místo z produkuje vždy 1 síly pull (vodič připojený na zdroj přes odpor ), supply0.budič hodnoty 0 síly Su, supply1.budič hodnoty 1 síly Su, trireg.kapacitní vodič => po odpojení všech budičů pamatuje poslední hodnotu po dobu specifikovanou v deklaraci <sila>: udává sílu budiče, je-li tento trvale připojen na síť < zpoždění sítě> : má transportní charakter a je přičteno ke zpoždění hradla, které síť budí; šíře filtrovaných pulzů je určena zpožděním samotného hradla Příklad: wire (strong0, weak1) # 2 a=1; // trvalý zdroj 1 zapnutý za 2 ns wire [ 7 : 0 ] a, b, c; // trojice osmibitových sítí (hodnot unsigned), jednobitové sítě typu wire nwní třeba deklarovat 10.1.2012 MI-SIM Jiří Douša 7
Literály Typ reg: interpretace unsigned Typ reg signed: interpretace signed ( pouze V01) Syntax zápisu: [ < délka > ] [ < báze> ] < hodnota > [ < délka > ] s [ < báze >] < hodnota > ( V01) Pravidla interpretace: specifikace délky určuje délku konstanty; pokud tato určuje více bitů než požaduje hodnota, pak jsou zleva doplněny nuly, případně x ( je-li MSB = x ); pokud hodnota vyžaduje více bitů, než určuje délka, pak jsou uvažovány pouze LSBits, při přiřazení je konstanta o dané délce automaticky expandovaná (případně oříznutá) na délku příslušné proměnné, bez specifikace délky je <hodnota> chápána jako 32 bitová, < hodnota> nesmí obsahovat znaménko, < báze>: binární (b nebo B), dekadická (d nebo D), oktalová (o nebo O), hexadecimální (h nebo H), Příklady : 16 hafa.interpretace: 0000_1010_1111_1010, 8 bx01..interpretace: xxxx_xx01, 1 bx01..interpretace: 1, - 8 d5..interpretace: 1111_1011 10.1.2012 MI-SIM Jiří Douša 8
Literály Typ integer: nejsou přípustné symboly x a z, počáteční hodnota = 0, V95: různé interpretace literálů chybí specifikace báze: interpretace hodnoty jako čísla se znaménkem, nechybí specifikace báze: interpretace hodnoty jako čísla bez znaménka, příklady: - 31, 1024, +64 signed numbers, hff, 32 d123, 32 b1111 unsigned numbers V01: hff, 32 d123, 32 b1111 unsigned numbers s hff, 32 sd123, 32 sb111..signed numbers příklad: -12 / 4 = -3, - d12 / 4 =. velké číslo ( unsigned ) Typ real: nejsou přípustné symboly x a z, počáteční hodnota = 0.0, v případě desetinné tečky musí být před a za nejméně jedna číslice exponenciální tvar je možný (e nebo E): příklady: -6.55, + 2e10, 5.3E12, etc. 10.1.2012 MI-SIM Jiří Douša 9
Deklarace konstant a proměnných Deklarace konstant - příklady: parameter WIDTH = 63, BYTE_ADDRESS = 1023; // signed 32b parameter INITIAL_STATE [ 3:0 ] =4 b1011; // unsigned 4b parameter PI = 3.14; // real 64 b Poznámka: při deklaraci konstant lze použít výrazy Deklarace proměnných příklady: deklarace skalárních proměnných : reg set, reset, FF0; // jednobitová logická proměnná reg [31:0] soucin; // 32 bitová logická proměnná integer i, j; // 32 bitové proměnné real a, b, c; // 64 bitové proměnné time start, stop; // 64 bitové proměnné přístupy k dílčím bitům proměnných: indexace, řezy soucin [ 7 : 0 ].8 nejnižších bitů soucin [ 5- : 4 ].bity 5, 4, 3, 2 soucin [ 8+ : 8 ].bity 15, 14,.., 8 deklarace skalárních sítí: wire s1, s2, s3; // representace jednotlivých vodičů wire [4:0] control_bus; // representace pětice vodičů další typy sítí - viz později 10.1.2012 MI-SIM Jiří Douša 10
Přístupy k polím deklarace polí typu reg: reg [31:0] memm1 [ 0 : 1023 ] ; // paměť 1k slov po 32 bitech real poler [ 0 : 7 ] [ 0 : 15 ] [ 0 : 31 ] ; // tří-rozměrné // pole 32 bitových položek typu real deklarace polí sítí: wire [ 7:0 ] data_bus [ 0 : 3 ]; // jedno-rozměrné pole se // čtyřmi osmi-bitovými skupinami vodičů Přístupy k elementům polí: 1) adresace jednotlivých slov: předpoklad: existence deklarací: reg [ 31 : 0 ] R1; reg [ 7 : 0 ] byte ; R1 = memm1 [ 0 ]; // 0 - té 32 bitové slovo byte = memm1 [ 0 ][ 31- : 8 ] ; // nejvyšší byte 0 - tého slova byte = memm1 [ R1 [ 0+:10 ] ] ; // adresováno 10-ti bity R1 memm1 * 1 + = ; // OK: zápis slova memm1 = ; // chyba: zápis do celé paměti nelze 2) adresace jednotlivých bitů: další index - lze použít i proměnnou reg [ 7 : 0 ] A, B; reg s1; real R; B = 5; A * B + = 1 b0; // nulování 5. bitu s1 = memm1 [ 2 ] [ B ] ; // 2. slovo, 5. bit R = poler [ 3 ] [ 14 ] [ 30 ] ; // nutné zachovat pořadí z deklarace 3) adresace skupin vybraných bitů (řezů): memm1 [ 2 ] [ 5 : 0 ] ; // 2. slovo, bity 5 až 0 10.1.2012 MI-SIM Jiří Douša 11
Logické operátory Bitwise operátory: ~, &,, ^, ~^,, ^~ ( pro skaláry a vektory ) aplikované na všechny bity vektorů ( i různých délek ), produkují výsledek délky jako delší z operandů, příklad: wire [7:0] a, b, c; assign c [7:0] = a [7:0] & b [7:0]; // totéž co assign c = a & b; Redukční operátory (unární ): & (and), ~& (nand), (or), ~ (nor), ^ (xor), ~^ nebo ^~ (nxor) aplikované na všechny bity vektoru, produkují výsledek s hodnotou 1 nebo 0 nebo x, příklady: & (100101) = 0 (100101) = 1 & (1001x1 ) = 0, ~& (1001x1) = 1, (1001x1 ) = 1, ~ (1001x1) = 0, ^ (1001x1 ) = x ~^ (1001x1 ) = x Relační operátory: <, <=, >, >=, ( pro skaláry a vektory ) produkují x pokud některý vektor obsahuje x nebo z; pro úplně definované operandy pak produkují 1 nebo 0, operandy nemusí být stejné délky, příklady: 1001 < 1110 => hodnota výrazu = 1 1001 > 1110 => hodnota výrazu = 0 11x0 < 0001 => hodnota výrazu = x 10.1.2012 MI-SIM Jiří Douša 12
Logické operátory Relační operátory rovnosti: ( skaláry a vektory i různých délek ) operátory ==,!= : jako výsledek mohou produkovat x pokud některý z operandů obsahuje x nebo z ( jinak 1 nebo 0), operátory ===,!== : uvažují čtyř-hodnotovou logiku a jako výsledek produkují pouze 1 nebo 0 Logické operátory: ~ (negace), && (and), (or) pro skaláry a vektory i různých délek, logické výrazy jsou vyhodnocovány zleva doprava a toto vyhodnocování končí v okamžiku kdy výraz nabude hodnoty 1 nebo 0; mohou produkovat i x, příklady: předpoklad: A = 3 b001, B = 3 b11x A && B. hodnota výrazu = 1 b1 // true && true A & B.. hodnota výrazu = 3 b00x ( bitwise operátor ) A & (&B) hodnota výrazu = 3 b00x ( 001 & x ) A B.. chyba syntaxe Operátory posuvů: <<, >> logické posuvy ( předpoklad: reg [ 7:0 ] A = 8 b1100_1111 ) příklady: A >> 2 => A = 0011_0011 A << 3 => A = 0111_1000 aritmetické posuvy ( reg signed [ 7:0 ] A = 8 b1100_1111 ) příklady: A >> 2 => A = 1111_0011 A << 3 => A = 0111_1000 10.1.2012 MI-SIM Jiří Douša 13
Operátor zřetězení: syntax: { < operand>, < operand>,, } zřetězení lze opakovat pomocí prefixu, literál nespecifikované délky nemůže být operandem zřetězení, při zřetězení lze použít libovolný počet operandů a operátory lze vnořovat do libovolné hloubky, operátor zřetězení se může vyskytovat i na levé straně příklad: výstupy úplné binární sčítačky { cout, sum } = { (a & b) (a & cin) ( b & cin), a ^ b ^ cin } ; Příklady: { A, B [2: 0 ], C[5:7] } // jako { A, B[2], B[1], B[0], C[5], C[6], C[7] } { 3 { W -, 3 b1x0 - // jako, W, W, W, 1 b1, 1 bx, 1 b0 - D =, 2, 4b 1010-- // D = 1010_1010 reg signed [ 3 : 0 ] A ; reg signed [ 7 : 0 ] B; B = { 4 { A [ 3 ] }, A } ; // expanze čtyřbitového čísla (typu signed) // do osmibitové proměnné jinak: B = A ; // expanze proběhne automaticky na základé // typu výrazu na pravé straně 10.1.2012 MI-SIM Jiří Douša 14
Aritmetické operátory binární: +, -, *, /, % ( zachovává znaménko dělence ), V01: ** unární: - definovány pro logické typy (skalární i vektory) i numerické typy, operandy nemusí mít stejnou délku a mohou být různých typů, interpretace: logický typ reg nebo sítˇ jsou interpretovány jako čísla bez znaménka,) VERILOG 2001 interpretuje typy reg nebo sítˇ jako čísla se znaménkem pokud jsou deklarovány jako signed a poskytuje příslušné aritmetické operátory pro libovolné délky operandů, numerický typ integer je interpretován jako číslo se znaménkem (v doplňkovém kódu), pokud hodnota některého bitu některého operandu je x, pak výsledkem je neznámá hodnota, pokud všechny operandy nějakého výrazu jsou interpretovány jako čísla se znaménkem pak jsou použity operátory pro čísla se znaménkem, jinak operátory pro čísla bez znaménka, pokud některý operand je typu real je výsledek typu real, konversní funkce pro změnu interpretace ( VERILOG 2001): $signed vrací interpretaci číslo se znaménkem $unsigned vrací číslo bez znaménka 10.1.2012 MI-SIM Jiří Douša 15
Aritmetické operátory Příklady: integer a, b ; // signed reg [ 63 : 0 ] c ; // unsigned a = 12; b = -4; c = 8; a = a / b ; // výsledek -3 ( operátor pro signed ) b = c / b ; // výsledek = 0 ( operátor pro unsigned ) integer b ; reg signed [ 63 : 0 ] c ; // V01: signed b = -4; c = 8; b = c / b ; // výsledek = -2 ( operátor pro signed ) integer a, b ; reg [ 63 : 0 ] c ; // V01: unsigned a = 12; b = -4; c = 8; a = a / 4 ; // výsledek 3 b = $signed (c) / b ; // výsledek = -2 reg signed [ 31 : 0 ] c, d, e ; // V01: signed c = 12; d = 12; e = 12; c = c / -3 ; // signreg / signint: výsledek -4 d = d / -32 d2; // signreg / unsignint : výsledek 0 e = e / -32 sd2; // signreg / signint. výsledek = -6 10.1.2012 MI-SIM Jiří Douša 16
Přiřazovací příkazy hodnota výsledku: ovlivněna délkou operandů i délkou proměnné na levé straně příkazu, vyhodnocování výrazu pravé strany: mezivýsledky se ukládají na délku určenou nejdelším operandem, uložení výsledné hodnoty výrazu: na délku určenou proměnnou na levé straně příkazu, Příklady: reg [7:0] a = 8 b1111_1111; reg [7:0] b = 8 b0000_0001; reg [7:0] c ; r eg [8:0] c1 ; // následují jednotlivé možnosti: c = a + b; // c = 0000_0000, ztráta přesnosti c1 = a + b; // c1 = 1_0000_0000 c = ( a + b) >>1; // c = 0000_0000, pouze posun mezivýsledku c1 = a + b; // c1 = 1_0000_0000 c = c1 >> 1; // c = 1000_0000 c = ( 0 + a + b ) >> 1; // c = 1000_0000, // délka operandu 0 = 32 bitů 10.1.2012 MI-SIM Jiří Douša 17
Paralelní příkazy Continuous assingment statements: jde o funkční modely kombinačních obvodů: tyto se vyhodnotí po každé změně hodnot proměnných nebo sítí na pravé straně, na levé straně příkazu musí být identifikátor sítě, výraz pravé strany může obsahovat funkce, arit. i logické operace, příkazy deklarace sítí a příkazy assign lze kombinovat syntax: assign [ < síla>] [ <zpoždění>] < identifikátor sítě > = < výraz >,..; Poznámka: assign..příkaz budíče dané síly + daného zpoždění Příklady: wire a, b, c, sum, cout; // deklarace sítí assign sum = a ^ b ^ c ; // výstup sčítačky (síla strong, nulové // zpoždění) assign cout = ( a & b ) ( a & c ) ( b & c ) ; // přenos totéž: assign sum = a ^ b ^ c, cout = ( a & b ) ( a & c ) ( b & c ) ; wire sum = a ^ b ^ c ; // deklarace sítě + implicitní přiřazení // (nulové zpoždění sítě a log. členu) wire #5 sum = a ^ b ^ c ; // zpoždění 5 wire [ 3 : 0 ] a, b ; // deklarace dvou čtyř-bitových sítí wire [ 3 : 0 ] #4 AXorB ; // zpoždění sitě AXorB, bude // přiřazeno každému budiči této sítě assign #2 AXorB = a ^ b ; // následuje jediný podmíněný paralelní příkaz: assign b = ( sel )? a : b; // b= if (sel) then a else b ; 10.1.2012 MI-SIM Jiří Douša 18
Paralelní příkazy Příklad: čtyř bitový komparátor kompletní modul module Komp ( input [ 3 : 0 ] a, b, output agb, aeb, alb ) ; // následují paralelní příkazy: nezáleží na pořadí assign agb = ( a > b ), // buzení tří různých portů ( typ wire ) aeb = ( a == b ), alb = ( a < b ) ; endmodule Příklad: čtyř bitový komparátor do kaskády module Komp ( input [ 3 : 0 ] a, b, input g, e, l, output agb, aeb, alb ) ; assign agb = ( a == b )? g : ( a > b ), aeb = ( a == b )? e : 1 b0, alb = ( a == b )? l : ( a < b ) ; endmodule Poznámka: podmíněné výrazy lze vnořovat Příklad: dekodér binárního kódu do kódu 1 ze 4 assign { y3, y2, y1, y0 } = ( { a, b } == 2 b00 )? 4 b0001 : ( { a, b } == 2 b01 )? 4 b0010 : ( { a, b } == 2 b10 )? 4 b0100 : ( { a, b } == 2 b11 )? 4 b1000 : 4 b0000 ; 10.1.2012 MI-SIM Jiří Douša 19
Resoluční funkce sítí Příklad: reg a, b; wire y1; wand y2; wor y3; assign y1 = a, y1 = b ; // implicitní síla = St (strong) assign y2 = a, y2 = b ; assign y3 = a, y3 = b ; resoluční funkce wire a 0 1 x z 0 1 b b x z HiZ y1 rezoluční funkce wand: 0 0 1 x z a 1 x y2 z b HiZ rezoluční funkce wor: 0 0 1 x z a 1 x y3 z HiZ 10.1.2012 MI-SIM Jiří Douša 20