Kysymys syntetisoitavasta silmukasta ja generaattorista

Käytän Verilog-kieltä ja Zedboardia kohdekorttina.

Sikäli kuin tiedän , for-silmukka voidaan syntetisoida, ja synteesityökalu kääntää for-silmukan päällekkäisiksi käskyiksi, kuten silmukan purkaminen.

Esimerkiksi

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; 

Siksi tietojeni mukaan for-silmukkaa voidaan käyttää, jos resurssi on käytettävissä useiden mutta samojen tarkoitusten porttien päättelemiseen.

Vaikuttaa kuitenkin siltä, että Verilogissa oleva generaattori voidaan käyttää, ei vain viitata useisiin instansseihin, vaan myös useisiin ohjeisiin, jotka ovat samat kuin for-silmukalle.

Ymmärrän, että generointi voi tarkoittaa vain moduulin useita instansseja, ja for-silmukkaa ei voida käyttää tätä tarkoitusta varten.

Mitä eroa sitten generoida + -silmukalle ja vain silmukalle? Mielestäni molemmat toimivat kuten silmukan purkaminen. Onko mitään havaittavaa eroa? Jos eroa ei ole, kumpi on suositeltava koodaustyyli silmukan purkamisen aikaansaamiseksi?

Kommentit

  • Selvyyden vuoksi se ' s: Tarkoitan, että päätät. esimerkiksi. tarkoitat RAM-muistia Verilog / VHDL: ssä, synteesiohjelmisto päättelee, että RAM on Verilog / VHDL: stäsi. Hyvin yleinen virhe, kannattaa oppia.

Vastaus

Verilog for–silmukat ovat täysin syntetisoitavissa tietyissä olosuhteissa:

  • Voit käyttää mitä tahansa silmukkaan kuuluvaa menettelylauseketta (esim. if-else).
  • -silmukoiden määrä on oltava ennalta määrätty .
    • Rajoittavan lausekkeen on oltava vertailu silmukan muuttujan ja joko vakion tai parametrin välillä.
    • Vaiheen määrityksen on lisättävä silmukan arvoa vakiona.
  • Voit määrittää eri arvon samalle muuttujalle jokaisessa silmukassa (esim. indeksin laskeminen silmukan muuttujasta).
  • Synteesiä varten silmukka arvioidaan nolla-aikoina – ts. jos yrität tehdä laskurin, näet vain lopullisen arvon.

Samoja sääntöjä sovelletaan riippumatta siitä, käytätkö for-loopia prosessilohkossa vai luontilohkossa.

Kun se tehdään prosessilohkossa, initial ja always, voit käyttää silmukka muuttaa matriisin elementtejä (täsmälleen kuten esimerkkisi), tai voit muuttaa samaa arvoa useita kertoja, esimerkiksi:

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 

Tässä esimerkissä tuloksena oleva laitteisto tulee olemaan summainketju, joka laskee yhteen arvot neljästä taulukkoindeksistä.

Tärkeintä on, että et voi luoda uusia muuttujia tai moduuleja silmukan menettelytapaan. Tämä sääntö koskee prosessilohkoja yleensä, ei pelkästään silmukoita (ts. Et voi ilmoittaa muuttujaa menettelylohkossa).

 

Luo lohkot toisaalta sallivat muuttujien luomisen ja moduulien ilmentämisen. Se tarkoittaa, että generointilohkossa voit käyttää generointia silmukalle moduulien päättelemiseen. Se on melkein ainoa ero.

Luo silmukoita varten sinun on käytettävä genvar -silmukan muuttujaa (eli arvoa, jota käytät laskettaessa jokaisen silmukan läpi). Sinun on annettava myös for silmukalle nimi:

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

Tämä nimi on valmiina mihin tahansa laitteeseen, jonka silmukassa esiintyy. Joten jos luot ilmentymän nimeltä bob, yllä oleva silmukka luo ilmentymiä:

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

Tämä johtaa useisiin instansseja, joilla on yksilölliset nimet.

 

Silmukoiden sekä generointi että menettelytavat suorittavat silmukan purkamisen, kun sanot. Ero on yksinkertaisesti siinä, miten voit käyttää niitä. Menettelytapaa voidaan käyttää menettelylohkoissa (esim. Muistin alustamiseksi). Luomista voidaan käyttää vain generointilohkoissa.

Ne ovat sekä hyödyllisiä että suositeltavia. Toista ei voi korvata.

Kommentit

  • toinen tapa ajatella generointia on eräänlainen esiprosessori, verilog-kääntäjäsi ' suorittaa ' asioita generointilohkoissa siinä kohdassa, jossa se ' s välittää lohkon, joka sisältää generoi – ne eivät ' ei tapahdu ajoaikana (toisin kuin menettelysilmukat)
  • @Taniwha menettelysilmukat eivät ' t suoritetaan myös ajoaikana. Kääntäjä avaa ne. Ne kaikki loppujen lopuksi muuttuu laitteistoksi. Älä myöskään sekoita esiprosessoria generaattorilausekkeisiin, ne eivät ole sama käsite – Verilogissa on esiprosessori, joka sisältää if-else -tyyppisiä käskyjä.
  • @TomCarpenter Arvostan hyvää vastausta. Voisin ymmärtää kaikki näkökohdat paitsi generoida silmukalle.Näyttää siltä, että alkaa: jotain on lisättävä juuri ennen for-silmukkaa, mutta ei voi ymmärtää, miten se toimii moduulien instantioinnissa. Onko loopName muuttuja vai vain merkkijono? Ja miten ne voidaan indeksoida [1] – [4].
  • @JaeHyukLee loopName on vain tekstiä, kuten ilmentymän nimi tai signaalin nimi. Se voi olla mitä haluat.
  • @TomCarpenter – se riippuu kääntäjästä – jos ' käännät portteja uudelleen, kyllä, ne avataan, jos ' koodin kääntäminen uudelleen simulointia varten ei todennäköisesti (vastuuvapauslauseke, olen kirjoittanut Verilog-kääntäjän)

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *