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
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.
- 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.
- 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ó aprogram
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.
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 .