[IC驗證] 如何在UVM上實現 polymorphic interfaces, parameterized interface with interface proxy 範例程式

本文移植於tutortecho 2020年6月6日 撰寫

如何在 systemverilog interface中加入多形(polynorphic)

How to use polymorphic on interface (systemverilog)

如何使用interface代理來傳遞遇有參數的interface

How to passing parameterized interfaces by interface proxy

如何使用固定的 uvm_driver 實現多種 interface

How to use a template uvm_driver with different interface

我訂下許多關鍵字就是為了讓大家可以更容易找到這間文章

因為我當時要找相關資料實在太難找了

而方法就是在 interface 中定義一個繼承許多抽象方法的class

透過在上層中傳遞class instance的方式可以將具有參數的interface傳遞至uvm_driver底層

因此可以只使用單一 uvm_driver 模板來實現 interface多形的設計

在下面的程式碼將會更詳細說明

abstrat_c.sv

先定義一個抽象類別具有多個 virtual function 作為存取訊號用到的 funciton

我們必須要定義這個 class 要不然 uvm_driver 會因為 scope 問題無法使用 function

test_if.sv

在 interface 中定義一個class extend abstract_c

並創造其實體 inst 以及一個 funtion get_inst

目的是為了讓我們在外界可以透過這個funciton得到物件

藉由得到的物件來使用多形

top.sv

我們在上頭說的傳遞class就是在這裡

uvm_config_db#(uvm_object)::set(……., intf.get_inst);

我們使用 base datatype uvm_object 來當作 config_db 的型態

將 interface 中的 class放到了對應driver database

請注意這三個driver都是同一種

但是卻傳了三個不同(parameter)的interface給他們

test_driver.sv

這裡需要注意我們創了一個 abstract_c api

將class instance 從 config 拿到後透過 downcast 得到了使用 virtual funciton 的權力

藉由在 run_phase 呼叫 virtual funciton 即可存取(不同的) inteface 的能力

透過 class method 來存取 interface 的設計即為 class proxy

以下附上(對熟練UVM的人)剩下不重要的程式碼

這三個放在同一個檔案 test.sv

abs_pkg.sv 自己key

#polynorphic #systemverilog #interface #class_proxy #parameterized_interfaces


發表留言