暫存器(RAL)模型中的後門操作路徑

2021-10-01 12:22:41 字數 1580 閱讀 4172

我們在進行暫存器模型的後門操作時,必須提前設定後門操作路徑,以此ral模型方能進行操作。

在上面這個ral 模型中,當呼叫reg_blk.reg1.write(*),引數指定是後門操作(uvm_backdoor),那麼ral模型時如何取得硬體rtl的絕對路徑?

核心的方法是呼叫reg::get_full_hdl_path,下面來討論一下,首先reg

的rtl路徑有兩部分組成,分別是(1)uvm_reg_block的基路徑(我們叫做reg的base_path)(2)reg本身自己的相對路徑(我們叫做reg的offset_path)。

首先是reg的base_path:這個path定義在reg所在的block中(也叫做block的路徑),設定block的路徑的方式有兩種(uvm_reg_block中有兩個變數用來存放block的路徑)

(1) uvm_object_string_pool #(uvm_queue#(string)) hdl_paths_pool

(2) string root_hdl_paths[string]

其中對於hdl_paths_pool,形象的表示如下

當呼叫reg_blk.add_hdl_path(path)時會增加乙個路徑,如果呼叫4次,則會增加4次路徑,如上圖所示

對於root_hdl_paths,呼叫reg_blk.set_hdl_path_root(root_path)來設定路徑

那麼最終block的路徑是什麼,答案是如果設定了root path,那麼就是這個root path,如果沒有設定,那麼就是hdl_paths_pool中的值(在實際使用過程中只會add一次,這裡假設是path1),其實這裡的path1只是這個block的相對位址,怎麼得到這個block的絕對位址呢,hier的概念,那麼就是 parent_block的路徑加上自身設定的路徑。這裡預設圖中是block是root block。

那麼reg1的路徑是什麼。首先base_path=path1(block的絕對路徑),offset_ path是什麼呢。在reg中,有乙個變數叫做

uvm_object_string_pool#(uvm_queue#(uvm_hdl_path_concat)) m_hdl_paths_pool
這個變數用來儲存reg自身設定的相對路徑。

通過呼叫add_hdl_path_slice設定了相對路徑path_offset。

這個時候這個reg的絕對 rtl 路徑是base_path+offset_path。

舉個例子:

在上圖中

reg_blk.add_hdl_path("tb");reg1.add_hdl_path_splice("reg_boot");

最終這個reg的絕對路徑是tb.reg_boot(實際硬體中路徑)。

暫存器(RAL)模型中的predict操作

在暫存器模型中,比如讀寫操作,我們是怎麼進行 的,也就是說怎麼更新field的3個值得,即value,mirror value,desired value。核心方法是do predict。我們發現在後門訪問時,會自動呼叫do predict方法進行 而在前門訪問時,是否會進行 是有條件的,必須得設定...

對暫存器的操作

接觸了一陣子的stm32函式庫,使用起來挺方便的,但是很少有處理器會有函式庫,大部分情況下還是要自己來對暫存器進行操作,所以還是不要生疏了對暫存器的操作。對暫存器的操作有時候要考慮對其不同的位進行先後順序不同的設定,因為這樣可能達不到預期的效果,這個不太好總結,但是對暫存器操作的方法是固定的。在這之...

UVM暫存器篇之五 暫存器模型的整合(下)

本文 前門訪問 利用暫存器模型,我們可以更方便地對暫存器做操作。接下來我們分別兩種訪問暫存器的方式,即前門訪問 front door 和後門訪問 back door 前門訪問,顧名思義指的是在暫存器模型上做的讀寫操作,最終會通過匯流排uvc來實現匯流排上的物理時序訪問,因此是真實的物理操作 而後門訪...