1. 程式人生 > >UVM暫存器篇之四:暫存器模型的整合(中)

UVM暫存器篇之四:暫存器模型的整合(中)

本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266221.html

MCDF暫存器模組程式碼

下面我們給出實現後的MCDF暫存器RTL設計程式碼:

 

 

上面的設計中採取了巨集的方式來替代一些暫存器的序列號和地址,這些巨集在稍後的暫存器模型在對映硬體暫存器路徑上也使用了。這麼做使得設計和驗證都因為採用同一套巨集,而在後期暫存器地址、位置等修改時,更易維護環境,保持設計和驗證兩側的一致,同時採用巨集(或者parameter)的可讀性也更好。

 

Adapter實現

在具備了MCDF匯流排UVC之後,需要實現adapter。每一個匯流排對應的adapter所完成的橋接功能即是在uvm_reg_bus_op(暫存器操作transaction)和具體匯流排的transaction(這裡指mcdf_bus_trans)之間的轉換。uvm_reg_adapter類以及通過稍後的adapter整合,使得使用者在開發某一個匯流排adapter型別時,只需要下面幾點:

  • uvm_reg_bus_op與匯流排transaction中各自的資料對映。

  • 實現reg2bus()和bus2reg()兩個函式,這兩個函式即實現了不同transaction之間的資料對映。

  • 如果匯流排支援byte訪問,可以使能supports_byte_enable;如果匯流排UVC要返回response資料,則應當使能provides_responses。在本例中,mcdf_bus_driver在讀數時會將讀回的資料填入到RSP並返回至sequencer,因此需要在adapter中使能provides_responses。由此使得bus2reg()函式呼叫時得到的資料是匯流排返回時的transaction,但讀者需要注意如果匯流排UVC不支援返回RSP(沒有呼叫put_response(RSP)或者item_done(RSP)),那麼不應置此位,否則adapter將會使得驗證環境掛起。預設情況下,上述的兩個成員的復位值都是0。

 

uvm_reg_bus_op型別的成員包含下面6個域:

 

從下面給出的MCDF橋接類reg2mcdf_adapter的實現來看,在構建函式中使能了provide_responses,這是因為mcdf_bus_driver在發起匯流排訪問之後會將RSP一併返回至sequencer。reg2bus()完成的橋接場景是,如果使用者在暫存器級別做了操作,那麼暫存器級別操作的資訊uvm_reg_bus_op會被記錄並系統會呼叫uvm_reg_adapter::reg2bus()函式。在完成了將uvm_reg_bus_op中的資訊對映到mcdf_bus_trans之後,函式將mcdf_bus_trans例項返回。而在後臺,返回了mcdf_bus_trans之後,該例項將通過mcdf_bus_sequencer傳入到mcdf_bus_driver。這裡的transaction傳輸是後臺隱式呼叫的,不需要讀者自己發起。而暫存器無論讀寫,都應當知道匯流排操作後的狀態返回,對於讀操作時,也需要知道匯流排返回的讀資料,因此uvm_reg_adapter::bus2reg()即是從mcdf_bus_driver()將資料寫回至mcdf_bus_sequencer,而一直保持監聽的reg2mcdf_adapter一旦從sequencer獲取了RSP(mcdf_bus_trans)之後,就將自動呼叫bus2reg()函式。該函式的功能與reg2bus()相反,完成了從mcdf_bus_trans到uvm_reg_bus_op的內容對映。在完成對映之後,更新後的uvm_reg_bus_op資料最終返回至暫存器操作場景層。對於暫存器操作,無論讀操作還是寫操作,都需要經歷呼叫reg2bus(),繼而發起匯流排事務,而在完成事務發回反饋之後,又需要呼叫bus2reg(),將匯流排的資料返回至暫存器操作層面。
 

 

 

 

Adapter整合

在具備了暫存器模型mcdf_rgm、MCDF匯流排UVC mcdf_bus_agent和橋接reg2mcdf_adapter之後,就需要考慮到整合到驗證環境中去了。下面給出了adapter整合例碼。在這段例碼中,讀者需要注意下面幾點:

  • 對於mcdf_rgm的整合,我們傾向於從頂層傳遞的方式,即最終從test層傳入暫存器模型控制代碼。這種方式有利於驗證環境mcdf_bus_env的閉合性,在後期不同test如果要對rgm做不同的配置,都可以在頂層例化,而後通過uvm_config_db來傳遞。

  • 暫存器模型在建立之後,還需要顯式呼叫build()函式。需要注意uvm_reg_block是uvm_object型別,因此其預定義的build()函式並不會自動執行,還需要單獨呼叫。

  • 在還未整合predictor之前,我們採用了auto prediction的方式,因此呼叫了函式set_auto_predict()。關於prediction的幾種方式我們將在下一節《暫存器模型的常規方法》中詳細介紹。

  • 在頂層環境的connect階段中,需要將暫存器模型的map元件與bus sequencer和adapter連線。這麼做的必要性即在於將map(暫存器資訊)、sequencer(匯流排側激勵驅動)和adapter(暫存器級別和硬體匯流排級別的橋接)關聯在一起。也只有通過這一部,adapter的橋接功能才可以工作。