Áramkörtervezés az absztrakciótól a realizációig BMEVIEEM284 Budapesti Műszaki és Gazdaságtudományi Egyetem A Verilog HDL II. Nagy Gergely Elektronikus Eszközök Tanszéke (BME) 2013. szeptember 26. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 1 / 30
Szimuláció Szimuláció Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 2 / 30
Szimuláció Szimuláció Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 3 / 30
Szimuláció Szimuláció Szimuláció I. Projektjeink ellenőrzése egy nagyon fontos lépése a tervezésnek. Egy grafikus szimulátorban a rendszerünk jeleinek hullámformáját nézhetjük meg és láthatjuk a buszok értékét számként is. Egy szimulátor képes megmutatni a rendszer felépítést: a modulok hierchia-fáját bejárhatjuk és a,,belenézhetünk az egyes példányokba. Láthatjuk az aktuálisan kiválasztott modul vezetékeit, regisztereit. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 4 / 30
Szimuláció Szimuláció Szimuláció II. Bármely modul bármely vezetékét, regisztereit megjeleníttethetjük. A több-bites vezetékek/regiszterek esetén megválaszthjatjuk, hogy milyen számrendszerben jelenjen meg azok értéke. Egy kurzorral tetszőleges pillanatban lekérdezhetjük az összes megjelenített jel aktuális értékét. Némely szimulátornál, meg kell adni egy parancsban azt, hogy mely jeleket rögzítse a futás során. Ez a $dumpvars paranccsal történik, amely legegyszerűbb formájában egyedül áll, paraméterek nélkül. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 5 / 30
Szimuláció III. Szimuláció Szimuláció A kíırás valamilyen bináris vagy szöveges fájlba történik. Egy nagyon elterjedt, szöveges formátum a VCD: a Value Change Dump név rövidítése, a Verilog 1995-ös szabványában definiálták, lényegében minden Verilog szimulátor ismeri. Használatos még a bináris LXT formátum: az interlaced extensible Trace név rövidítése, a GTKWave programhoz fejlesztették ki és támogatja például az Icarus Verilog és VeriWell, mivel nem annyira elterjedt, csak akkor érdemes használni, ha az eredményeket biztosan csak ezt értő megjelenítővel fogjuk vizsgálni, előnye, hogy gyorsabban dolgoznak vele a programok. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 6 / 30
Szimuláció IV. Szimuláció Szimuláció Egy szimuláció az ingyenes GTKWave programmal. Figyeljük meg a különböző állapotok, értékek jelölését, azt, hogy a három nyolc-bites regiszter értéke háromféle számrendszerben van megjelenítve. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 7 / 30
Technikai részletek, tervezési ökölszabályok Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 8 / 30
Makrók alkalmazása Makrók alkalmazása I. Van lehetőség a C nyelvű megoldáshoz nagyon hasonló módon makrókat definiálni. Ezek segítségével könnyen tudunk olyan globális konstansokat létrehozni, amelyeket a projekt több helyén is felhasználhatunk. A makrót definiáló kulcsszó: define `define SIZE 8 reg [ SIZE -1:0] ax; Nagyon fontos, hogy a makró összes hivatkozása elé is le kell írni a karaktert, ami nem egyezik meg az egyszerű aposztróffal! Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 9 / 30
Makrók alkalmazása II. Makrók alkalmazása A makrókat összefoghatjuk beszerkeszthető állományokban. A beszerkesztés az include kulcsszóval történik. `include " global_constants. vh" Egy beszerkeszthető fájlt a C-ből ismert módszerrel kell megvédeni a többszörös definiálástól. A global_constants.vh szerkezete: `ifndef `define... `endif GLOBAL_CONSTANTS GLOBAL_CONSTANTS Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 10 / 30
Makrók alkalmazása III. Makrók alkalmazása Felhasználhatjuk a makrókat a moduljaink paramétereinek való kezdeti értékadásra is:... parameter size = SIZE ;... Így, ha az összes modulunkban a size paramétert ugyanarra az értékre szeretnénk inicializálni, azt így érdemes megtenni, mert ez a megoldás könnyű módosíthatóságot tesz lehetővé. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 11 / 30
Blokkoló és nem-blokkoló értékadás Blokkoló és nem-blokkoló értékadás I. Az always és initial blokkokban kétféle értékadás létezik: 1 Blokkoló értékadás: több értékadás esetén az n. sor kiértékelés csak akkor kezdődik meg, ha az (n 1). sor már végrehajtódott. Operátora: =. 2 Nem-blokkoló értékadás: több értékadás esetén az összes egy időben hajtódik végre. Operátora: <=. always @( posedge clk ) begin a = b; c = a + b; // c = b + b end (a) always @( posedge clk ) begin a <= b; c <= a + b; // c = kor á bbi a + b end (b) Az (a) kódban a c-nek történő értékadás csak akkor hajtódik végre, amikor a már megkapta az új értékét, a (b) kódban ezzel szemben a két értékadás egyszerre történik, így a-nak még az előző értékével dolgozunk. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 12 / 30
Blokkoló és nem-blokkoló értékadás II. Blokkoló és nem-blokkoló értékadás A késleltetések és a különböző értékadási módok: Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 13 / 30
Blokkoló és nem-blokkoló értékadás Blokkoló és nem-blokkoló értékadás III. Blokkoló és nem-blokkoló értékadások késleltetés nélkül: always @( posedge clk ) begin y1 = in; y2 = y1; end (a) always @( posedge clk ) begin y1 <= in; y2 <= y1; end (b) Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 14 / 30
Blokkoló és nem-blokkoló értékadás Blokkoló és nem-blokkoló értékadás IV. Blokkoló és nem-blokkoló értékadások késleltetett órajelekkel: always @( posedge clk ) begin #5 y1 = in; #5 y2 = y1; end (a) always @( posedge clk ) begin #5 y1 <= in; #5 y2 <= y1; end (b) Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 15 / 30
Blokkoló és nem-blokkoló értékadás Blokkoló és nem-blokkoló értékadás V. Még nagyobb problémát jelent az, ha egy modulon belül több always blokk is szerepel, ugyanis ezek végrehajtási sorrendje nem rögzített: always @( posedge clk ) begin #5 y1 = in; end always @( posedge clk ) begin #5 y2 = y1; end Itt, a kialakuló versenyhelyzet miatt y 2 értéke már az első változást követő felfutó élnél bizonytalan. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 16 / 30
Blokkoló és nem-blokkoló értékadás Blokkoló és nem-blokkoló értékadás VI. Nem soroljuk fel az összes lehetséges buktatót, helyettük álljon itt néhány ökölszabály, amelyekkel biztonságosan lehet fejleszteni. Kombinációs logikákhoz: ha nincs késleltetés: blokkoló értékadás, tehetetlenségi késleltetés esetén: blokkoló értékadás (#5 a = b;) átviteli késleltetés esetén: nem-blokkoló értékadás ( a <= #5 b;). Sorrendi logikákhoz: ha nincs késleltetés: nem-blokkoló értékadás, késleltetések esetén: nem-blokkoló értékadás (a <= #5 b;) az átviteli késleltetést alkalmazzuk. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 17 / 30
Blokkoló és nem-blokkoló értékadás Blokkoló és nem-blokkoló értékadás VII. Ajánlott kódolási stílus sorrendi logikáknál: always @( posedge clk ) begin y1 <= #5 in1 ; end always @( posedge clk ) y2 <= #5 y1; end Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 18 / 30
Adatbuszok alkalmazása Adatbuszok alkalmazása I. Ha egy adatbuszra több áramköri elem is csatlakozik, akkor 1 megfelelő vezérléssel el kell érni, hogy mindig csak egy elem adhasson érvényes jelet rá, 2 meg kell oldani, hogy az egyes elemek magas impedanciás állapotba kerüljenek, amikor passzívak 3 azoknál az elemeknél, amelyek írják és olvassák is a buszt, meg kell oldani a kétirányú kapcsolat helyes működését. Az 1. pont szervezési kérdés, a 2-hoz szükség van arra, hogy a megfelelő meghajtó pufferek értéke z legyen, amikor nem írják a buszt. A 3. pont teljesítéséhez ún. inout-okra, vagyis olyan portokra van szükség, amelyek ki-, és bemenetként is funkcionálnak. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 19 / 30
Adatbuszok alkalmazása Adatbuszok alkalmazása II. Az nagy impedanciás érték mind vezetékeknek, mind regisztereknek értékül adható. Nem hasonĺıthatunk z értékhez, hiszen ezt legfeljebb analóg áramkörrel lehetne eldönteni! if ( data_bus == 8 bzzzzzzzz )... // HIBA!!!! Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 20 / 30
Adatbuszok alkalmazása Adatbuszok alkalmazása III. Az inout olyan port, amely kimenetként és bemenetként is képes működni. Csak vezeték jellegű lehet, nem készíthetünk belőle regisztert. Az olvasást érdemes procedurális blokkban, olvasási állapot során egy egyszerű értékadással megoldani. Az írás: érdemes egy belső regisztert rendelni a kimeneti adatokhoz, feltételes értékadással hozhatunk létre háromállapotú puffer: reg [7:0] data_out ; assign data_bus = ( write_en )? data_out : 8 bzzzzzzzz ; Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 21 / 30
Adatbuszok alkalmazása Adatbuszok alkalmazása IV. Az alábbiakban látható egy egyszerű memória, amelyben az adatbuszról olvassuk be egy memóriacella új értékét, és oda írjuk a memóriából kiolvasott értéket is. // write_nread : read (0) -- memory is read // write (1) -- memory is written module memory ( input clk, input chip_enable, input write_nread, input [ SIZE -1:0] address, inout[ SIZE -1:0] data ); reg [ SIZE -1:0] data_out ; reg [ SIZE -1:0] memory [0: MEM_SIZE -1]; assign data = ( write_nread == 1 b0 && chip_enable == 1 b1)? data_out : {( SIZE ){1 bz }}; always @( posedge clk ) begin end if ( chip_enable == 1 b1) begin if ( write_nread == 1 b0) data_out <= #1 memory [ address ]; else memory [ address ] <= #1 data ; end endmodule Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 22 / 30
Adatbuszok alkalmazása V. Adatbuszok alkalmazása A memória felépítése nagyon egyszerű, ám a vele való kommunikáció már körülményesebb. Legalább két órajel beírni egy adatot: 1 kitesszük a címbuszra a címet, az adatbuszra a beírandó bájtot, beálĺıtjuk az írást és engedélyezzük a memória példányt (chip_enable), 2 töröljük a chip engedélyezést. Az olvasás még bonyolultabb: 1 kitesszük a címbuszra a címet, az adatbuszról leveszünk minden egyéb meghajtást, beálĺıtjuk az olvasást és engedélyezzük a chipet, 2 mindezeket a következő órajelnél olvassa be a memória, ha nálunk volt késleltetés tehát várunk, hogy elkezdődjön az olvasás (ideális esetben csak 1 órajel), 3 értékül adjuk egy saját regiszternek az adatbusz értékét, töröljük a memória engedélyezését. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 23 / 30
Adatbuszok alkalmazása Adatbuszok alkalmazása VI. Az alábbiakban látható egy írás és egy olvasás művelete. Figyeljük meg, hogy a busz a műveletek között nagy impedanciás állapotba kerül! Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 24 / 30
Adatbuszok alkalmazása Adatbuszok alkalmazása VII. Természetesen a bemutatott módszer csak ASIC tervezésben használható. FPGA-kban nem használhatjuk a nagy impedanciás állapotot. FPGA-kban ha egy bemenetre több áramkör kapcsolódik, akkor egy multiplexert kell kötni a bemenetre, a kapcsolódó áramkörök a multiplexerre kapcsolódnak, készíteni kell egy kiválasztójelet, ami vezérli a multiplexert. Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 25 / 30
Skálázható memória és inicializálása I. Skálázható memória és inicializálása A korábbi memória példát kicsit átalakítjuk, hogy a méreteket skálázhatóvá tegyük. Ehhez paramétereket használunk. A változó méret megjelenik az interfészen is, ezért a be- és kimeneteket csak a hagyományos módon tudjuk megadni. module memory ( clk, chip_enable, write_nread, address, data ); parameter SIZE = 8; parameter MEM_SIZE = 256; input clk ; input chip_enable ; input write_nread ; input [ SIZE -1:0] address ; inout[ SIZE -1:0] data ; reg [ SIZE -1:0] data_out ; reg [ SIZE -1:0] memory [0: MEM_SIZE -1];... Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 26 / 30
Skálázható memória és inicializálása Skálázható memória és inicializálása II. module memory ( clk, chip_enable, write_nread, address, data ); parameter SIZE = 8; parameter MEM_SIZE = 256; input clk ; input chip_enable ; input write_nread ; input [ SIZE -1:0] address ; inout[ SIZE -1:0] data ; reg [ SIZE -1:0] data_out ; reg [ SIZE -1:0] memory [0: MEM_SIZE -1]; assign data = ( write_nread == 1 b0 && chip_enable == 1 b1)? data_out : {( SIZE ){1 bz }}; always @( posedge clk ) begin end if ( chip_enable == 1 b1) begin if ( write_nread == 1 b0) data_out <= #1 memory [ address ]; else memory [ address ] <= #1 data ; end endmodule Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 27 / 30
Skálázható memória és inicializálása Skálázható memória és inicializálása III. A memória példányosítása a méretek megadásával: memory #(8, 256) m( clk, chip_enable, write_nread, address, data ); A memória inicializálása fájlból: initial $readmemh (" mem. mif ", m. memory, 0, 255); A mem.mif fájl tartalma (256 db. sorból áll): f0 1a 21 3a 42... Paraméteresen adott méretű konstans: {(SIZE){1 bz}} Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 28 / 30
Irodalom Irodalom Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 29 / 30
Irodalom Irodalom Sutherland HDL:Understanding Verilog Blocking and Non-blocking Assignments Clifford E. Cummings: Verilog Nonblocking Assignments With Delays, Myths & Mysteries Nagy Gergely (BME EET) A Verilog HDL II. 2013. szeptember 26. 30 / 30