最近在搭建乙個新專案的驗證環境,需要把ral模型的例子引入進來,正常操作就是reg_vip+adaptor在env中做個連線就行了,這樣直接操作reg_block,相應的讀寫行為也會在暫存器對應的匯流排上生效,但是這個專案中的特(s)殊(b)就特殊在暫存器的下發並不是由驗證元件直接來驅動的而是經過如下階段:
dut正常是由c型別匯流排(以下簡稱c匯流排)來進行驅動,c匯流排是乙個很簡單的4線協議,大概需要2周就可以開發完畢乙個bfm,奈何我接手的時候已經沒有給我時間開發驗證vip了,所以需要沿用舊專案的暫存器配置方案,舊配置方案是:
由s_vseq產生符合a協議的匯流排協議
b模組將a協議轉換成c協議
c協議對應的模組嚴格來說是乙個rtl模組,當我需要對dut的x位址寫入資料y的時候,我需要
通過s_vseq下發乙個寫位址x到特定暫存器的操作
通過s_vseq下發乙個寫資料y到特定暫存器的操作
通過s_vseq下發乙個寫資料的長度到特定暫存器
通過s_vseq下發乙個send指令到特定暫存器
這樣的話,s_vseq對dut去寫乙個資料,至少要經過s協議進行4次暫存器配置,在舊的驗證環境中這個write操作已經封裝成task來實現了,包括single-wr/rd,連續-wr/rd
但是如此一來ral模型是沒辦法直接和c協議對應的agent來繫結的,於是有如下方案,兜個圈子來實現ral模型的巢狀實現
新加乙個virtual agent,並且將ral模型與v-agent進行繫結,該trans包括addr、data、type,正常傳送讀寫資料報,最終資料報會在virtual_driver**現,但是driver中不用做任何匯流排驅動的事情,直接將trans送給env_cfg.req_fifo,req_fifo是在env_cfg中定義的乙個快取佇列,這個佇列在base_vseq中也可以被看到(因為env_cfg通過config_db已經set過去了)
在base_vseq中新增乙個fork join_none的執行緒,通過子類的seq呼叫super.body()來保證持續運轉,將收到的trans通過之前封裝好的write函式傳送出去,也就是說,每乙個trans最終會對應4筆暫存器操作,無論讀寫,都需要在這4筆暫存器操作結束之後,再返回乙個rsp_trans,通過req_fifo通道,driver拿到rsp之後,再進行item_done,如果是讀報文,還要進行put_response操作,這樣一來,ral模型就可以通過非驗證**的ip傳送出去了,核心還是在於reg_adaptor到底和哪個agent去做繫結,再就是如果判斷寫操作什麼時候算是真正完成了,因為virtual_driver傳送寫資料後,還會有4筆對應的操作,如果連續發寫,c模組是不支援連續寫的
IP位址的另一種形式 一種隱藏IP的方法
ip位址的另一種形式 192.168.1.1這種ip位址格式是在熟悉不過的了,但要是有人讓你訪問他的 時卻給你http 0x3d9b5f51這樣的位址你是不是感到很疑惑?那麼下面就讓我來教 你這麼把61.155.95.81轉換成上面的那種格式.首先把61.155.95.81按 分成4部分,分別是61...
c 迴圈包含一種解決方法
上次在乙個設計當中遇到a類呼叫b類,b類又呼叫a類的問題,由於迴圈包含搞了半天,後來覺得還是將其用介面方式實現好一些,也就是將會被別人呼叫的方法寫成抽象類放在乙個公共檔案中,包含的時候都使用抽象介面,如下面的例子 先設計乙個公共包含的x.h ifndef x h define x h class a...
遠端工作或將成為一種常態
遠端工作會成為一種常態嗎?只有時間會證明一切,但是在疫情期間,具有遠端工作能力通常會決定企業的成敗,那些沒有為此及時做出轉變的企業通常會落後於人。毫無疑問,在全球各地蔓延的新冠病毒疫情使遠端工作的發展走上了快車道。而在這條快速通道上,的使用量激增,並且沒有任何放緩的跡象。很多企業別無選擇,只能讓員工...