| |
Config/Params Package
当参数化DUT和/或接口时,参数值也几乎总是在测试平台中使用。不应在实例化中使用直接文字值指定这些参数。而是在package中定义命名参数值,并在DUT端和设计的测试平台端使用命名值。
这有助于避免在一方改变而另一方没有改变时的错误。或者,如果测试配置参数是DUT参数的某个函数,则在进行更改时可能会出现计算错误。
请注意,此package不适用于所有测试参数。如果您具有DUT未使用的特定于test的参数,则应在test中直接设置这些值。DUT参数包应仅用于DUT和test之间共享的参数。
Example use of a Parameter Package
在下面基于WISHBONE总线的示例中,有两个WISHBONE总线设备。A slave memory and an Ethernet Media Access Controller (MAC). 参数放在一个包(test_params_pkg)中,然后用于实例化顶层模块和测试平台测试类内的WISHBONE设备。
【此处需插一幅图】
测试参数包如下所示:
package test_params_pkg;
import uvm_pkg::*;
// WISHBONE general slave parameters
parameter slave_addr_space_sz = 32'h00100000;
// WISHBONE slave memory parameters
parameter mem_slave_size = 18; // 2**slave_mem_size = size in words(32 bits) of wb slave memory
parameter mem_slave_wb_id = 0; // WISHBONE bus slave id of wb slave memory
// MAC WISHBONE parameters
parameter mac_m_wb_id = 0; // WISHBONE bus master id of MAC
parameter mac_slave_wb_id = 1; // WISHBONE bus slave id of MAC
endpackage
顶层模块中用于实例化WISHBONE总线从存储器模块的参数值(mem_slave_size,mem_slave_wb_id)用法如下所示。 请注意top_mac模块中test_params_pkg的导入。
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();
//-----------------------------------
// WISHBONE 0, slave 0: 000000 - 0fffff
// this is 1 Mbytes of memory
wb_slave_mem #(mem_slave_size) wb_s_0 (
// inputs
.clk ( wb_bus_if.clk ),
.rst ( wb_bus_if.rst ),
.adr ( wb_bus_if.s_addr ),
.din ( wb_bus_if.s_wdata ),
.cyc ( wb_bus_if.s_cyc ),
.stb ( wb_bus_if.s_stb[mem_slave_wb_id] ),
.sel ( wb_bus_if.s_sel[3:0] ),
.we ( wb_bus_if.s_we ),
// outputs
.dout( wb_bus_if.s_rdata[mem_slave_wb_id] ),
.ack ( wb_bus_if.s_ack[mem_slave_wb_id] ),
.err ( wb_bus_if.s_err[mem_slave_wb_id] ),
.rty ( wb_bus_if.s_rty[mem_slave_wb_id] )
);
...
endmodule
测试平台的测试类中用于设置WISHBONE总线从存储器的配置对象值的参数用法如下所示。请注意,代码不使用32'h00100000的数字文字作为地址值,而是使用涉及DUT参数(mem_slave_size)的表达式。
package tests_pkg;
...
import test_params_pkg::*;
...
`include "test_mac_simple_duplex.svh"
endpackage
//-----------------------------------------------------------------
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();
wb_config_0.m_s_mem_wb_base_addr = mem_slave_wb_id * slave_addr_space_sz; // base address of slave mem
wb_config_0.m_mem_slave_size = 2**(mem_slave_size+2); // default is 1 Mbyte
wb_config_0.m_mem_slave_wb_id = mem_slave_wb_id; // WISHBONE bus slave id of slave mem
...
endfunction
...
endclass
Multiple Instances
如果有多个参数集实例,则可以为参数创建命名约定,也可以使用基于参数的参数化方法在每个实例的基础上组织参数集。
【此处需插一幅图】
package test_params_pkg;
import uvm_pkg::*;
// WISHBONE general slave parameters
parameter slave_addr_space_sz = 32'h00100000;
// WISHBONE slave memory parameters
class WISHBONE_SLAVE #(int mem_slave_size = 18, int mem_slave_wb_id = 0);
endclass
// Specializations for each slave memory instance
typedef WISHBONE_SLAVE #(18, 0) WISHBONE_SLAVE_0;
typedef WISHBONE_SLAVE #(18, 1) WISHBONE_SLAVE_1;
// MAC WISHBONE parameters
parameter mac_m_wb_id = 0; // WISHBONE bus master id of MAC
parameter mac_slave_wb_id = 2; // WISHBONE bus slave id of MAC
endpackage
要访问或使用上述代码中的特殊化WISHBONE_SLAVE_0或WISHBONE_SLAVE_1中指定的参数(如mem_slave_size或mem_slave_wb_id),请使用以下语法name_of_specialization :: parameter_name,如下所示:
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();
//-----------------------------------
// WISHBONE 0, slave 0: 000000 - 0fffff
// this is 1 Mbytes of memory
wb_slave_mem #(WISHBONE_SLAVE_0::mem_slave_size) wb_s_0 (
// inputs
.clk ( wb_bus_if.clk ),
.rst ( wb_bus_if.rst ),
.adr ( wb_bus_if.s_addr ),
.din ( wb_bus_if.s_wdata ),
.cyc ( wb_bus_if.s_cyc ),
.stb ( wb_bus_if.s_stb [WISHBONE_SLAVE_0::mem_slave_wb_id] ),
.sel ( wb_bus_if.s_sel[3:0] ),
.we ( wb_bus_if.s_we ),
// outputs
.dout( wb_bus_if.s_rdata[WISHBONE_SLAVE_0::mem_slave_wb_id] ),
.ack ( wb_bus_if.s_ack [WISHBONE_SLAVE_0::mem_slave_wb_id] ),
.err ( wb_bus_if.s_err [WISHBONE_SLAVE_0::mem_slave_wb_id] ),
.rty ( wb_bus_if.s_rty [WISHBONE_SLAVE_0::mem_slave_wb_id] )
);
...
endmodule
这里有关于参数和重用之间关系的进一步讨论。
(在http://verificationacademy.com/uvm-ovm上在线下载源代码示例)。