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 12: VERILOG parametrizace modulů Stručný obsah: speciální parametry, testování časových relací, specifikace zpoždění uživatelských modulů, uživatelsky definované primitivní moduly, modely přenosových hradel.
Parametrizace modulů V95: module Adder ( sum, c_out, a, b, c_in ); // seznam portů; parameter sire = 32, zpozdeni = 5; // deklarace konstant output [sire - 1 : 0] sum ; // specifikace portů: output + wire output c_out ; input [sire - 1 : 0] a, b ; // input + wire input c_in ; V01: module Adder # ( parameter sire = 32, zpozdeni = 5) // parametry ( sum, c_out, a, b, c_in) ; // porty output reg [sire - 1 : 0] sum ; // output + reg output reg c_out ; input wire [sire - 1 : 0] a, b ; // input + wire input wire c_in ; Jinak ve V01: module Adder # ( parameter sire = 32, zpozdeni = 5 ) ( output reg [sire - 1 : 0] sum, output reg c_out, input wire [sire - 1 : 0] a, b,, input wire c_in ) ; 2
Parametrizace modulů Hodnoty parametrů specifikovaných slovem parameter lze měnit: při instalaci modulu Příklad: module MOD1 ( ) parameter sire = 8, zpozdeni = 2 ;. module Celek (..).; // následuje poziční mapování parametrů ve V01 MOD1# ( 16, 5 ) m1 ( < mapování portů > );.; // následuje jmenné mapování parametrů ve V01 MOD1# (.sire ( 16 ),.zpozdeni ( 5 ) ) m2 ( );..; 3
Parametrizace modulů s použitím hierarchické cesty pomocí defparam Příklad: module Celek1 ; Celek cel ( ); // instalace cel modulu Celek defparam Celek. m1. sire = 24; Celek. m1. zpozdeni = 3 ; V95: hodnoty aktuálních parametrů nemusí být téhož typu jako hodnoty přiřazené v deklaraci příslušným formálním parametrům, formální parametr dědí typ, dimenzi i znaménko od hodnoty aktuálního parametru ( možnost nežádoucích vlivů ), V01: znaménko, dimenze a typ (pokud jsou stanovené hodnotou v deklaraci ) nelze později měnit 4
Speciální parametry bloky specify : mechanismus pro deklaraci speciálních parametrů a přiřazování jejich hodnot, př.: specparam setuptime = 30, holdtime = 10; jejich hodnoty nelze přepsat vně modulu ( při instalaci modulu, či defparam ), nelze se na ně odvolávat vně bloku specify endspecify, jejich hodnoty lze definovat pomocí jiného parametru či lokálního parametru ( V01), specifikace cest mezi vstupy a výstupy modulu a jejich zpoždění, kontrola časových relací mezi vstupy modulu lokální parametry ( pouze V01): výskyt deklarace: za kličovým slovem localparam, použití: universální jako parameter, jejich hodnoty nelze přepsat vně modulu, jejich hodnoty lze definovat pomocí jiného parametru. 5
Zpoždění v modulu distribuované zpoždění (specifikováno pro sítě a primitivní moduly), zpoždění cesty v modulu ( celé cesty od vstupních portů k výstupním) specifikace: bloky specify.endspecify syntax pro spojení každého vstupu s každým výstupem: (<vstupní port> *> <výstupní port >) = < zpoždění >; syntax pro paralelní spojení vstupů s výstupy: (<vstupní port> => <výstupní port >) = < zpoždění >; oba typy zpoždění lze v modulu specifikovat: zpoždění cesty v modulu se uplatní pokud jeho hodnota je větší než součet distribuovaných zpoždění na dané cestě. Příklad: viz čtyřbitová sčítačka module Adder_44 ( output [ 3 : 0 ] sum, specify output c_out, input [ 3 : 0 ] a, b, input c_in ) ; ( a, b *> sum ) = 32; ( a, b, c_in *> c_out ) = 38; // zpoždění c_in na sum = 0, uplatni se distribuované ) endspecify wire c3, c2, c1; // přenosy uvnitř sekcí Full_adder FA0 ( sum [0], c1, a [0], b[0], c_in ); Full_adder FA1 ( sum [1], c2, a [1], b[1], c1 ); Full_adder FA2 ( sum [2], c3, a [2], b[2], c2 ); Full_adder FA3 ( sum [3], c_out, a [3], b[3], c3 ); 6
Testování časových relací testování předstihu: $setup ( < sledovaný signál >, < referenční událost >, < požadovaná hodnota předstihu > ) ; < sledovaný signál >, < referenční událost > ::= port typu input nebo inout < požadovaná hodnota předstihu >, < požadovaná hodnota přesahu > ::= konst. výraz nebo specparam testování přesahu: $hold ( < referenční událost >, < sledovaný signál >, < požadovaná hodnota přesahu > ) ; testování předstihu a přesahu: $setuphold ( <referenční událost >,< sledovaný signál >, testování šířky impulsu: < požadovaná hodnota předstihu >, < požadovaná hodnota přesahu > ) ; $width ( < hranově specifikovaná referenční událost >, < požadovaná minimální šíře > ); // měřeno mezi dvěma sousedními, ale rozdílnými hranami < hranově specifikovaná referenční událost > ::= negedge < referenční událost > nebo posedge < referenční událost > 7
Testování časových relací testování periody: $period ( < hranově specifikovaná referenční událost >, < požadovaná perioda > ) ; // měřeno mezi dvěma sousedními, ale stejnými hranami < požadovaná perioda ::= konstantní výraz nebo specparam testování ze zotavení asynchronních vstupů: $recovery (< hranově specifikovaná referenční událost >, < sledovaný signál >, < požadovaná hodnota minimálního intervalu > ) ; < požadovaná hodnota min. intervalu > ::= konstantní výraz nebo specparam testování skluzu: $skew ( < referenční událost >, < sledovaná událost >, < maximální přípustná hodnota intervalu mezi specifikovanými událostmi > ) ; < maximální přípustná hodnota intervalu mezi specifikovanými událostmi > ::= konstantní výraz nebo specparam 8
Testování časových relací Příklad: hranový klopný obvod + asynchronní reset, set module flip_flop ( output reg q, input data, clk, reset, set ) ; // následuje kontrola časových relací specify $setup ( data, posedge clk, 5 ); // předstih dat = 5 $hold ( posedge clk, data, 1 ); // přesah dat = 1 $width ( posedge clk, 4 ); // min. šíře hodinového pulzu = 4 $recovery ( negedge reset, posedge clk, 2 ); // zotaveni = 2, tj. přípustná min. hodnota času mezi deaktivací // signálu reset a referenční událostí ( náběž. hrana hodin ), endspecify // následuje popis chování FF always @ ( posedge clk ) begin if ( reset ) q <= 0; else q <= data; end // sekvenční příkaz Poznámka: porušení časových relací je hlášeno na obrazovce 9
Uživatelsky definované primitivní členy UDP ( user defined primitives ): vytváření efektivních funkčních modelů na základě pravdivostních tabulek, deklarace UDP: samostatně (nikoliv uvnitř modulu) instalace UDP: stejná jako u vestavěných členů; je možné definovat zpoždění pro náběžnou i závěrnou hranu, porty UDP mohou být pouze skaláry, je přípustný pouze jeden port módu output; v případě kombinačního obvodu to musí být proměnné typu sítˇ, v případě sekvenčního obvodu proměnná typu reg, je přípustný libovolný počet portů módu input, nelze použít žádný port módu inout, pro sekvenční obvody je možné definovat počáteční stav proměnné typu reg příkazem initial, pořadí sloupců v tabulce musí být stejné jako pořadí vstupních portů v seznamu portů, možné vstupy a výstupy: pouze hodnoty 0, 1 a x, případný výskyt hodnoty z je v průběhu simulace je interpretován jako hodnota x, syntax UDP: primitive ( < seznam portů> ) output.; input..; table < seznam vstupních a kombinací a hodnoty výstupu > endtable end primitive; 10
Uživatelsky definované primitivní členy Pravidla pro definici a interpretaci tabulek ( pokračování ): v případě výskytu nedefinované vstupní kombinace (v průběhu simulace) výstup UDP nabývá hodnoty x, pro jednu a tutéž vstupní kombinaci nelze definovat různé výstupní hodnoty, hodnota? je v tabulce interpretována jako don t care ( tj. 1, 0 nebo x), hodnota (žádná změna) representuje předešlou hodnotu výstupu sekvenčního obvodu, hodnota ( vw ) na některém vstupu representuje hranu: konkrétně změnu z hodnoty v na hodnotu w; v každém řádku tabulky lze specifikovat hranu pouze u jednoho signálu, vstupní hodnota * representuje všechny možné změny daného vstupu ( totéž co (??) ), vstupní hodnota r je synonymum pro (01), vstupní hodnota f je synonymum pro (10), vstupní hodnota p označuje některou z následujících změn: (01), (0x), (x1), ( náběžná hrana včetně x ), vstupní hodnota n označuje některou z následujících změn: (10), (1x), (x0), ( závěrná hrana včetně x ). v případě sekvenčního obvodu jsou sloupce reprezentující současný vnitřní stav ( předposlední sloupec ) a příští vnitřní stav ( poslední sloupec ) uvedeny znakem : ( vždy jde o obvod typu Moore ). 11
Uživatelsky definované primitivní členy Příklad: definice logické funkce pro výstupní přenos jednobitové úplné sčítačky počet kombinací bez x: 8 ( ale každý výskyt hodnoty x produkuje hodnotu x na výstupu ( zbytečně pesimistické ) úplná specifikace: 3 3 řádků ( včetně x ), je možné zjednodušení: primitive carryout (cout, a, b, cin) ; output cout; input a, b, cin ; table // a b cin cout 0 0? : 0 ; 0? 0 : 0 ;? 0 0 : 0 ;? 1 1 : 1 ; 1? 1 : 1 ; 1 1? : 1 ; endtable end primitive Poznámka: // specifikace výstupní proměnné typu síť a // specifikace vstupních proměnných typu síť // specifikace tabulky uvedená specifikace pokrývá 6*3-4 =14 různých vstupních kombinací ( každá ze vstupních kombinací 000 a111 byla zahrnuta třikrát), není pokryto 13 kombinací (obsahující hodnoty x01 nebo dvě či tři x ) => výstup automaticky nabývá hodnoty x.. 12
Uživatelsky definované primitivní členy Příklad: specifikace hladinového klopného obvodu primitive D_latch (q, clk, D) ; output q; reg q; // výstup: proměnná typu reg input clk, D ; initial q = 1 b0; // další přípustné hodnoty : 1 b1, 1 bx, 1, 0 table // clk D vnitřní stav výstup q 1 1 :? : 1 ; // zápis 1 1 0 :? : 0 ; // zápis 0 0? :? : - ; // pamětˇ endtable endprimitive Příklad: specifikace hranového klopného obvodu primitive D_flip_flop (q, clk, D) ; output q; reg q; // výstup = proměnná typu reg input clk, D ; table // clk D stav q (01) 0 :? : 0 ; // zápis 0 (01) 1 :? : 1 ; // zápis 1 (0?) 1 : 1 : 1 ; // zápis 1 nebo paměť (0?) 0 : 0 : 0 ; // zápis 0 nebo paměť (?0)? :? : - ; // závěrná hrana?? :? : - ; // necitlivost při hladině clk endtable endprimitive 13
Simulace přenosových hradel Seznam vestavěných modelů transistorů: Standardní jednosměrné spinače: nmos # (<zpoždění>)( o, i, c); // if (c) o = i ; else o = z; pmos # (<zpoždění>)( o, i, c); // if (! c) o = i ; else o = z; cmos # (<zpoždění>)( o, i, c1, c2); // pmos a nmos paralelně // if (c1==1 c2==0) o = i ; else o = z; Standardní obousměrné spinače: tranif1 # (<zpoždění>) ( i1, i2, c); // if ( c ) i1 = i2 nebo i2 = i1 (dle budící strany) else i1 = z nebo // i2 = z (nebudící strana odpojena); budí-li obě strany pak // výsledek rezoluční funkce tranif0 # (<zpoždění>) ( i1, i2, c); // chování jako tranif1, ale spinač sepnut if (!c ) Odporové jednosměrné a obousměrné spinače: chování: viz předešlé verse, ale redukce síly: viz později rnmos # (<zpoždění>) ( o, i, c); rpmos # (<zpoždění>) ( o, i, c); rcmos # (<zpoždění>) ( o, i, c1, c2); rtranif1 # (<zpoždění>) ( i1, i2, c); rtranif0 # (<zpoždění>) ( i1, i2, c); 14
Model logického členu NAND2 Vnitřní schéma: Vdd a h1 h2 y h3 w1 b h4 Gnd module nand2 ( input a, b, output y ) supply0 Gnd; // tvrdá zem supply1 Vdd; // tvrdá jednička wire w1; pmos # (4) h1( y, Vdd, a ); pmos # (4) h2( y, Vdd, b ); nmos # (3) h3( y, w1, a ); nmos # (3) h4( w1, Gnd, b ); 15
Vnitřní schéma: Model buňky dynamické paměti r_w par_kap vstvyst module dynam_pamet ( inout vstvyst, input r_w ); trireg # ( 0, 0, 40 ) par_kap; // obě nabíjecí zpoždění = 0, // doba vybití = 40 tranif1 # ( 5 ) tr1 ( vstvyst, par_kap, r_w ); // zapojení // následuje test dynamické paměti module test_pameti; reg r_w, con; wire vstvyst,data; dynam_pamet dp ( vstvyst, r_w ); // instalace dyn. buňky initial begin r_w = 1; con = 1; // připojení 1 na vstvyst + začátek zápisu #10; r_w = 0; con = 0; // odpojení 1 + konec zápisu #10; r_w = 1; // začátek čtení #50; end assign data = 1'b1; assign vstvyst = (con === 1'b1)? data :1'bz; 16
Vnitřní schéma: Model buňky statické paměti rd wr d t1 w n1 qq t2 q n2 module stat_pamet ( output q, input d, rd, wr ); wire # ( 3 ) w, qq ; // zpoždění = 3 nmos t1( w, d, wr ); nmos t2 ( q, qq, rd ); not ( pull0, pull1 ) n2 ( w, qq ); // při spojení t1 konflikt sítí not n1( qq, w ); // nasleduje test paměti module test_pameti reg rd, wr, d; wire qout; stat_pamet sp ( qout, d, rd, wr ); // instalace stat. buňky initial begin d = 1; wr = 1; // zápis 1 #10; wr = 0; rd = 1; // konec zápisu, začátek čtení #40; rd = 0; d = 0; wr = 1; // konec čtení + zápis 0 #10 rd = 1; end // začátek čtení 17
Síly přenosových hradel Strategie používání sil: pokud je síť buzena několika budiči, pak získává hodnotu s nějvětší silou; v případě vyrovnaných sil se uplatní rezoluční funkce, Síly přenosových hradel: hradla MOS nemají vlastní sílu, pokud vstupem elementu typu přenosové hradlo je nějaká síť, pak její síla se po případné redukci přenáší na výstup daného přenosového hradla, pravidla redukce: budíče typu nmos, pmos, cmos, tranif1, tranif0: pokud síla vstupní sítě není supply, tak se přenáší beze změny na výstup hradla, v opačném případě je redukována o jeden stupeň dolů, příklad: wire ( pull0, supply1 ) a = 1; nmos t1 ( y, a, 1 ); // síla 1 na y: strong1 budíče rnmos, rpmos, rcmos, rtran, rtranif1, rtranif0: síla supply je redukována o dva stupně dolů, ostatní síly jsou redukovány o jeden stupeň dolů ( kromě high ), kapacitní síly se redukují o 1 stupeň ( kromě small ), 18