Rozdíl mezi blokovacím a neblokovacím přiřazením Verilog

Četl jsem tuto stránku http://www.asic-world.com/verilog/verilog_one_day3.html když jsem narazil na následující:

Normálně musíme resetovat klopné obvody, takže pokaždé, když hodiny způsobí přechod z 0 na 1 (posedge), zkontrolujeme, zda je uplatněn reset (synchronní reset), pak pokračujeme normální logikou. Podíváme-li se pozorně, vidíme, že v případě kombinační logiky jsme měli „=“ pro přiřazení a pro sekvenční blok jsme měli operátor „< =“. „=“ Blokuje přiřazení a „< =“ neblokující přiřazení. „=“ spouští kód postupně uvnitř začátku / konce, zatímco neblokující „< =“ se spouští paralelně.

Byl jsem si docela jistý, že neblokovací úkoly byly sekvenční, zatímco blokovací úkoly byly paralelní. Koneckonců můžete blokovat přiřazení pomocí příkazů assign mimo vždy bloky a všechny běží paralelně. Je to chyba, nebo se chování uvnitř vždy zablokovaného chování liší? A pokud je chování uvnitř bloku vždy odlišné, lze neblokovací úkoly provádět mimo blok vždy?

Odpovědět

si byl docela jistý, že neblokující přiřazení jsou postupná, zatímco blokující přiřazení jsou paralelní.

Blokování přiřazení se provádí „v sérii“, protože blokující přiřazení blokuje provádění dalšího příkazu, dokud nebude dokončeno. Výsledky dalšího příkazu proto mohou záviset na dokončení prvního příkazu.

Neblokující přiřazení se provádí paralelně, protože popisuje přiřazení, která se vyskytují současně. Výsledek výpisu na 2. řádku nebude záviset na výsledcích výpisu na 1. řádku. Místo toho se 2. řádek spustí, jako by se 1. řádek ještě nestal.

Komentáře

  • A co přiřazovací příkazy? Jsou jen v celé své vlastní třídě?
  • Ano, assign příkazy se vyskytují mimo vždy bloky a jsou obecně používány k popisu kombinačních (nezakrytých) ) logika (zatímco vždy blokuje, až na několik výjimek, popište sekvenční logiku). AFAIK, assign příkazy vždy spouštějí “ paralelně „, kdykoli má jejich LHS změnu hodnoty .
  • Dobře … Začínám mít ‚ dojem, že Verilog prostě není ‚ nejvíc elegantně navržený jazyk. Bude to jako učení C.
  • Verilog byl navržen tak, aby “ popsal “ hardware, který již existuje. Jeho použití jako jazyka pro návrh (syntézu) hardwaru je hack.
  • pokud se Verilog “ rád učí C “ je problém, podívejte se na VHDL. Někteří lidé mají poměrně silné preference pro jednoho nebo druhého. Pro některé je VHDL příliš podrobná. Pro mě je to ‚ mnohem lépe promyšlené. (Sémantika přiřazení signálu / proměnné je mnohem jasnější než například blokování / jiné). stackoverflow.com/questions/13954193/… a sigasi .com / content / vhdls-crown-klenot Můžete mu dát přednost nebo ho nenávidět. Ale ‚ stojí za to se podívat.

Odpovědět

Přiřazovací příkazy nejsou ani „blokovací“, ani „neblokující“, jsou „průběžné“. Výstup příkazu přiřazení se vždy rovná zadané funkci jeho vstupů. Přiřazení „blokování“ a „odblokování“ existují pouze v rámci bloků vždy.

Přiřazení blokování má vliv na jeho okamžité zpracování. K neblokujícímu přiřazení dojde na konci zpracování aktuální „časové delty“.

Vždy bloky lze použít k modelování buď kombinatorické nebo sekvenční logiky (systemverilog má always_comb a always_ff, aby to bylo explicitní). Při modelování kombinatorická logika je obvykle efektivnější použít = ale obvykle na tom opravdu nezáleží.

Při modelování sekvenční logiky (např. always @ (posedge clk)) obvykle používáte neblokující tvrzení. To vám umožní omezit „stav za hranou hodin“ ve smyslu „stavu před hranou hodin“.

Někdy je užitečné použít blokující přiřazení v sekvenčních vždy blokovaných jako „proměnné“. Pokud to uděláte, pak je třeba mít na paměti dvě klíčová pravidla.

  1. Nepřistupovat k a reg, který je nastaven s blokujícími přiřazeními uvnitř sekvenčního vždy bloku z vnějšku vždy bloku, ke kterému je přiřazen.
  2. Nemíchejte blokovací a neblokující přiřazení ke stejnému reg.

Porušení těchto pravidel pravděpodobně povede k selhání syntézy nebo k rozdílům v chování mezi simulací a syntézou.

Komentáře

  • “ “ Nepřistupujte k reg, který je nastaven blokujícími přiřazeními uvnitř sekvenčního vždy blokujte mimo vždy jej blokujte je přiřazen v. “ “ Můžete to prosím vysvětlit?
  • Různé sekvenční bloky vždy nemají definovaný objednat. Čtení sady “ reg “ s blokujícím tvrzením v jednom bloku vždy z jiného bloku vždy povede k nepředvídatelnému chování.
  • A i když se zdá, že funguje v simulaci, měl by se na to podívat syntetický nástroj a říci “ ne „. Pro tyto mezilehlé vary používám místní regy a před čtením se ujistěte, že jsou vždy přiřazeny na každých hodinách, takže žádné ‚ storage ‚ je implicitní.
  • IIRC alespoň v kvartu se považuje pouze za varování, nikoliv za chybu.
  • V kombinační logice byste neměli používat neblokující přiřazení, může se uzamknout simulace. Další informace najdete v této odpovědi: electronics.stackexchange.com/a/506047/238188

Odpověď

Termín blokování přiřazení lidi mátne, protože slovo blokování zřejmě naznačuje časově sekvenční logiku. Ale v syntetizované logice to neznamená , protože vše funguje v paralelní .

Méně matoucím výrazem by bylo okamžité přiřazení , které by stále odlišovalo mezivýsledky kombinační logiky od vstupy do netransparentních paměťových prvků (například taktované registry), které mohou mít opožděné přiřazení .

Z právního hlediska to všechno funguje velmi pěkně. Ve skutečnosti můžete = považovat za blokovací (časovou) operaci i v rámci always_comb sekvence. Rozdíl mezi časově sekvenčním a paralelním však v tomto případě absolutně nerozlišuje , protože always_comb blok je definován tak, aby se opakoval, dokud sekvence instrukcí konverguje na stabilní stav – což je přesně to, co budou dělat hardwarové obvody (pokud splňují požadavky na časování).

Syntetizovatelná podmnožina Verilog (a zejména SystemVerilog) je extrémně jednoduchý a snadno použitelný – jakmile znáte potřebné idiomy. Musíte jen překonat chytré používání terminologie spojené s takzvanými behaviorálními prvky v jazyce.

Komentáře

  • V behaviorálních stylech kódování ( ve srovnání s RTL ) může být relevantní rozdíl mezi blokováním a neblokováním. V některých případech může být nástroj pro syntézu schopen odvodit funkčně ekvivalentní RTL z návrhů behaviorálních komponent.
  • Samozřejmě procedurální režim SystemVerilog, použitelný zejména pro initial příkazy v program blocích, používá (časově sekvenční) blokující přiřazení výhradně. To je užitečné pro design testbench , ale obecně ne pro specifikaci RTL.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *