Luin tätä sivua http://www.asic-world.com/verilog/verilog_one_day3.html kun törmäsin seuraaviin:
Meidän on yleensä nollattava varvastossut, joten joka kerta, kun kello tekee Siirtyminen 0: sta 1: een (posedge), tarkistamme, onko nollaus asetettu (synkroninen nollaus), sitten jatkamme normaalia logiikkaa. Jos katsomme tarkasti, näemme, että yhdistelmälogiikan tapauksessa meillä oli ”=” tehtävää varten, ja peräkkäiselle lohkolle meillä oli operaattori ”< =”. No, ”=” estää tehtävän ja ”< =” ei estä tehtävää. ”=” suorittaa koodin peräkkäin alun / lopun sisällä, kun taas estämätön ”< =” suorittaa rinnakkain.
Olin melko varma, että estämättömät tehtävät olivat peräkkäisiä, kun taas estävät tehtävät olivat rinnakkaisia. Loppujen lopuksi voit tehdä estäviä määrityksiä määrityslausekkeilla aina lohkojen ulkopuolella, ja ne kaikki suoritetaan rinnakkain. Onko tämä virhe, vai onko käyttäytyminen erilainen aina lohkon sisällä? Ja jos käyttäytyminen on erilaista aina lohkon sisällä, voidaanko estämättömiä tehtäviä tehdä aina lohkon ulkopuolella?
Vastaa
oli melko varma, että estämättömät tehtävät olivat peräkkäisiä, kun taas estävät tehtävät olivat rinnakkaisia.
Estävä tehtävä suoritetaan ”sarjassa”, koska estävä tehtävä estää seuraavan käskyn suorittamisen, kunnes se on valmis. Siksi seuraavan lauseen tulokset voivat riippua siitä, että ensimmäinen on valmis.
Estämätön tehtävä suoritetaan rinnakkain, koska se kuvaa tehtäviä, jotka kaikki tapahtuvat samanaikaisesti. 2. rivin lauseen tulos ei riipu ensimmäisen rivin lauseen tuloksista. Sen sijaan 2. rivi suoritetaan ikään kuin ensimmäistä riviä ei olisi vielä tapahtunut.
Kommentit
Vastaa
Määrityslausekkeet eivät ole ”estäviä” tai ”estämättömiä”, ne ovat ”jatkuvia”. Määrityslausekkeen lähtö on aina yhtä suuri kuin sen syötteiden määritetty toiminto. ”Estävät” ja ”Estämättömät” määritykset ovat vain aina lohkoissa.
Esto-määritys vaikuttaa heti sen käsittelyyn. Estämätön tehtävä tapahtuu nykyisen ”aikadeltan” käsittelyn lopussa.
Lohkoja voidaan käyttää aina joko kombinatorisen tai peräkkäisen logiikan mallintamiseen (systemverilog on aina_comb ja always_ff tämän nimenomaisen tekemiseksi). kombinatorinen logiikka on yleensä tehokkaampi käyttää = mutta sillä ei tyypillisesti ole väliä.
Kun mallinnat peräkkäistä logiikkaa (esim. aina @ (posedge clk)), käytetään normaalisti estämättömiä tehtäviä. Tämän avulla voit määritä ”kellon reunan jälkeinen tila” ”tila ennen kellon reunaa”.
Joskus on hyödyllistä käyttää peräkkäisissä lohkoissa olevia estotehtäviä aina ”muuttujina”. Jos teet tämän sitten on pidettävä mielessä kaksi keskeistä sääntöä.
- Älä käytä a reg, joka on asetettu estotehtävillä peräkkäin, estä aina sen eston ulkopuolelta, jolle se on annettu.
- Älä sekoita estäviä ja estämättömiä tehtäviä samaan regiin.
Näiden sääntöjen rikkominen johtaa todennäköisesti synteesivirheisiin ja / tai simulaation ja synteesin eroihin.
Kommentit
- ” ” Älä käytä rekisteriä, joka on asetettu estämällä määrityksiä peräkkäisen lohkon sisällä aina estä aina ulkopuolelta aina estä sitä on määritetty. ” ” Voitteko selittää sen?
- Eri peräkkäisillä lohkoilla ei ole määritelty Tilaus. Joten lukemalla ” reg ” -joukko, jossa on estoedellytys yhdessä lohkossa aina toisesta, johtaa aina arvaamaton käyttäytyminen.
- Ja vaikka se näyttää toimivan simulaatiossa, synteesityökalun tulisi tarkastella sitä ja sanoa ” nope ”. Käytän paikallisia regeja näille välimuuttujille ja varmista, että ne on aina määritetty joka kelloon ennen lukemista, jotta ’ varastointi ’ on epäsuora.
- IIRC: tä pidetään ainakaan kvartaalina vain varoituksena, ei virheenä.
- Sinun ei pitäisi käyttää estotonta tehtävää yhdistelmälogiikassa, se voi lukkiutua simulaatio. Lisätietoja on tässä vastauksessa: electronics.stackexchange.com/a/506047/238188
Vastaus
Termi Estä tehtävä hämmentää ihmisiä, koska sana estää näyttää viittaavan aikajärjestykseen. Mutta syntetisoidussa logiikassa se ei tarkoita tätä , koska kaikki toimii rinnakkainen .
Ehkä vähemmän sekava termi olisi välitön toimeksianto , joka erottaisi silti yhdistelmälogiikan välitulokset tulot läpinäkymättömiin muistielementteihin (esimerkiksi kellotettuihin rekistereihin), joilla voi olla viivästetty määritys .
Legalistiselta kannalta kaikki toimii hyvin. Voit itse asiassa pitää =
estävä (aikajärjestys) -operaationa myös always_comb
sekvenssit. ajallisen ja rinnakkaisen erottelulla ei kuitenkaan ole mitään eroa tässä tapauksessa, koska always_comb
-lohko määritellään toistettavaksi, kunnes käskysekvenssi yhtyy vakaan tilaan – juuri sitä laitteistopiiri tekee (jos se täyttää ajoitusvaatimukset).
Syntetisoitava Verilog (ja erityisesti SystemVerilog) on erittäin yksinkertainen ja helppo käyttää – kun tiedät tarvittavat idioomit. Sinun tarvitsee vain ohittaa älykäs terminologian käyttö, joka liittyy ns. käyttäytymiselementteihin kielessä.
Kommentit
- käyttäytymisen koodaustyyleissä ( verrattuna RTL: ään ), ero estämisen ja estämisen välillä voi olla merkityksellinen. Joissakin tapauksissa synteesityökalu voi pystyä päättelemään toiminnallisesti vastaavan RTL: n käyttäytymiskomponenttisuunnitelmista.
- Tietysti menettelytapa SystemVerilogin tila, joka soveltuu erityisesti
initial
-lausekkeisiinprogram
-lohkoissa, käyttää (aikajaksoinen) esto-määritystä yksinomaan. Tämä on hyödyllinen testbench -suunnittelussa, mutta yleensä ei RTL-määrityksissä.
assign
-lausekkeet esiintyvät aina lohkojen ulkopuolella ja niitä käytetään yleensä kuvaamaan yhdistelmällisiksi (lukittumattomiksi) ) logiikka (vaikka aina estää, lukuun ottamatta joitain poikkeuksia, kuvaa peräkkäistä logiikkaa). AFAIK,assign
-lausekkeet suorittavat aina ” rinnakkain ” aina, kun heidän LHS: ssä on arvonmuutos .