| |
Connect/VirtInterfaceConfigPkg
Setting Virtual Interface Properties in the Tesbench using a Package
使用config_db API向test class提供虚拟接口信息的替代方法是使用package。建议的方法是使用test parameters package。另一种不推荐但在工业上使用的方法是使用agent package。本文将重点介绍推荐的方法。
Using the Test Parameters Package
这种将实际接口引用分配给测试平台内部的虚拟接口句柄的方法与使用config_db API的推荐方法非常相似。它是相同的,因为test class使用配置对象和配置数据库来分发虚拟接口。它的不同之处在于,package用于将虚拟接口句柄传递给test class,而不是使用config_db API。
缺点是这种方法是它不能与协议模块一起使用,这意味着这种方法不能轻易支持emulation。
这种方法一般有4个步骤。
1.虚拟接口在package中声明。 建议此包是test parameters package。
2.在包含DUT和接口实例的顶层模块中,对package中的虚拟接口进行分配以指向接口实例【意思是将接口实例分配给package中的虚拟接口】。
3.Test class从package中获取虚拟接口信息,并将虚拟接口分配到配置对象中,该配置对象分发到通过该特定接口与DUT通信的适当组件(agents, drivers, monitors等)中。
4.通过虚拟接口实际访问DUT的组件将从提供的配置对象中的虚拟接口设置其虚拟接口属性。
这里有一个讨论,为什么人们会采用test class的方法来获取信息并将信息分发给agents和事务传输器,而不是让事务传输器或agent直接获取数据。
【此处需一幅图】
Declaring Virtual Interface in the Test Parameters Package
在test parameters package中声明一个虚拟接口指针。
package test_params_pkg;
import uvm_pkg::*;
// WISHBONE bus virtual interface
virtual wishbone_bus_syscon_if v_wb_bus_if;
...
endpackage
Assign Virtual Interface in the Test Parameters Package
在包含DUT和接口实例的顶层模块中,在初始块中进行分配,以将test parameters package中的虚拟接口指向接口实例【意思是把顶层模块中实例化后的接口实例赋给package中的这个虚拟接口】。可以导入或显式引用虚拟接口属性。
module top_mac;
...
import test_params_pkg::*;
// WISHBONE interface instance
// Supports up to 8 masters and up to 8 slaves
wishbone_bus_syscon_if wb_bus_if();
...
initial begin
//set WISHBONE virtual interface in test_params_pkg
v_wb_bus_if = wb_bus_if;
run_test("test_mac_simple_duplex"); // create and start running test
end
endmodule
Making the Virtual Interface available in the Testbench
test class创建一个具有虚拟接口属性的配置对象。然后,它用test parameters package中的虚拟接口来分配此属性。
然后,test class将配置对象放入配置数据库【即将配置对象类通过config_db传到agent或driver或monitor】,以便为通过该特定接口与DUT通信的特定组件(agents, drivers, monitors等)提供访问。
class test_mac_simple_duplex extends uvm_test;
...
wb_config wb_config_0; // config object for WISHBONE BUS
...
function void set_wishbone_config_params();
//set configuration info
wb_config_0 = new();
// Set WISHBONE bus virtual interface in config obj to virtual interface in test_params_pkg
wb_config_0.v_wb_bus_if = v_wb_bus_if;
...
uvm_config_db#(wb_config)::set(this, "*", "wb_config", wb_config_0); // put in config
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
set_wishbone_config_params();
...
endfunction : build_phase
endclass
Setting Virtual Interface Property in Transactor
通过虚拟接口实际访问DUT的组件将从提供的配置对象中的虚拟接口属性设置其虚拟接口属性。
// WISHBONE master driver
class wb_m_bus_driver extends uvm_driver #(wb_txn, wb_txn);
...
virtual wishbone_bus_syscon_if m_v_wb_bus_if; // Virtual Interface
wb_config m_config;
...
function void build_phase(uvm_phase phase);
super.build_phase(phase);
if (!uvm_config_db #(wb_config)::get(this, "", "wb_config", m_config)) // get config object
`uvm_fatal("Config Fatal", "Can't get the wb_config")
...
endfunction : build_phase
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
m_v_wb_bus_if = m_config.v_wb_bus_if; // set local virtual if property
endfunction : connect_phase
...
endclass
(在http://verificationacademy.com/uvm-ovm上在线下载源代码示例)。