|
順序語句是執(zhí)行完一句再執(zhí)行下一句,如果有非阻塞就要按照并行處理,再說幾個(gè)概念:
并行,順序:verilog主要的模塊之間都是并行執(zhí)行的,例如各個(gè)always之間、always與assign之間、assign之間,如果你在一個(gè)always中要對(duì)a賦值,而在另一個(gè)always中要使用a的值,這時(shí)候就要注意了,兩者并行的,處理先后不能確定。你當(dāng)前處理的a,是這個(gè)時(shí)鐘被賦值的還是上一時(shí)鐘被賦值的,意義可能完全不同,這就是并行需要考慮的問題。
而在always內(nèi)部,一般使用了begin...end。這里面的內(nèi)容都是順序執(zhí)行的,比如b=a; c=b,先執(zhí)行一條,再執(zhí)行下一條,那就是c=a了如果里面有兩組if/else,就是先執(zhí)行前一組,再執(zhí)行后一組。但是如果是非阻塞,那就要特殊對(duì)待,多個(gè)非阻塞賦值是在一個(gè)塊結(jié)束時(shí)一起執(zhí)行的,比如b<=a; c<=b,那就跟之前不同了,當(dāng)執(zhí)行c<=b 時(shí)b還沒有變化成a的值,因此這個(gè)賦值的結(jié)果是b被賦值前的值,這兩條語句其實(shí)是獨(dú)立的、并行的。好處是放得先后順序沒關(guān)系,只要在一個(gè)塊內(nèi),隨便寫。這個(gè)不是很好理解,怎么說了begin...end之間是順序,到了非阻塞就又變成并行執(zhí)行的呢。不好理解也沒辦法, verilog就是這樣,先告訴你是這樣的,然后又告訴你這樣行不通,習(xí)慣就好了,另外掌握幾條原則:組合邏輯用阻塞賦值,時(shí)序邏輯用非阻塞賦值,同一個(gè)模塊中不要既用阻塞又用非阻塞...
|
|