430 likes | 538 Views
H DL mindset & R TL coding style. L á szl ó Lajk ó. Bemutatkozás. Lajkó László laszlo.lajko @ericsson.com. Tartalom. HDL és imperatív nyelvek közötti különbségek C <-> VHDL, verilog Digitális rendszerek felépítése Tipikus HDL hibák Digitális HW építőelemei RTL kódolási stílus.
E N D
HDL mindset &RTL coding style László Lajkó
Bemutatkozás • Lajkó László • laszlo.lajko@ericsson.com
Tartalom • HDL és imperatív nyelvek közötti különbségek • C <-> VHDL, verilog • Digitális rendszerek felépítése • Tipikus HDL hibák • Digitális HW építőelemei • RTL kódolási stílus
HDL nylevek es imperatív nyelvek közötti fő különbség • C-ben az utasitasokat a processzor hajtja vegre • Végrehatás sorról sorra • Verilog-ban digitalis HW-t irunk le • Párhuzamos működés • NEM SW • Időben párhuzamos, konkurrens működést írunk le
HDL nylevek es imperatív nyelvek közötti fő különbség • HDL-ben moduláris-hierarchikus felépítés • Entity ~ class (csak analógia nincs egymáshoz közük) • Input/Output definíciók • Egy entitás tetszőleges számban példányosítható • Nem szubrutin • Mindegyik példány önálló HW saját erőforrásokkal • Cél a feladat partícionálása • Az egyes példányok az interfészen keresztül kommunikálnak • Minden példány párhuzamosan működik
HDL nylevek es imperatív nyelvek közötti fő különbség • HDL-ben különbséget kell tenni szintetizálható és nem szintetizálható nyelvi elemek között • Kevés nyelvi elem szintetizálható • A HDL nyelvek jelentős része csak a HW funkciók modellezésére illetve szimulációra használható • Mindig HW-ben kell gondolkozni • Minden esetben tudnunk kell előre, hogy mi szintetizálódik a leírásunkból
Digitális HW általános felépítése • A digtális hálózatunk alapvetően két részből áll • Kombinációs hálózat • Regiszter
Digitális HW általános felépítése • Szinkron rendszer • Egy közös órajel az egész rendszerben • Csak az órajel élére tötrénik változás • Lassabb működés esetén Clock Enable • Az órajel kapuzása tilos
Digitális HW általános felépítése • Tárolóelemek: szintérzékeny latch • TCQ min / TCQ max a latch nyitásakor a kimenet beállási ideje • TDQ min / TDQ max a nyitott latch terjedési ideje • Tsetup / Thold a latch helyes működéséhez szükséges előkészítési és tartási időablak a zárás körül
Digitális HW általános felépítése • Tárolóelemek: élérzékeny D flip flop • TCQ min / TCQ max a kimenet beállási ideje az órajel felfutó élét követően • Tsetup / Thold a helyes működéséhez szükséges előkészítési és tartási időablak az órajel aktív éle körül
Digitális HW általános felépítése • Élvezérelt szinkron rendszer esetén az időzítést meghatározzák: • tárolóelemek paraméterei • huzalozás • logikai kapuk terjedési ideje • Gyors jelutak esetén technológiai korlát • TCQ min + T prop min > Thold • Lassú jelutak miatt működési sebesség korlát • Tclock > TCQ max + T prop max + Tsetup
Digitális HW általános felépítése • Az órajelnek is van terjedési ideje a rendszerben • Az órajel élének helyfüggő csúszása a skew • FPGA-ban globális/lokális órajel hálozat használata minimalizálja a skew-t • Az órajel élének időfüggő időbeli ingadozása a jitter • Jó minőségű kvarc oszcillátor használata • Zajmentes tápegység és föld hálózat • A skew és a jitter csökkenti a rendszer maximálisan elérhető sebességét: • Tclock > TCQ max + T prop max + Tsetup + Tskew + Tjitter
Processzben órajelkét használni egy logikai jelet Miért rossz ez? Példa? Hogyan detektáljuk egy jel felfutó élét? Hogyan detektáljuk egy jel lefutó élét? Hogyan detektáljuk egy jel élét? wrong_proc: process (signal, rst) begin if (rst = '0') then a <= (others=>'0'); elsif rising_edge(signal) then a <= c or b; end if; end process: wrong_proc; Tipikus HDL hibák
Órajel kapuzása Miért rossz ez? Példa? wrong_proc: process (signal, clk) begin out <= signal or clk end process: wrong_proc; Tipikus HDL hibák
Nem teljes if szerkezet kombinációs processzben Miért rossz ez? Példa? Hogyan védjük ki a gyakorlatban? wrong_proc: process (sig1, sig2) begin if(sig1 = ‘1’) out <= sig1 and sig2; end if; end process: wrong_proc; Tipikus HDL hibák
Nem teljes case szerkezet kombinációs processzben Miért rossz ez? Példa? Hogyan lehet kijavítani? wrong_proc: process (sig) case sig is when“00” => out <= “11”; when“01” => out <= “11”; end case; end process: wrong_proc; Tipikus HDL hibák
Case szerkezetben nem kap értéket a signal minden esetben Miért rossz ez? Példa? Hogyan lehet kijavítani? wrong_proc: process (sig) case sig is when“00” => out1 <= “11”; when“01” => out2 <= “11”; when others => out1 <= “00”; end case; end process: wrong_proc; Tipikus HDL hibák
Túl mély if szerkezet Miért rossz ez? Példa? Hogyan lehet kijavítani? wrong_proc: process (sig1, sig2, sig3…) if(sig1=‘1’) then if(sig2=‘0’) then if… … end if; end if; end process: wrong_proc; Tipikus HDL hibák
Wait és after használata szintetizálható kódban Miért rossz ez? wait for5 ns; a <= b after10 ns; Tipikus HDL hibák
Inicializálás használata Nem nagy hiba Használjunk inkább resetet az adott signal-ra signal a : std_logic := ‘0’; Tipikus HDL hibák
Tipikus HDL hibák • Túl nagy bit szélességű számok összeadása • Befolyásolja a maximális elérhető órajelet • Timing violation-hoz vezethet adott órajel esetén • Timing violation figyelmen kívül hagyása esetén random rossz működést eredményez
Tipikus HDL hibák • Headroom hiánya fix pontos számok összeadása esetén • B > Log2 n számú (B egész szám) extra bit szükséges • Ha nincs elég headroom akkor túlcsordulás következhet be bizonyos bemeneti adatokra
Tipikus HDL hibák • Külünböző órajel tartományok közötti jelátvitel • Nagyon veszélyes hibákat okoz • Lehetőleg kerüljük • Lehet-e más megoldást alkalmazni pl clock enable • Ha nem elkerülhető akkor a legnagyobb körültekintéssel végezzük el • Következő előadáson lesz róla szó
Clock Domain Crossing • CDC: órajel tartományok közötti „átlépés” • GALS rendszerek:Globally Asynchronous Locally Sychronous Systems • A különböző órajel tartományokon belül szinkron tervezési módszerek • Szimulációval ellenőrizhető • Probléma: a külvilág nem része a szinkron rendszernek • Bemenetekre setup time specifikáció • Kimenetekre terjedési idő specifikáció • Az órajeltartományok lehetnek: • Teljesen független aszinkron tartományok • Egymással racionális tört arányban álló tartományok
Clock Domain Crossing • Ha nem tartjuk be a setup és hold követelményeket a FF-re • A Flip-Flop nem tartja be az adatlapjában megadott időzítési feltételeket • Lassabb reakcióidő • Kimenet értéke véletlenszerű • Metastabil állapot • A metastabil állapot elvileg nem kizárható, de előfordulási valószínűsége csökkenthető • Megoldás szinkronizáló FF-ek alkalmazása • Nagy frekvenciákon 3x 4x szinkronizáló FF
Clock Domain Crossing • Jel átadása az órajel tartományok között: • Statikus jel átadása • Dinamikus jel átadása (pulzus) • Lassabb tartományból a gyorsabba • Gyorsabb tarományból a lassabba • lehetséges? • Mi történik ha nem törődünk a CDC-vel? • Metastabil állapot – rossz logikai működés • Pulzusok veszhetnek el • Elveszítjük a jelek közötti korrelációt
Clock Domain Crossing • Statikus jel átadása : • Legegyszerűbb eset • DE a késleltetés nem determinisztikus • Szinkronizáló FF-ek, az FF-ek között nem lehet logika
Clock Domain Crossing • Dinamikus jel átadása : • Ha csak szinkronizáló FF-et használunk a dinamikus jel elveszhet • Pulse to toggle – Toggle to pulse megoldás • Kétirányú nyugtázásos kapcsolat • Több adat átadása • Az adatokat a forras oldalon adat érvényes jellel látjuk el • A vevő oldalon átvesszük az adatokat • Nyugtázzuk a kommunikációt • Lehetőleg használjunk FIFO-t vagy block RAM-ot órajel tartományok közötti váltásra • Ha van az FPGA tool-ban felhasználható FIFO primitív használjuk azt
Tipikus HDL hibák • Túl hosszú kombinációs hálózat • Például több aszinkron process használja egymás kimenetét kaszkádban • Befolyásolja a maximális elérhető órajelet • Timing violation-hoz vezethet adott órajel esetén • Timing violation figyelmen kívül hagyása esetén random rossz működést eredményez
Tipikus HDL hibák • Az if utasítás hierarchikus, a case nem • If-else-if utasításban a legelőször vizsgált feltétel az erősebb • Case esetén minden feltétel egyenrangú
Tipikus HDL hibák • Reset aszinkron meghúzás szinkron elengedés szükséges • Ellenkező esetben setup violation lehetséges
Tipikus HDL hibák • FPGA-ban hibás DCM kaszkádosítás • Az első DCM locked jelét be kell építeni a második DCM reset feltételébe • Ha nem figyelünk random hibákat okozhat a design bármely részén
Tipikus HDL hibák • FPGA-ban hibás DCM használat • A design-t resetben kell tartani, amíg az órajelét előállító DCM nem lockolt
Tipikus HDL hibák • Kapcsolók, nyomógombok pergésmentesítése • Megnyomáskor a nyomógomb a két állapot között változik • Elmulasztása esetén nem várt működés
Register Inkább a (rising_edge(C)) konstrukciót használjuk Hogyan valósítsunk meg aszinkron törlést? Hogyan valósítsunk meg szinkron törlést? Hogyan valósítsunk meg clock enable-t? entity dff is port( C, D : in std_logic; Q : out std_logic ); end dff; architecture rtl of dff is begin process (C) begin if (C’event and C=’1’) then Q <= D; end if; end process; end rtl; A digitális HW építőelemei
Tri-state entity three_st is port( T : in std_logic; I : in std_logic; O : out std_logic); end three_st; architecture rtl of three_st is begin process (I, T) begin if (T=’0’) then O <= I; else O <= ’Z’; end if; end process; end rtl; A digitális HW építőelemei
Counter Asznkron reset Szinkron enable Szinkron load Szinkron fel/le számlálás signal cnt : unsigned(width-1 downto 0); counter: process (CLK, RST) begin if (RST = '0') then cnt <= (others=>'0'); elsif rising_edge(CLK) then if (EN = '1') then if (LD = '1') then cnt <= Unsigned(DATA); else if (UPDN = '1') then cnt <= cnt + 1; else cnt <= cnt - 1; end if; end if; end if; end if; end process counter; Q <= std_logic_vector(cnt); A digitális HW építőelemei
Shift register Balra shiftel Szinkron set Soros be/kimenet library ieee; use ieee.std_logic_1164.all; entity shreg is port( C, SI, S : in std_logic; SO : out std_logic); end shreg; architecture rtl of shreg is signal tmp: std_logic_vector(7 downto 0); begin process (C, S) begin if (C’event and C=’1’) then if (S=’1’) then tmp <= (others => ’1’); else tmp <= tmp(6 downto 0) & SI; end if; end if; end process; SO <= tmp(7); end rtl; A digitális HW építőelemei
Multiplexer 4 to 1 bit mux library ieee; use ieee.std_logic_1164.all; entity mux is port ( a, b, c, d : in std_logic; s : in std_logic_vector (1 downto 0); o : out std_logic); end mux; architecture rtl of mux is begin process (a, b, c, d, s) begin if (s = "00") then o <= a; elsif (s = "01") then o <= b; elsif (s = "10") then o <= c; else o <= d; end if; end process; end rtl; A digitális HW építőelemei
FSM 3 process type state_type is (s1,s2,s3,s4); signal state, next_state: state_type; process1: process (clk, reset) begin if (reset =’1’) then state <= s1; elsif (clk = ’1’ and clk’Event) then state <= next_state; end if; end process process1; process2 : process (state, x1) begin case state is when s1 => if x1=’1’ then next_state <= s2; else next_state <= s3; end if; when s2 => next_state <= s4; when s3 => next_state <= s4; when s4 => next_state <= s1; end case; end process process2; process3 : process (state) begin case state is when s1 => outp <= ’1’; when s2 => outp <= ’1’; when s3 => outp <= ’0’; when s4 => outp <= ’0’; end case; end process process3; A digitális HW építőelemei
RTL kódolási stílus • Register Transfer Level kódolási stílus • A korábban bemutatott hibák elkerülésére szükség van egy szigorú stílusra • Kezdőknek érdemes ebben a stílusban fejleszteni • Haladók tudatosan elérhetnek tőle
RTL kódolási stílus • Szigorúan el kell különíteni a kombinációs hálózatot és a regisztereket • Entitásonként csak egy órajelre járó process, ami D flip flopokat tartalmaz • Kombinációs process-ben csak a flip flopok “D” bemenetei kaphatnak értéket • Kombinációs process-ben csak a registerek “Q” kimeneti értékei használhatóak fel • 3 processes state machine • A fentebb bemutatott építőelemek használhatóak