Otázka týkající se smyčky Synthesizable For a Generování

Jako cílovou desku používám jazyk Verilog a Zedboard.

Pokud vím lze syntetizovat smyčku for a syntetizační nástroj překládá smyčku for jako posloupnost duplikovaných pokynů, jako je rozvinutí smyčky.

Například

for ( i = 0; i < 4; i=i+1) begin mem[i] = i; end will be translated to mem[0] = 0; mem[1] = 1; mem[2] = 2; mem[3] = 3; 

Proto, pokud vím, lze smyčku for použít, pokud je zdroj k dispozici pro odvození více, ale stejných bran.

Zdá se však, že generování ve Verilogu lze použít nejen na více instancí, ale také na více instrukcí stejných jako u smyčky for.

Chápu, že generování může znamenat pouze více instancí modulu a smyčku for nelze použít za tímto účelem.

Jaký je tedy rozdíl mezi smyčkou generovat + pro a jen pro smyčku? Myslím, že oba fungují jako odvíjení smyčky. Existuje nějaký znatelný rozdíl? Pokud není rozdíl, který z nich je vhodnější styl kódování k vyvolání rozvinutí smyčky?

Komentáře

  • Kvůli jasnosti je ' s: Mám na mysli, vyvozujete. např. naznačujete RAM ve Verilogu / VHDL, software pro syntézu odvozuje RAM z vašeho Verilogu / VHDL. Velmi častá chyba, stojí za to se ji naučit.

Odpověď

Verilog for-loops jsou za určitých podmínek dokonale syntetizovatelné:

  • Ve smyčce můžete použít jakýkoli procedurální příkaz (např. if-else).
  • počet smyček musí být předurčeno .
    • Omezujícím výrazem musí být srovnání proměnné smyčky s konstantou nebo parametrem.
    • Přiřazení kroku musí zvyšovat hodnotu smyčky o konstantní hodnotu.
  • Stejné proměnné můžete v každé smyčce přiřadit jinou hodnotu (např. výpočet indexu z proměnné smyčky).
  • Pro účely syntézy se smyčka vyhodnocuje v nulovém čase – tj. pokud jste se pokusili vytvořit počítadlo, uvidíte pouze konečnou hodnotu.

Stejná pravidla platí, ať už použijete smyčku for v procedurálním bloku, nebo v bloku generování.

Když se provádí v procedurálním bloku, initial a always, můžete použít a pro smyčka pro změnu prvků v poli (přesně jako ve vašem příkladu), nebo můžete stejnou hodnotu změnit několikrát, například:

for (idx = 0; idx < 4; idx=idx+1) begin a = a + b[idx]; c = c + 2; //You can change more than one variable in a for loop end 

V tomto příkladu výsledný hardware bude řetězem sčítačů, sečtením hodnot ze čtyř indexů pole.

Klíčové je, že nemůžete vytvářet nové proměnné nebo moduly v procedurálním cyklu for. Toto pravidlo platí obecně pro procedurální bloky, nejen pro smyčky (tj. V procedurálním bloku nemůžete deklarovat proměnnou).

 

Generování bloků na druhé straně umožňuje vytváření proměnných a vytváření instancí modulů. To znamená, že v bloku generování můžete k odvození modulů použít smyčku generování pro. To je skoro jediný rozdíl.

Pro generování smyček musíte jako proměnnou smyčky použít genvar (tj. hodnotu, kterou použijete k počítání v každé smyčce). Musíte také pojmenovat smyčku for:

for (loopVal = 0; loopVal < 4; loopVal = loopVal + 1) begin : loopName 

Tento název se přidá k libovolnému hardwaru, který ve smyčce vytvoříte instanci. Pokud tedy vytvoříte instanci s názvem bob, výše uvedená smyčka vytvoří instance:

loopName[0]|bob loopName[1]|bob loopName[2]|bob loopName[3]|bob 

Výsledkem bude více instance s jedinečnými názvy.

 

Generování i procedura pro smyčky provedou odvíjení smyčky, jak říkáte. Rozdíl je jednoduše v tom, jak je můžete použít. Procedurální lze použít v procedurálních blocích (např. Pro inicializaci paměti). Generovat lze použít pouze při generování bloků.

Jsou užitečné i preferované. Jeden nemůže nahradit druhého.

Komentáře

  • další způsob, jak uvažovat o generování, je jakousi předprocesorem, vaším překladačem verilogu ' provádí ' věci při generování bloků v místě, kde ' vytváří instanci bloku obsahujícího generuje – nedochází ' k tomu za běhu (na rozdíl od procedurálních smyček)
  • @Taniwha procedurální smyčky don ' t se spouští také za běhu. Rozbalí je kompilátor. Nakonec se vše scvrkne na hardware. Nezaměňujte také preprocesor s příkazy generování, nejsou to ' stejný koncept – Verilog má preprocesor včetně příkazů typu if-else.
  • @TomCarpenter Oceňuji skvělou odpověď. Rozuměl jsem všem vašim bodům kromě smyčky generate for.Zdá se, že začít: něco by mělo být přidáno těsně před smyčku for, ale nechápe, jak to funguje při vytváření instancí modulů. Je název smyčky proměnná nebo jen řetězec? A jak je lze indexovat pomocí [1] až [4].
  • @JaeHyukLee loopName je pouze text, například název instance nebo název signálu. Může to být cokoli chcete.
  • @TomCarpenter – záleží na kompilátoru – pokud ' znovu sestavíte brány ano, rozbalí se, pokud ' re kompilace kódu pro simulaci pravděpodobněji ne (zřeknutí se odpovědnosti, ' napsal jsem kompilátor Verilog)

Napsat komentář

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