1. 前言
本文講一下SystemVerilog的time slot里的regions以及events的調(diào)度。SystemVerilog語(yǔ)言是根據(jù)離散事件執(zhí)行模型定義的,由events驅(qū)動(dòng)。SystemVerilog描述是由連接的執(zhí)行thread或processes組成。Process是可衡量的,也具有狀態(tài),并且可以響應(yīng)輸入的變化以產(chǎn)生輸出。Process是并發(fā)調(diào)度的元素,例如initial,process其實(shí)還包括了always, always_comb, always_latch, always_ff, contiguous assignment, asynchronous tasks和procedural assignment statement。
SystemVerilog是一種并行編程語(yǔ)言,我們需要重點(diǎn)了解哪些執(zhí)行順序?qū)τ脩羰怯斜WC的,哪些執(zhí)行順序是不確定的。這塊內(nèi)容比較晦澀難懂,但要是理解了regions和events的調(diào)度,對(duì)我們寫(xiě)代碼和調(diào)試會(huì)有極大的幫助,而且也更了解EDA工具的執(zhí)行機(jī)制。
2. Event的定義
在仿真系統(tǒng)中net或variable的狀態(tài)的任何更改,都被視為更新事件(update event)。Processes對(duì)upate event是敏感的。當(dāng)一個(gè)update event發(fā)生時(shí),所有對(duì)該event敏感的processes都會(huì)被當(dāng)作以任意順序進(jìn)行評(píng)估。Process的評(píng)估也是一個(gè)event,稱作評(píng)估事件(evaluation event)。Evaluation events包括PLI callbacks,這些callbacks是執(zhí)行模型中的節(jié)點(diǎn),PLI應(yīng)用程序可以從仿真內(nèi)核調(diào)用。所以,這些events會(huì)在不同的regions中發(fā)生。
3. Region的定義
為了支持清晰和可預(yù)測(cè)的交互,將單個(gè)time slot劃分為多個(gè)region,events就被以確定的執(zhí)行順序安排到這些regions中,這就允許DUT代碼和驗(yàn)證代碼之間可預(yù)測(cè)的交互。在特定時(shí)間的所有scheduled events定義了1個(gè)time slot。在移動(dòng)到下一個(gè)time slot之前,仿真按照時(shí)間順序進(jìn)行并刪除掉當(dāng)前仿真時(shí)間slot中的所有events,從而使得仿真前進(jìn)。這個(gè)過(guò)程保證了仿真器不會(huì)在時(shí)間上倒退。一個(gè)time slot可以被劃分為一組有序的regions,有:Preponed,Pre-Active,Active,Inactive,Pre-NBA,NBA,Post-NBA,Pre-Observed,Observed,Post-Observed,Reactive,Re-Inactive,Pre-Re-NBA,Re-NBA,Post-Re-NBA,Pre-Postponed,Postponed。如圖1。
圖1 time slot執(zhí)行流程圖
其中Active, Inactive, Pre-NBA, NBA和Post-NBA regions中scheduled events稱為active region set events。Reactive, Re-Inactive, Pre- Re-NBA, Re-NBA和Post-Re-NBA regions中scheduled events稱為reactive region set events。
Active, Inactive, Pre-NBA, NBA, Post-NBA, Pre-Observed, Observed, Post- Observed, Reactive, Re-Inactive, Pre-Re-NBA, Re-NBA, Post-Re-NBA和Pre-Postponed regions被稱為iterative regions。
除了active region set和reactive region set,每個(gè)time slot的event regions可以分為simulation regions和PLI regions。圖1中,圓角長(zhǎng)方形的屬于simulation regions。橢圓形的屬于PLI regions。
4. Events調(diào)度參考算法
當(dāng)仿真開(kāi)始時(shí),先初始化所有nets和variables的初始值,并在0 time slot上開(kāi)始調(diào)度初始化events。
當(dāng)發(fā)現(xiàn)有非空的time slot時(shí),也就是time slot里有scheduled event。它會(huì)去執(zhí)行第一個(gè)非空的time slot,就開(kāi)始按照?qǐng)D1的流程圖順序執(zhí)行各個(gè)region。當(dāng)進(jìn)入1個(gè)region內(nèi)時(shí),找到當(dāng)前region內(nèi)的scheduled event,判斷event類型,如果是update event類型,更新這個(gè)event對(duì)象,且為對(duì)該event對(duì)象敏感的任何process安排evaluation event;如果是evaluation event類型,評(píng)估與這event相關(guān)的process,并可能安排進(jìn)一步執(zhí)行的events。
Time slot里的這些region中,Prepone、Pre-Active和Postponed只會(huì)執(zhí)行一次。其它的region,具體要看event的情況,可能會(huì)執(zhí)行多次。不過(guò)總體遵循這個(gè)流程:
- 順序處理Prepone和Pre-Active region。
- 處理從Active到Post-Observed的region,會(huì)從里面找到第一個(gè)有非空event的region處理,直至全部event處理完且刪掉。需要注意的是,如果在NBA region的觸發(fā)了一個(gè)需要在Active region處理的event,那么會(huì)從NBA跳回Active region去處理,然后按順序繼續(xù)尋找第一個(gè)有非空event的region。
- 當(dāng)步驟2的regions全部處理好之后,會(huì)開(kāi)始處理從Reactive到Post_Re-NBA region,也是類似的,會(huì)從里面找到第一個(gè)有非空event的region處理,直至全部處理完畢。
- 當(dāng)步驟3的region也全部處理完之后,會(huì)再重新判斷下從Active到Post Re-NBA region是否還有未處理的,如果有就又要從第一個(gè)非空event的region處理,如果沒(méi)有就執(zhí)行Pre-Postponed region。5. 當(dāng)步驟2-4里的都沒(méi)有非空event的region后,處理Postponed region。6. 步驟5處理完之后,就進(jìn)入到下一個(gè)time slot了。
5. Regions調(diào)度的events類別
Time slot的simulation regions包含了Preponed, Active, Inactive, NBA, Observed, Reactive, Re-Inactive, Re-NBA和Postponed regions。再根據(jù)active region set和reactive region set的劃分,我們可以將一個(gè)time slot的simulation regions分為五個(gè)主要region:Preponed、Active、Observed、Reactive和Postponed。Active和Reactive可以進(jìn)一步細(xì)分為小的regions。如圖2所示。
圖2 Simulation regions
這五大regions里調(diào)度的events有:
Prepone: 在一個(gè)time slot內(nèi),Prepone region只會(huì)執(zhí)行一次,當(dāng)仿真時(shí)間進(jìn)入當(dāng)前time slot時(shí),它是第一個(gè)被執(zhí)行的region。驗(yàn)證環(huán)境采樣DUT的信號(hào)就發(fā)生在這個(gè)region。我們平時(shí)在采樣DUT信號(hào)時(shí),會(huì)指定#1step采樣延遲,#1step采樣延遲提供了在進(jìn)入當(dāng)前time slot之前立即采樣信號(hào)的能力。#1step采樣相當(dāng)于在當(dāng)前time slot的Prepone中采樣信號(hào)。所以在Preponed region的采樣相當(dāng)于前一個(gè)time slot Postponed region的采樣。Preponed region PLI events也在這里調(diào)度。
Active: Active包含了幾個(gè)小的regions:active,inactive和NBA(nonblocking assignment update) regions。
- Active region進(jìn)行當(dāng)前active region set events的評(píng)估求值,并且這些events會(huì)被任意處理。RTL代碼和行為代碼(behavioral code)被安排在active region。所有blocking assignments語(yǔ)句在Active region執(zhí)行。對(duì)于nonblocking assignments,RHS的評(píng)估求值發(fā)生在Active region,而賦值發(fā)生在NBA region。如果有任何#0延遲的assignment,那么這些assignment發(fā)生在Inactive region。(注意:#0延遲的RHS是在inactive region是算的)
- Inactive region進(jìn)行處理完所有active events后要評(píng)估的events。顯式的#0延遲控制要求將這個(gè)event安排到當(dāng)前time slot的inactive region進(jìn)行,以便在下一個(gè)inactive到active迭代中恢復(fù)process。
- NBA region進(jìn)行處理完所有inactive events后要評(píng)估的events。Nonblocking assignment會(huì)在當(dāng)前或以后仿真時(shí)間的NBA region中創(chuàng)建events。
Observed: Observed用于觸發(fā)property expressions(用于concurrent assertions)時(shí)對(duì)其求值。在property求值后,pass/fail的信息將在當(dāng)前time slot的Reactive region報(bào)告出來(lái)。
Reactive: Reactive包含了Re-active,Re-inactive和Re-NBA regions。
Re-active進(jìn)行當(dāng)前reactive region set的評(píng)估求值,并且可以以任何順序進(jìn)行處理。Program blocks的blocking assignments、#0 blocking assignments的RHS求值和nonblocking assignment的RHS求值發(fā)生在re-active region。另外,concurrent assertions的action blocks的代碼也是在re-active region調(diào)度的。Re-active region和active region其實(shí)是對(duì)偶關(guān)系的。只不過(guò)active處理design,re-active處理program。
Re-inactive進(jìn)行處理完所有re-active events后要評(píng)估的events。Program里顯示的#0延遲控制要求將這個(gè)event安排到當(dāng)前time slot的re-inactive region進(jìn)行,以便在下一個(gè)inactive到active迭代中恢復(fù)process。同樣的,它也是inactive region的對(duì)偶關(guān)系。
Re-NBA進(jìn)行處理完所有re-inactive events后要評(píng)估的events。Program里nonblocking assignment會(huì)在當(dāng)前或以后仿真時(shí)間的re-NBA region中創(chuàng)建events。
Postponed: postponed是當(dāng)前time slot的最后1個(gè)region。**monitor, **strobe和其它相似的events會(huì)安排在這個(gè)region執(zhí)行 (注意$display event是在active region和reactive region(如果在program里調(diào)用)執(zhí)行的)。一旦到達(dá)postponed region,就不允許在當(dāng)前time slot中發(fā)生新的值更改。在此region內(nèi),向任何net或variable進(jìn)行寫(xiě)入值或在當(dāng)前region調(diào)度任何先前region的event都是非法的。Postponed region PLI events也在這里調(diào)度。
在一個(gè)time slot里,除了上述介紹的simulation regions,還有PLI regions,在PLI regions里會(huì)去調(diào)度PLI callback。PLI regions有Preponed, Pre-Active, Pre-NBA, Post-NBA, Pre-Observed, Post-Observed, Pre-Re-NBA, Post-Re-NBA 和Pre-Postponed regions。它是圖1中的橢圓型部分。本文重點(diǎn)講述simulation regions,這里就不介紹PLI regions了。
6. SystemVerilog里的確定和不確定調(diào)度順序
以下場(chǎng)景必須有確定的調(diào)度順序:
begin-end塊中的語(yǔ)句應(yīng)該按照它們?cè)谠揵egin-end塊中出現(xiàn)的順序執(zhí)行??梢詴和L囟╞egin-end塊中語(yǔ)句的執(zhí)行,以利于模型中的其它進(jìn)程;但是在任何情況下,begin-end塊中的語(yǔ)句都不得以它們?cè)谠创a中出現(xiàn)的順序以外的任何順序執(zhí)行。
NBAs語(yǔ)句應(yīng)按照語(yǔ)句執(zhí)行的順序執(zhí)行。
舉個(gè)例子:
module test;
logic a;
initial begin
a <= 0;
a <= 1;
end
endmodule
當(dāng)執(zhí)行initial塊時(shí),將會(huì)有兩個(gè)event被添加到NBA region。前面的規(guī)則要求它們按照?qǐng)?zhí)行順序進(jìn)入event region,在連續(xù)的begin-end塊中,這是初始順序。該規(guī)則要求它們?nèi)BA region也按照這個(gè)順序執(zhí)行。因此,在仿真時(shí)間0結(jié)束時(shí),變量a將被賦值為0,然后賦值為1。
在以下場(chǎng)景時(shí),執(zhí)行的順序是不確定的:
Active events可以從active或re-active event region中取出,并以任何順序進(jìn)行處理。
過(guò)程塊(procedural block)中沒(méi)有時(shí)間控制結(jié)構(gòu)的語(yǔ)句不必作為一個(gè)event執(zhí)行。時(shí)間控制語(yǔ)句是指#expression和@expression結(jié)構(gòu)。在評(píng)估過(guò)程語(yǔ)句時(shí)的任何時(shí)候,仿真器都可以暫停執(zhí)行并將部分完成的事件作為待處理事件放置在event region中。 這樣做的效果是允許進(jìn)程執(zhí)行的交錯(cuò),盡管交錯(cuò)執(zhí)行的順序是不確定的并且不受用戶控制。
-
EDA工具
+關(guān)注
關(guān)注
4文章
264瀏覽量
31674 -
仿真器
+關(guān)注
關(guān)注
14文章
1014瀏覽量
83591 -
Verilog語(yǔ)言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8206 -
DUT
+關(guān)注
關(guān)注
0文章
189瀏覽量
12309 -
調(diào)度器
+關(guān)注
關(guān)注
0文章
98瀏覽量
5232
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論