Különbség a blokkoló és a nem blokkoló hozzárendelés között Verilog

Ezt az oldalt olvastam http://www.asic-world.com/verilog/verilog_one_day3.html , amikor a következőkre bukkantam:

A papucsokat általában vissza kell állítanunk, így minden alkalommal, amikor az óra áttérés 0-ról 1-re (posedge), ellenőrizzük, hogy a visszaállítás érvényesült-e (szinkron reset), majd a normál logikával folytatjuk. Ha jól megnézzük, akkor azt látjuk, hogy a kombinációs logika esetében “=” volt a hozzárendelés, a szekvenciális blokkhoz pedig a “< =” operátor volt. Nos, a “=” blokkolja a hozzárendelést, és a “< =” nem blokkoló feladat. “=” a kódot egymás után hajtja végre egy kezdet / vég belsejében, míg a nem blokkoló “< =” párhuzamosan hajt végre.

Biztos voltam benne, hogy a nem blokkoló hozzárendelések egymás után következtek, míg a blokkoló hozzárendelések párhuzamosak voltak. Végül is blokkolási hozzárendeléseket hajthat végre hozzárendelési utasításokkal a mindig blokkokon kívül, és ezek párhuzamosan futnak. Ez hiba, vagy a mindig blokkban más a viselkedés? És ha egy mindig blokkon belül más a viselkedés, akkor a nem blokkoló hozzárendeléseket a mindig blokkon kívül is elvégezhetjük?

Válasz

eléggé biztos volt abban, hogy a nem blokkoló hozzárendelések egymás után következtek, míg a blokkoló hozzárendelések párhuzamosak voltak.

A hozzárendelés blokkolása “sorozatban” hajtódik végre, mert egy blokkoló hozzárendelés blokkolja a következő utasítás végrehajtását, amíg az be nem fejeződik. Ezért a következő utasítás eredményei függhetnek az első befejezésétől.

A nem blokkoló feladat párhuzamosan hajtódik végre, mert leírja azokat a hozzárendeléseket, amelyek mind egyszerre történnek. A 2. sorban szereplő állítás eredménye nem függ az 1. sorban szereplő állítás eredményeitől. Ehelyett a 2. sor úgy fog végrehajtani, mintha az 1. sor még nem történt volna meg.

Megjegyzések

  • Mi a helyzet a hozzárendelési utasításokkal? Csak egy teljes saját osztályba tartoznak?
  • Igen, a assign utasítások mindig a blokkokon kívül esnek, és általában a kombinatorikus (nem reteszelt) leírására szolgálnak ) logika (míg mindig blokkol, néhány kivételtől eltekintve, a szekvenciális logikát írja le). AFAIK, assign utasítások mindig ” parancsot hajtanak végre párhuzamosan “, amikor az LHS-nek értéke megváltozik .
  • Oké … Én ‘ kezdem azt a benyomást kelteni, hogy a Verilog éppen nem ‘ elegánsan megtervezett nyelv. Ez olyan lesz, mint a C megtanulása.
  • A Verilogot úgy tervezték, hogy ” leírja a már létező ” hardvert. Nyelvként használni a hardver tervezéséhez (szintetizálásához) feltörés.
  • ha a Verilog ” mint a C ” probléma, vessen egy pillantást a VHDL-re. Vannak, akik meglehetősen erős preferenciákkal rendelkeznek egyik vagy másik iránt. Egyesek számára a VHDL túl bőbeszédű. Számomra ez ‘ sokkal jobban átgondolt. (a jel / változó hozzárendelés szemantikája sokkal tisztább, mint például a blokkolás / nem). stackoverflow.com/questions/13954193/… és sigasi .com / content / vhdls-crown-jewel Előnyben részesítheti, vagy utálja. De ‘ érdemes megnézni.

Válasz

A hozzárendelési utasítások nem “blokkoló” vagy “nem blokkoló”, hanem “folyamatosak”. A hozzárendelés utasítás kimenete mindig megegyezik a bemeneteinek megadott funkciójával. A “blokkoló” és a “nem blokkoló” hozzárendelések csak a mindig blokkokon belül léteznek.

A blokkoló hozzárendelés azonnal befolyásolja annak feldolgozását. A blokkolás nélküli hozzárendelés az aktuális “időeltolódás” feldolgozásának végén történik.

mindig blokkokkal lehet kombinatorikus vagy szekvenciális logikát modellezni (a systemverilognak mindig_comb és mindig_ff van, hogy ezt explicitvé tegye). a kombinatorikus logika általában hatékonyabb =, de általában nem mindegy.

A szekvenciális logika modellezésénél (pl. mindig @ (posedge clk)) általában nem blokkoló feladatokat használ. Ez lehetővé teszi, hogy az “órajel élét követő állapot” meghatározása az “órajel előtti állapot” kifejezéssel kapcsolatban.

Néha hasznos, ha a blokkolási hozzárendeléseket a szekvenciális blokkokban mindig “változóként” használjuk. Ha ezt megteszi, akkor két fő szabályt kell szem előtt tartani.

  1. Ne érje el a reg, amely egy szekvenciális blokkolási hozzárendelésekkel van beállítva, mindig blokkolja azt a blokkot, amelyhez hozzá van rendelve.
  2. Ne keverje a blokkoló és a nem blokkoló hozzárendeléseket ugyanahhoz a reghez.

Ezeknek a szabályoknak a megszegése valószínűleg szintézishibákat és / vagy viselkedési különbségeket eredményez a szimuláció és a szintézis között.

Megjegyzések

  • ” ” Ne férjen hozzá egy olyan reg-hez, amelyet blokkoló hozzárendelésekkel állítottak be egy szekvenciális blokkon belül, mindig blokkoljon kívülről hozzárendelve. ” ” Meg tudja magyarázni?
  • A különböző szekvenciális blokkokban nincs definiálva rendelés. Tehát egy ” reg ” halmaz elolvasása blokkoló megbízással az egyik blokkban mindig a másik blokkból mindig kiszámíthatatlan viselkedéshez vezet.
  • És még akkor is, ha úgy tűnik, hogy szimulációban működik, a szintézis eszköznek ezt meg kell vizsgálnia, és azt kell mondania, hogy ” nope “. Helyi reg-eket használok ezekhez a köztes változatokhoz, és az olvasás előtt győződjön meg arról, hogy mindig minden órában hozzá vannak rendelve, hogy ne legyen ‘ storage ‘ feltételezhető.
  • Az IIRC, legalábbis kvartusban, csak figyelmeztetésnek, nem pedig hibának tekinthető.
  • Nem szabad blokkolás nélküli hozzárendelést használni a kombinációs logikában, ez elzáródhat. a szimuláció. További részletekért olvassa el ezt a választ: electronics.stackexchange.com/a/506047/238188

Válasz

A Blokkolás hozzárendelése kifejezés összezavarja az embereket, mert a blokkolás szó időszekvenciás logikára utal. De a szintetizált logikában ez nem azt jelenti, hogy , mert minden működik párhuzamos .

Talán kevésbé zavaró kifejezés lenne az azonnali hozzárendelés , amely mégis megkülönböztetné a kombinációs logika köztes eredményeit a bemenet nem átlátszó memóriaelemekhez (például órás regiszterekhez), amelyek késleltetett hozzárendeléssel rendelkezhetnek .

Legalisztikus szempontból mindez nagyon jól működik. Valójában úgy tekintheti a = -t, hogy blokkoló (idő-szekvenciális) művelet még always_comb szekvenciák. Azonban az idõsorrend és a párhuzamos megkülönböztetése ebben az esetben egyáltalán nem tesz különbséget , mert a always_comb blokkot úgy definiálják, hogy addig ismételje, amíg az utasítássorozat stabil állapotba nem konvergál – pontosan ezt fogja tenni a hardver áramkör (ha megfelel az időzítési követelményeknek).

A szintetizálható részhalmaza A Verilog (és főleg a SystemVerilog) rendkívül egyszerű és könnyen használható – ha ismeri a szükséges idiómákat. Csak túl kell lépnie a nyelv úgynevezett viselkedési elemeihez társított terminológia okos használatán.

Megjegyzések

  • A viselkedési kódolási stílusokban ( az RTL-hez képest ) releváns lehet a blokkolás és a nem blokkolás közötti megkülönböztetés. Bizonyos esetekben a szintézis eszköz képes funkcionálisan egyenértékű RTL-re következtetni a viselkedési komponensek tervezéséből.
  • Természetesen a eljárási A SystemVerilog módja, amely különösen a initial utasításokra alkalmazható a program blokkokban, (idõszekvenciális) blokkolási hozzárendelést használ kizárólag. Ez hasznos a testben tervezéshez, de általában nem az RTL specifikációkhoz.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük