標(biāo)準(zhǔn)驗(yàn)證環(huán)境與處理器驗(yàn)證的代碼實(shí)現(xiàn)(一)
背景:
標(biāo)準(zhǔn)的UVM驗(yàn)證環(huán)境其實(shí)在各個(gè)用戶實(shí)現(xiàn)過(guò)程中也不標(biāo)準(zhǔn),這里只是提供一套相對(duì)容易復(fù)用的環(huán)境實(shí)現(xiàn)模板,后面可能會(huì)考慮采用腳本進(jìn)行實(shí)現(xiàn)。
另外,處理器驗(yàn)證和一般的電路模塊驗(yàn)證也有很大區(qū)別。這個(gè)專欄也會(huì)根據(jù)這些差異點(diǎn),做一些差異原因與處理方案的描述,內(nèi)容十分基礎(chǔ),有待深入討論。
這里先介紹一下agent與sequence
Agent:
Agent模塊,代理各個(gè)重要模塊。常見(jiàn)的“重要模塊”就是sequence、sequencer、driver、monitor,另外interface的連接也可以在agent中完成。
Agent的功能原本可以在env中實(shí)現(xiàn),但是會(huì)導(dǎo)致復(fù)用性變差,這一點(diǎn)會(huì)在后續(xù)env里解釋。
agent中實(shí)例化了sequencer、driver、monitor,以及一個(gè)或數(shù)個(gè)interface
在build phase階段,需要將這些模塊注冊(cè)到factory中:
根據(jù)當(dāng)前agent是否為active,決定是否注冊(cè)sqr與drv
passive mod只啟用mon,不發(fā)送激勵(lì)
drv和mon需要的interface也在這里采用config_db傳遞(傳空也無(wú)妨)
active mod下,在connect phase中將drv的port連接到sqr的export上
sequence
sequence中可以對(duì)不同類型的激勵(lì)進(jìn)行管理、配置,建議從base_seq寫(xiě)起,實(shí)現(xiàn)基礎(chǔ)的配置功能,然后再繼承到各個(gè)子類sequence中,進(jìn)行特殊功能的實(shí)現(xiàn)。
phase的objection一般建議在sequence中實(shí)現(xiàn),這里放在了pre_body和post_body中進(jìn)行raise與drop;
sequence是一個(gè)object,而非component,需要掛載到sqr上傳遞給drv,一般在main_phase中進(jìn)行這個(gè)傳遞過(guò)程;
seq的body中實(shí)現(xiàn)transaction的配置與打包,trans一般就是UVM中激勵(lì)傳輸?shù)臉?biāo)準(zhǔn)粒度(當(dāng)然也可以直接做點(diǎn)對(duì)點(diǎn)的信號(hào)傳輸,適合激勵(lì)量較少的情況)
driver
driver的目的是獲取sequence,解包transaction,并將解包結(jié)果傳遞給DUT,這一過(guò)程一般通過(guò)直接對(duì)interface上的信號(hào)賦值實(shí)現(xiàn)。
一般激勵(lì)過(guò)程會(huì)在drv的main_phase中進(jìn)行,這也是個(gè)經(jīng)典問(wèn)題“什么時(shí)候用main_phase,什么時(shí)候用run_phase”,main_phase是可以重新跳轉(zhuǎn)回reset_phase的,而run_phase則與之并行。在需要DUT運(yùn)行過(guò)程中重啟的情況中,main_phase -> reset_phase是一個(gè)十分有利于維護(hù)的跳轉(zhuǎn)實(shí)現(xiàn)方案。
DUT不同,drv的實(shí)現(xiàn)方式也會(huì)有很大的差異,這里只給了一個(gè)極簡(jiǎn)的參考,不用被這個(gè)方案束縛。
處理器驗(yàn)證的差異點(diǎn)
其實(shí)沒(méi)有用到sqr->drv的傳輸,driver的目的是主動(dòng)發(fā)起transaction的獲取請(qǐng)求,并進(jìn)行解包。這一過(guò)程會(huì)不斷循環(huán),以模擬對(duì)DUT不斷傳輸?shù)妮斎胄盘?hào)。
而處理器驗(yàn)證的情況與上述過(guò)程存在一定差異。
首先是激勵(lì)的傳入,處理器的輸入通常不是實(shí)時(shí)的,而是在一開(kāi)始就準(zhǔn)備好的一段指令流。這段指令流可以是特定的手寫(xiě)匯編碼,也可以是隨機(jī)指令生成器產(chǎn)生的一段指令流,通過(guò)DUT的取指通路傳入到處理器當(dāng)中進(jìn)行操作。個(gè)人理解,現(xiàn)在的處理器通常是亂序、并行執(zhí)行的,且CPU也是從DDR通過(guò)cache讀取一長(zhǎng)段指令流,以減少交互次數(shù),所以按單筆指令進(jìn)行激勵(lì)的驗(yàn)證方式就顯得十分突兀,無(wú)法模擬出正常的行為。
另外,指令流的傳輸并不需要借助interface逐個(gè)賦值,通常是寫(xiě)到DDR或者cache的memory模型中,一般采用文本交互。文本交互的時(shí)間、資源消耗是不低的,頻繁進(jìn)行文本交互無(wú)疑會(huì)大幅拖慢仿真。
綜上,處理器的激勵(lì)一般是不需要drv這個(gè)永動(dòng)機(jī)來(lái)驅(qū)動(dòng)的,而是在初始化階段完成的,drv在這樣的驗(yàn)證環(huán)境中就顯得可有可無(wú)了。