Verilog HDL阻塞屬性探究及其應用
Verilog HDL中,有兩種過程賦值方式,即阻塞賦值(blocking)和非阻塞賦值(nonblocking)。阻塞賦值執行時,RHS(right hand statement)估值與更新LHS(left hand statement)值一次執行完成,計算完畢,立即更新。在執行時阻塞同塊中的其他語句的執行。阻塞式(blocking)的操作符為 “ = ”。它的執行很像傳統程序設計語言。非阻塞賦值RHS估值與更新LHS值分兩步執行。在單位仿真周期開始時RHS估值,在同一單位仿真周期末更新LHS值,不阻塞同塊中其他語句的執行。非阻塞式(non-blocking)的操作符為 “ = ”,它的執行更像并行電路,使描述電路更自然。阻塞賦值與非阻塞賦值是Verilog HDL程序設計的難點,它們既有共同點,也有差異,深入剖析其異同,對于硬件程序的開發具有重大意義。
本文引用地址:http://www.j9360.com/article/187349.htm1 Verilog 事件處理機制
層積事件列(The Stratified Event Queue)是一個事件管理概念模型,而非硬件邏輯。模型內事件的具體實現與EDA軟件生產商的算法策略有關。在IEEE-2001中,Verilog把事件分為5個不同部分,按照時間順序如圖1所示。

觸發的任何事件可以加入到這5個事件列中的任何事件列中,但只能從活躍事件列中移出。即上面的5個事件列中的事件最后都將被激活而放入活躍事件列中。層積事件列是層次模型,層積事件列的執行順序是按優先級排列的。任何EDA軟件都只能執行活躍事件。其他事件列都按優先級級別依次激活本列事件以供執行。
1.1 活躍事件列
由圖1可見,大部分事件都被放入活躍事件列。活躍事件列里包括非阻塞賦值RHS估值。但是,非阻塞賦值的更新不是在活躍事件列,它被列成獨立的非阻塞更新事件列。活躍事件列是仿真的執行源,從一開始執行活躍事件列到活躍事件列執行完畢稱為一個仿真周期。活躍事件列中的事件可以觸發活躍或非活躍等其他事件。當活躍事件列中的所有事件執行完后,EDA軟件會按優先級依次觸發其余事件列以供仿真執行。但在當前活躍事件列中的事件執行順序是不確定的。
1.2 非活躍事件列
發生在當前仿真時間里并且在活躍事件列執行完后執行的事件列,即非活躍事件列執行優先級僅次于活躍事件列。如帶PLI例程的回調過程(tf_synchronize()、vpi_register_cb(cb_readwrite))。非活躍事件列中的事件亦可以觸發其他事件。如果觸發了優先級更高的活躍事件,非活躍事件列中的其余事件執行后移。
1.3 非阻塞賦值更新事件列
活躍事件列中的每個非阻塞賦值RHS估值,都會觸發一個與之對應的非阻塞賦值更新事件,這些事件被放在非阻塞賦值更新事件列中,執行優先級次于活躍與非活躍事件列。非阻塞賦值更新事件亦可以觸發其他事件。若在非阻塞賦值更新事件列中,存在多個對同一變量的先后賦值,只有最后一個有效,其余值將被覆蓋。
1.4 監控事件列
監控事件列被放在非阻塞賦值更新事件列后。由此可見,用監控事件列中的監控命令監控得到的值都是賦值后的值,活躍事件列$display系統命令則可以查看非阻塞更新前的值。
1.5 未來事件列
在執行事件時,如果事件含有延時,為不阻礙仿真的繼續執行,該事件將被掛起而放入未來事件列。未來事件包含未來非活躍事件和未來非阻塞賦值更新事件。
理解阻塞與非阻塞賦值就需要深入理解層積事件列,層積事件列反應了Verilog事件處理機制。
評論