背景
基于SystemVerilog的驗(yàn)證引入了接口的概念來表示設(shè)計(jì)模塊之間的通信。在其最基本的形式中,SystemVerilog 接口只是一個(gè)命名的信號(hào)束,可以通過模塊端口作為單個(gè)項(xiàng)目進(jìn)行通信。然后,接收此接口的設(shè)計(jì)模塊可以通過此接口參考訪問信號(hào)。但是,接口的更高級(jí)別函數(shù)也可以提供更強(qiáng)類型的通信,以更好地表示設(shè)計(jì)意圖。以下是系統(tǒng)Verilog接口中可用的高階函數(shù)的子集:
可以通過使用時(shí)鐘塊和模塊端口在信號(hào)列表上執(zhí)行訪問規(guī)則
函數(shù)和任務(wù)可用于封裝高階排序或訪問控制
初始?jí)K和始終塊等進(jìn)程可以添加功能
連續(xù)賦值語句還可以添加功能
斷言可以確保正確的集成
SystemVerilog 接口的一個(gè)非常重要的用途是將靜態(tài)設(shè)計(jì)元素連接到動(dòng)態(tài)測(cè)試平臺(tái)元素。動(dòng)態(tài)測(cè)試平臺(tái)元素需要訪問靜態(tài)設(shè)計(jì)元素才能采樣和驅(qū)動(dòng)信號(hào),但可重用的測(cè)試平臺(tái)元素?zé)o法訪問靜態(tài)設(shè)計(jì)元素,除非通過稱為虛擬接口的特殊構(gòu)造。虛擬接口是測(cè)試平臺(tái)代碼中的接口句柄,可以與接口實(shí)例一起分配。虛擬接口是動(dòng)態(tài)屬性,可以分配給不同測(cè)試平臺(tái)中的不同接口實(shí)例,從而提高可重用性。
設(shè)計(jì)可重用設(shè)計(jì)塊的常用技術(shù)是使用參數(shù)使設(shè)計(jì)塊的不同實(shí)例具有獨(dú)特的特征。例如,可以對(duì)模塊進(jìn)行參數(shù)化,以允許在聲明模塊并提供參數(shù)值時(shí)定義數(shù)據(jù)總線寬度。SystemVerilog 接口也支持參數(shù)化,但參數(shù)化接口的使用在測(cè)試平臺(tái)端帶來了不可預(yù)見的復(fù)雜性。為了與賦值兼容,參數(shù)化虛擬接口必須專用于接口實(shí)例專用的相同值。除非采取預(yù)防措施,否則這可能會(huì)使一些非常丑陋的測(cè)試平臺(tái)代碼具有更丑陋的使用模型。
參數(shù)擴(kuò)散:蠻力法
參數(shù)化虛擬接口引入的問題是,訪問它的測(cè)試平臺(tái)元素必須知道強(qiáng)類型接口。因此,當(dāng)接口專用化尚未知時(shí),無法編寫泛型類以使用參數(shù)化虛擬接口。此問題的一個(gè)解決方案是參數(shù)化訪問參數(shù)化虛擬接口的類。例如,可以使用 UVM 驅(qū)動(dòng)程序必須使用的虛擬接口類型進(jìn)行參數(shù)化。然而,這只是將問題向上移動(dòng)了一層,因?yàn)楝F(xiàn)在實(shí)例化該參數(shù)化驅(qū)動(dòng)程序的代理也必須參數(shù)化,以便它可以創(chuàng)建驅(qū)動(dòng)程序的正確專用實(shí)例。這會(huì)不斷向上移動(dòng),直到您到達(dá)“知道”正在測(cè)試的特定專業(yè)化存在的頂層測(cè)試平臺(tái)組件。以下代碼段演示了此問題。
首先,我們定義參數(shù)化的虛擬接口:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
接下來,我們定義可重復(fù)使用的 VIP 代碼。此測(cè)試平臺(tái)代碼必須設(shè)計(jì)為可在參數(shù)化接口可以使用的任何環(huán)境中重用,因此還必須參數(shù)化VIP代碼本身,以便可以訪問正確的接口。以下代碼段演示必須如何參數(shù)化 UVM 驅(qū)動(dòng)程序類和包含該驅(qū)動(dòng)程序的代理:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//=======================================================================class param_driver#(type vif_t=param_vif) extends uvm_driver#(cust_data);`uvm_component_param_utils(param_driver#(vif_t))vif_t vif;function void build_phase(uvm_phase phase);if (!uvm_config_db#(vif_t)::get(this, "", "vif", vif))`uvm_fatal("build", "A valid interface was not received.");endfunctionendclass//=======================================================================class cust_agent#(type vif_t=param_vif) extends uvm_agent;`uvm_component_param_utils(param_agent#(vif_t))vif_t vif;param_driver#(vif_t) param_driver;function void build_phase(uvm_phase phase);if (!uvm_config_db#(vif_t)::get(this, "", "vif", vif))`uvm_fatal("build", "A valid interface was not received.");uvm_config_db#(vif_t)::set(this, "param_driver", "vif", vif);param_driver = param_driver#(vif_t)::type_id::create("param_driver", this);endfunctionendclass |
到目前為止,這看起來還不錯(cuò)!它給類定義增加了一點(diǎn)復(fù)雜性,但不會(huì)太多。然而,在你檢查測(cè)試平臺(tái)必須如何訪問這些參數(shù)化類之前,這些問題不會(huì)變得明顯。以下段顯示了測(cè)試如何根據(jù)接口的參數(shù)化方式唯一地訪問 VIP 的每個(gè)實(shí)例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
//=======================================================================class cust_test extends uvm_test;`uvm_component_utils(cust_test)param_agent#(virtual param_if#(8)) param_agent8;param_agent#(virtual param_if#(16)) param_agent16;param_agent#(virtual param_if#(32)) param_agent32;virtual function void build_phase(uvm_phase phase);param_agent8 = param_agent#(virtual param_if#(8))::type_id::create("param_agent8", this);param_agent16 = param_agent#(virtual param_if#(16))::type_id::create("param_agent16", this);param_agent32 = param_agent#(virtual param_if#(32))::type_id::create("param_agent32", this);endfunctionendclass//=======================================================================module test_top;param_if#(8) if8();param_if#(16) if16();param_if#(32) if32();initial beginuvm_config_db#(virtual param_if#(8))::set(uvm_root::get(), "uvm_test_top.param_agent8", "vif", if8);uvm_config_db#(virtual param_if#(16))::set(uvm_root::get(), "uvm_test_top.param_agent16", "vif", if16);uvm_config_db#(virtual param_if#(32))::set(uvm_root::get(), "uvm_test_top.param_agent32", "vif", if32);run_test("cust_test");endendmodule |
如您所見,對(duì) VIP 的每個(gè)引用都必須使用要使用的正確接口類型進(jìn)行參數(shù)化。這不僅會(huì)影響VIP建設(shè),還會(huì)影響回調(diào)注冊(cè)、工廠覆蓋等。這給測(cè)試平臺(tái)開發(fā)人員帶來了很大的負(fù)擔(dān),并限制了這些環(huán)境的可重用性。
向驗(yàn)證組件添加參數(shù)是可重用VIP的有效技術(shù)解決方案,但它使使用模型大大復(fù)雜化,并限制了測(cè)試平臺(tái)的可重用性。
審核編輯:郭婷
-
接口
+關(guān)注
關(guān)注
33文章
9603瀏覽量
157678 -
Verilog
+關(guān)注
關(guān)注
31文章
1374瀏覽量
114737 -
UVM
+關(guān)注
關(guān)注
0文章
183瀏覽量
20108
發(fā)布評(píng)論請(qǐng)先 登錄
保護(hù)您的 IP 核——第一部分軟 IP——前言
免調(diào)節(jié)中頻VCO的實(shí)現(xiàn)(第一部分)
射頻識(shí)別基礎(chǔ):第一部分
中國(guó)NB-IOT產(chǎn)業(yè)聯(lián)盟-第一部分問題清單-20160824
2012年P(guān)SoC數(shù)?;旌显O(shè)計(jì)培訓(xùn)_第一部分
怎樣通過Altera 的設(shè)計(jì)商店找到并使用實(shí)例設(shè)計(jì) (第一部分)
第一部分、硬件設(shè)計(jì)
參數(shù)化接口和可重用VIP:第三部分
差分驅(qū)動(dòng)ADC 第一部分
參數(shù)化接口和可重用VIP:第一部分
評(píng)論