Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Simulace číslicových obvodů (MI-SIM) imní semestr 2/2 Jiří Douša, katedra číslicového návrhu (K83), České vysoké učení technické v Prae, fakulta informačních technologií Přednáška : VERILOG modelování struktur Stručný obsah: vestavěné primitivní elementy, jejich poždění a síly, sitě a strategie sil, vytváření struktur a hierarchických seskupení, mapování portů.
Vestavěné primitivní moduly senam typů elementárních logických modulů: primitivní moduly s jedním výstupem: and (o, i,..i n ), nand (o, i,..i n ), or (o, i,..i n ) nor (o, i,..i n ), or (o, i,..i n ), nor (o, i,..i n ) primitivní moduly s více výstupy. not (o,..o n, i )..invertující budič signálů o,..o n buf (o,..o n, i ). neinvertující budič signálů o,..o n třístavové budiče: bufif (o, i, c) třístavový budič spínaný bufif (o, i, c) třístavový budič spínaný notif (o, i, c )...invertující bufif notif (o, i, c )...invertující bufif aktuální výstup: musí být síť, aktuální vstup: reg nebo síť. Synta příkau instalace primitivního modulu: < typ logického členu> [ < síla> ] [ < poždění> ] [ < identifikátor logického členu > ] ( < senam připojených sítí či proměnných reg>, ) 2..2 MI-SIM Jiří Douša 2
Zpoždění primitivních modulů Specifikace poždění: < poždění > ::= < žádné> #(d) #( d, d2) #( d, d2, d3) #(d min : d typ, : d ma ), (d2 min : d2 typ, : d2 ma ), (d3 min :d3 typ, : d3 ma ) # ( d) společné poždění pro všechny možné měny výstupu, # ( d, d2 ) d: poždění náběžné hrany : ->, ->, ->, d2: poždění ávěrné hrany: ->, ->, ->, min (d, d2 ): poždění pro měny: ->, -> ->, ->, ->, ->, # ( d, d2, d3 ) d.poždění náběžné hrany: ->, ->, ->, d2.poždění ávěrné hrany: ->, ->, ->, d3.poždění vysoké impedance: ->, ->, -> min (d, d2, d3 ): poždění ->, ->, ->, každá hodnota d, d2, d3 je určena trojicí (d min : d typ, : d ma ) pro minimální, resp. typické, resp. maimální poždění. Příklady: instalace primitivních modulů and ( weak, pull ) # 2 A ( y, a, b, c, d ); and # ( 2, 5 ) A2 ( y, a, b, c, d ); bufif # ( 2, 5, 4 ) B ( y, a, c ); bufif # ( 2, 3, 4 ), ( 3, 4, 5 ), ( 4, 5, 6 ) B ( y, a, c ); 2..2 MI-SIM Jiří Douša 3
Síly primitivních modulů Síly primitivních modulů a budičů propojovacích sítí: identifikátor síly úroveň síly supply, 7 nejsilnější strong, 6 pull, 5 large, 4 poue pro síť typu trireg weak, 3 medium, 2 poue pro síť typu trireg small, poue pro síť typu trireg high, nejslabší high, nejslabší small, poue pro síť typu trireg medium, 2 poue pro síť typu trireg weak, 3 large 4 poue pro síť typu trireg pull, 5 strong, 6 supply, 7 nejsilnější 2..2 MI-SIM Jiří Douša 4
Funkční modely primitivních modulů 2..2 MI-SIM Jiří Douša 5 Příklady: reg a, b; wire y, y2, y3, y4; // předpokládané deklarace and (weak, strong) A ( y, a, b); // instalace modulu A typu and síly modulu a připojené sitě: St, We, 63X, HiZ, pravdivostní tabulka výstupu y ( musí být některá síť): or ( weak, pull ) O ( y2, a, b); // instalace modulu O typu or síly modulu a připojené sitě : We, Pu, 53X b a y b a y2
Funkční modely primitivních modulů Příklady: reg a,b; wire y, y2,y3,y4; not (supply, supply) N ( y3, a ); // instalace modulu N typu not síly modulu a připojené sitě : Su // vi síla budiče buf B ( y4, a ); síly modulu a připojené sitě : St // implicitní hodnota síly a y3 y4 bufif B ( y5, a, c ) ; // instalace modulu B typu bufif síly: St, HiZ c L L a H H y5 Ponámka: L = nebo, H = nebo 6 2..2 MI-SIM Jiří Douša
Reoluční funkce sítí Příklad buení růných sítí několika budiči: wire c; wand d, e; // předpokládané deklarace sítí // následují 2 budiče sítě c (síly St) not N ( c, a ); not N2 ( c, b ); // následují 2 budiče sitě d (síly St) not N3 ( d, a ); not N4 ( d, b ); // následují 2 budiče sítě e: not (weak, strong) N5 ( e, a ); not (weak, strong) N6 ( e, b ); síť e má stejné hodnoty jako síť d síly sítě: We, St, 63X Ponámky: implicitní hodnota síly je strong, implicitní hodnota poždění = Pravděpodobnostní tabulka pro sítě c a d: a b c d 2..2 MI-SIM Jiří Douša 7
Sítě a strategie sil nepřipojená síť nemá sílu, síla připojené sítě je dána silou nejsilnějšího budiče, ) síť s jedním budičem: příka assign : implicitní síla strong nebo specifikace, mapování na výstupní porty primitivního modulu: síla vyplývá e specifikace příslušné instance, mapování na výstupní porty uživatelského modulu: síla dána silou portu buení portu proměnnou typu reg : implicitní síla strong, buení portu sítí: příkaem assign ( vi výše), primitivním modulem: (vi výše). 2) síť s více budiči: největší síla vítěí, v případě stejných sil se uplatní příslušná reoluční funkce. inicialiace sítě při deklaraci : musí být eplicitní specifikace síly, jde o trvale připojený budíč dané síly ( rodíl vůči VHDL) příklad: trvalý troj nuly síly weak wire ( strong, weak ) a = b; 2..2 MI-SIM Jiří Douša 8
Sítě a strategie sil Příklady: module M2 (output reg y, input wire ); always @ y = ~ ; module M3 (output y, input wire ); not (weak, weak) n7 (y,); module M4 (output y, input wire ); not (supply, pull) n7 (y,); module M5 (output y, input wire ); assign y = ; module ukaka reg clk = ; always # 5 clk = ~ clk; // síla ST wire (supply, weak) a9 = 'b; assign a9 = 'b; // hodnota 76X: if = then a9=su else a9=st wire ; // assign = supply; // nele 2..2 MI-SIM Jiří Douša 9
Sítě a strategie sil // pokračování modulu ukáka supply s; supply s; // hodnota Su resp. Su assign s = ; // be vlivu na hodnotu Su assign a72 = 'b; // hodnota HiZ assign a73 = 'b; // hodnota St assign a74 = 'b; // hodnota St assign a75 = 'b; // hodnota StX wire a3, a3, a32, a33, a34; not (weak, weak) n7 ( a3,clk); // a3 We nebo We not (pull, pull) n7 (a35,clk); // a35 Pu nebo Pu assign a3 = a3; // a3 St nebo St assign a35 = a35; // a35 St nebo St) M2 m2 (a3, clk); // a3 St nebo St (bueni reg) M3 m3 (a32, clk); // a32 We nebo We (vnitrni not Weak) M4 m4 (a33, clk); // a33 Pu nebo Su(vnitrni not) M5 m5 (a34, clk); // a34 St, vnitrni assign assign a33 = a33; // a33 St assign (pull, weak) a34 = a33; // a34 Pu nebo We 2..2 MI-SIM Jiří Douša
Sítě a strategie sil wire a4, a4, a42; wire a43 = 'b; // trvale St assign a4 = 'b; assign a4 = 'b; // trvale St resp. St assign a42 = a4; assign a42 = a4; // a42 trvale StX wire (weak,weak) a5 = 'b; assign a5 = 'b; // a5 trvale St wire (supply, weak) a5 = 'b; // trvale Su assign a5 = 'b; // a5 trvale Su wire a52, a53, a54, a55, a56; bufif (a52,a5,a3); bufif (a53,a5,clk); // a52 HiZ nebo St // a53 HiZ nebo St // poor: a75 nebyl dosud deklarován => hodnota StX bufif (a54,clk,a75 ); // StL= St nebo StZ pro clk= // StH= St nebo StZ pro clk= bufif (supply, weak) (a55,clk,a75 ); // WeL (pro clk=), SuH (pro clk=) 2..2 MI-SIM Jiří Douša
Instalace uživatelských modulů Synta instalace : < typ modulu > # ( senam aktuálních parametrů ) < identifikátor instance modulu > ( < senam připojených sítí> ) ; Příklad: předpoklad: eistuje modul ALU s následující hlavičkou: module ALU # ( parameter sire = 8 ) ( output y [ sire- : ], input [ sire- : ], a, b, input contrl );. ; wire [ 5: ],, y ; // sítě pro mapování výstupů a vstupu instance // typu typu ALU wire f; // síť pro mapování řídícího vstupu instance typu ALU // následuje jmenné mapování parametrů a poiční mapování portů // instance alu typu ALU # ( (.sire = (6 ) ) // varianta s jmenným mapování parametrů pro alu, // # ( 6 ) ) odpovídá poičnímu mapování parametrů pro alu, alu (,, y, f ); // varianta s poičním mapování portů pro alu. 2..2 MI-SIM Jiří Douša 2
Specifikace struktur Příklad: strukturní popis půlsčítačky module Half_adder ( sum, c_out, a, b ); // formální porty input a, b; // specifikace vstupních portů (typ wire) output sum, cout; // specifikace výstupních portů (typ wire) or X (sum, a, b); // poiční mapování portů and A (c_out, a, b ); // poiční mapování portů jiná přípustná verse deklarace modulu (poue pro V) module Half_adder ( output sum, c_out, input a, b ); // specif. portů or X (sum, a, b); // síla = strong, poždění = and A (c_out, a, b ); Příklad: strukturní popis úplné binární sčítačky module Full_adder ( output sum, c_out, input a, b, c_in ); wire c, c2, c3; // lokální vodiče Half_adder AD ( c, c2, a, b ); // instalace submodulu Half_adder AD2 ( sum, c3, c_in, c); // akt. & form. porty or ( c_out, c2, c3 ); 2..2 MI-SIM Jiří Douša 3
Formální a aktuální porty Omeení formálních portů modulu: formální vstupní porty: proměnné typu sítˇ formální výstupní porty: proměnné typu sítˇ nebo register nebo integer buení portů v paralelním prostředí: sítˇ, buení portů v sekvenčním prostředí: reg, integer formální vstupně-výstupní porty: typu sítˇ nele deklarovat žádný port typu real Omeení pro mapování formálních a aktuálních portů: aktuální výstupní port (příjímá výstupy modulu): proměnná typu sítˇ, aktuální vstupní port( přivádí aktuální vstupy modulu): proměnná typu sítˇ nebo reg nebo integer, aktuální vstupně-výstupní port: proměnná typu sítˇ, Aktuální port: net / reg /integer net net Formální port: net net / reg / integer net vnitřní module mapování v paralelním prostředí 2..2 MI-SIM Jiří Douša 4
Specifikace formálních portů Příklad: ukáka specifikace portů pro V95 module Adder (sum, c_out, a, b, c_in); // poue vyjmenování portů; output [3 : ] sum ; // specifikace směru output c_out; input [3 : ] a, b ; input c_in ; reg [3 : ] sum ; //typ reg (pro buení v sekvenčním prostředí) reg c_out; wire [3 : ] a, b ;// typ wire (pro buení v paralelním prostředí) wire c_in ; Příklad: ukáky možných specifikací portů pro V module Adder ( sum, c_out, a, b, c_in ); output reg [3 : ] sum ; // porty typu reg output reg c_out input wire [3 : ] a, b ; // porty typu wire input wire c_in ;.. jiná možnost pro V: module Adder ( output reg [3 : ] sum, output reg c_out, input wire [3 : ] a, b, input wire c_in ) ;..; 2..2 MI-SIM Jiří Douša 5
Způsoby mapování portů Ponámka: dílčí moduly mohou být specifikovány v samostatných souborech Vájemné propojení modulů: poiční aktuální porty jsou přiřaeny formálním portům dle jejich pořadí, jmenné eplicitně uvádí přiřaení na ákladě jejich jmen ( neáleží na jejich pořadí ) :. <formálni port> ( <aktuální port> ) Příklad: hierarchický strukturní model čtyřbitové sčítačky module Adder_4 ( output [ 3 : ] sum, output c_out, input [ 3 : ] a, b, input c_in ) ; wire c3, c2, c; // přenosy uvnitř sekcí Full_adder FA ( sum [], c, a [], b[], c_in ); Full_adder FA ( sum [], c2, a [], b[], c ); Full_adder FA2 ( sum [2], c3, a [2], b[2], c2 ); Full_adder FA3 ( sum [3], c_out, a [3], b[3], c3 ); 2..2 MI-SIM Jiří Douša 6
Ukáky strukturních modulů Příklad: strukturní model šestnáctibitové sčítačky module Adder_6 ( output [ 5: ] sum, output c_out, input [5 : ] a, b, input c_in ) ; wire c2, c8, c4; // přenosy mei sekcemi Adder_4 S ( sum [3 : ], c4, a [3 : ], b[3 : ], c_in ); Adder_4 S ( sum [7 : 4], c8, a [7 : 4], b[7 : 4], c4 ); Adder_4 S2 ( sum [ : 8], c2, a [ : 8], b[ : 8], c8 ); Adder_4 S3 ( sum [5 : 2], c_out, a [5 : 2], b[5 : 2], c2 ); Příklad: strukturní model čtyřbitové sčítačky // použito jmenné mapování module Adder_4 ( output [ 3 : ] sum, output c_out, input [3 : ] a, b, input c_in ) ; wire c3, c2, c; // přenosy uvnitř sekcí Full_adder FA (.sum ( sum [] ),.c_out (c),.a ( a [] ),.b ( b[] ),.c_in (c_in) ); Full_adder FA (.sum ( sum [] ),.c_out (c2),.a ( a [] ),.b ( b[] ),.c_in (c) ); Full_adder FA2 (.sum ( sum [2] ),.c_out (c3),.a ( a [2] ),.b ( b[2] ),.c_in (c2) ); Full_adder FA3 (.sum ( sum [3] ),.c_out (c_out),.a ( a [3] ),.b ( b[3] ),.c_in ( c3 ) ); 2..2 MI-SIM Jiří Douša 7
Vícenásobná instalace dílčích modulů možnosti: pole instancí, příka generate, Příklad: paralelní čtyřbitová sčítačka varianta : // použito pole jednobitových sčítaček module Adder_4 ( output [ 3 : ] sum, output c_out, input [3 : ] a, b, input c_in ) ; wire c3, c2, c; // přenosy uvnitř sekce Full_adder FA [ 3 : ] ( sum, { c_out, c3, c2, c }, a, b, { c3, c2, c, c_in } ) ; varianta 2: // použit příka generate module Adder_42 ( output [ 3 : ] sum, output c_out, input [3 : ] a, b, input c_in ) ; wire [ 4: ] c; // přenosy uvnitř sekce genvar i; // pro příka generate assign c[ ] = c_in, c_out = c [ 4 ]; // odstraní nepravidelnosti generate for ( i = ; i < 4 ; i = i + ) begin : FAA // povinný label Full_adder FA ( sum [ i ], c [ i + ], a [ i ], b [ i ], c [ i ] ) ; end endgenerate 2..2 MI-SIM Jiří Douša 8
Vícenásobná instalace dílčích modulů varianta 3: parametriovaná šíře, podmíněná i nepodmíněná instalace modulu uvnitř příkau generate module # ( sire = 4 ) // parametr V Adder_43 ( output [ sire - : ] sum, output c_out, input [ sire - : ] a, b, input c_in ) ; wire [ sire - : ] c; // přenosy uvnitř sekcí genvar i; // pro příka generate generate for ( i = ; i < sire ; i = i + ) begin : FAA // povinný label if ( i == ) Full_adder FA ( sum [ i ], c [ i + ], a [ i ], b [ i ], c_in ) ; else if ( i == sire - ) Full_adder FA ( sum [ i ], c_out, a [ i ], b [ i ], c [ i ] ); else Full_adder FA ( sum [ i ], c [ i + ], a [ i ], b [ i ], c [ i ] ); end endgenerate 2..2 MI-SIM Jiří Douša 9