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)