詳細的了解層次化事件隊列有助於理解Verilog的阻塞賦值和非阻塞賦值功能。所謂層次化事件隊列指的是用於調度仿真時間的不同Verilog事件隊列。在IEEE的5.3節中定義了層次化事件隊列在邏輯上分為用於當前仿真事件的4個不同隊列,和用於下一段仿真事件的若干個附加隊列:
1)動態事件隊列(下列事件隊列的執行順序可以隨意安排)
a)阻塞賦值 b)計算非阻塞賦值的RHS c)連續賦值 d)執行$display命令 e)計算原語的輸入輸出變化
2)停止運行的事件隊列: #0延時阻塞賦值
3)非阻塞賦值事件隊列: 更新非阻塞賦值的LHS
4)監控事件隊列
a)執行$monitor命令 b)執行$strobe命令
5)其他指定的PLI命令隊列:其他PLI命令。
大多數Verilog事件是由動態事件隊列調度的。這些事件包括阻塞賦值、連續賦值、$display命令,實例和原語的輸入輸出變化以及他們的輸出更新,非阻塞賦值語句RHS的計算。而非阻塞賦值語句LHS的更新卻不是由動態事件調度。除了這些以外,排列在其他的隊列中的事件要等到被“激活”后,即被排入動態事件隊列中后,才能真正的開始等待執行。
綜合前面阻塞賦值和非阻塞賦值,在Verilog程序中要遵循以下原則:
1)時序電路建模,采用非阻塞賦值;
2)鎖存器建模,采用非阻塞賦值;
3)用always塊來描述組合邏輯,采用阻塞賦值;
4)用always塊來描述組合和時序混合邏輯,采用非阻塞賦值;
5)在同一個always塊中,不能同時使用非阻塞賦值和阻塞賦值;
6)在不同always中,不要為同一個變量賦值。
7)用$strobe系統任務來顯示非阻塞賦值的變量值;
8)在賦值時,不要使用#0延遲。