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

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

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

前門訪問

利用暫存器模型,我們可以更方便地對暫存器做操作。接下來我們分別兩種訪問暫存器的方式,即前門訪問(front-door)和後門訪問(back-door)。前門訪問,顧名思義指的是在暫存器模型上做的讀寫操作,最終會通過匯流排UVC來實現總線上的物理時序訪問,因此是真實的物理操作;而後門訪問,指的是利用UVM DPI (uvm_hdl_read()、uvm_hdl_deposit()),將暫存器的操作直接作用到DUT內的暫存器變數,而不通過物理匯流排訪問。

 

下面給出一段進行前門訪問的例碼。下面的這個sequence,繼承於uvm_reg_sequence,其除了具備一般uvm_sequence的預定義方法外,還具有跟暫存器操作相關的方法。下面對暫存器操作的例碼中,使用者可以看到兩種方式:

  • 第一種即uvm_reg::read()/write()。在傳遞時,使用者需要注意將引數path指定為UVM_FRONTDOOR。uvm_reg::read()/write()方法可傳入的引數較多,除了status和value兩個引數需要傳入,其它引數如果不指定,可採用預設值。

  • 第二種即uvm_reg_sequence::read_reg()/write_reg()。在使用時,也需要將path指定為UVM_FRONTDOOR。

 

 

 

 

後門訪問

在進行後門訪問時,使用者首先需要確保暫存器模型在建立時,是否將各個暫存器對映到了DUT一側的HDL路徑。下面的例碼即實現了暫存器模型與DUT各個暫存器的對映:

 

 

 

例碼中通過uvm_reg_block::add_hdl_path(),將暫存器模型關聯到了DUT一端,而通過uvm_reg::add_hdl_path_slice完成了將暫存器模型各個暫存器成員與HDL一側的地址對映。例如在稍後對暫存器SLV0_RW_REG進行後門訪問時,UVM DPI函式會通過暫存器HDL路徑“reg_backdoor_access.dut.regs[0]”對映到正確的暫存器位置,繼而對其進行讀值或者修改。另外,暫存器模型build()函式最後一句,以lock_model()結尾,該函式的功能是結束地址對映關係,並且保證模型不會被其它使用者修改。

在暫存器模型完成了HDL路徑對映後,我們才可以利用uvm_reg或者uvm_reg_sequence自帶的方法進行後門訪問,下面仍然給出一段後門訪問的例碼。類似於前門訪問,後門訪問也有幾類方法提供:

  • uvm_reg::read()/write(),在呼叫該方法時需要註明UVM_BACKDOOR的訪問方式。

  • uvm_reg_sequence::read_reg()/write_reg(),在使用時也需要註明UVM_BACKDOOR的訪問方式。

  • 另外,uvm_reg::peek()/poke()兩個方法,也分別對應了讀取暫存器(peek)和修改暫存器(poke)兩種操作,而使用者無需指定訪問方式尾UVM_BACKDOOR,因為這兩個方法本來就只針對於後門訪問。

 

 

 

 

前門訪問和後門訪問的比較

下面的表總結了前門訪問和後門訪問的主要差別:

 

 

從上面的差別可以看出,後門訪問較前門訪問更便捷一些更快一些,但如果單純依賴後門訪問也不能稱之為“正道”。實際上,利用暫存器模型的前門和後門訪問兩種混合方式,對暫存器驗證的完備性更有幫助。下面給出一些實際應用的場景:

  • 通過前門訪問的方式,先驗證暫存器訪問的物理通路工作正常,並且有專門的暫存器測試的前門訪問用例,來遍歷所有的暫存器。在前門訪問被驗證充分的前提下,可以在後續測試中使用後門訪問來節省訪問多個暫存器的時間。

  • 如果DUT實現了一些特殊暫存器,例如只能寫一次的暫存器等,我們建議用物理方式去訪問以保證反映真實的硬體行為。

  • 暫存器隨機設定的精髓不在於隨機可設定的域值,而是為了考慮日常不可預期的場景,先通過後門訪問隨機化整個暫存器列表(在一定的隨機限制下),隨後再通過前門訪問來配置暫存器。這麼做的好處在於,不再只是通過設定復位之後的暫存器這種更有確定性的場景,而是通過讓測試序列一開始的暫存器值都隨機化來模擬無法預期的硬體配置前場景,而在稍後設定了必要的暫存器之後,再來看是否會有意想不到的邊界情況發生。

  • 有的時候,即便通過先寫再讀的方式來測試一個暫存器,也可能存在地址不匹配的情況。譬如暫存器A地址本應該0x10,暫存器B地址本應該為0x20;而在硬體實現用,暫存器A對應的地址位0x20,暫存器B對應的地址位0x10。像這種錯誤,即便通過先寫再讀的方式也無法有效測試出來,那麼不妨在通過前門配置暫存器A之後,再通過後門訪問來判斷HDL地址對映的暫存器A變數值是否改變,最後通過前門訪問來讀取暫存器A的值。上述的方式是在之前前門測試的基礎之上又加入了中途的後門訪問和數值比較,可以解決地址對映到內部錯誤暫存器的問題。

  • 對於一些狀態暫存器,在一些時候外界的激勵條件修改會依賴這些狀態暫存器,並且在時序上的要求也可能很嚴格。例如,上面MCDF的暫存器中有一組狀態暫存器表示各個channel中FIFO的餘量,而channel中FIFO的餘量對於激勵驅動的行為也很重要。無論是前門訪問還是後門訪問,都可能無法第一時間反映FIFO在當前時刻的餘量。因此對於需要要求更嚴格的測試場景,除了需要前門和後門來訪問暫存器,也需要對映一些重要的訊號來反映第一時間的資訊。