本文移植於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
發表留言