1. AHB环境配置
1) 基础配置
作为master或者slave使用时,对应的is_active = 1
只作为监测(monitor)使用时,对应的is_active =0
class ahb_cfg extends svt_ahb_system_configuration;
`uvm_object_utils(ahb_cfg)
function new(string name="ahb_cfg");
super.new(name);
this.num_masters=2;
this.num_slaves=2;
this.create_sub_cfg(num_masters,num_slaves);
foreach(this.master_cfg[i]) begin
this.master_cfg[i].is_active = 1;
this.master_cfg[i].data_width = 32;
this.master_cfg[i].addr_width = 32;
this.ahb_lite = 1;
end
//slave ……
endfunction
endclass
2. testbench声明
`include "svt_ahb_slave_bind_if.svi"
`include "svt_ahb_master_bind_if.svi"
module top;
svt_ahb_if ahb_if();
assign ahb_if.hclk = clk;
assign ahb_if.hresetn = rstn;
initial begin
uvm_config_db#(svt_ahb_vif)::set(uvm_root::get(),"uvm_test_top.u_env.u_ahb_env", "vif", ahb_if);
end
endmodule
3. interface连接
1)active 端口连接(slave为例)
bind `DUT svt_ahb_slave_bind_if #(
.HADDR_WIDTH_PARAM (32),
.HWDATA_WIDTH_PARAM (32)
...
) ahb_bind_if(
.haddr (haddr ),
.hburst (hburst ),
....
);
bind top svt_ahb_slave_connector #(1) xxx_ahb_bind_connector(ahb_if,slave_if[0].svt_ahb_slave_async_modport, `DUT.ahb_bind_if);
2)passive 端口连接
passive模式相对active需要修改两个地方:
- cfg文件中的active配置
foreach(this.master_cfg[i]) begin
this.master_cfg[i].is_active = 0;
...
end
- bind连接
bind top svt_ahb_slave_connector #(0) xxx_ahb_bind_connector(ahb_if,slave_if[0].svt_ahb_monitor_modport, `DUT.ahb_bind_if);
4. 环境例化
svt_ahb_system_env u_ahb_env;
uvm_config_db#(svt_ahb_system_configuration)::set(this,"u_ahb_env","cfg",ahb_cfg);
ahb_env = svt_ahb_system_env::type_id::create("ahb_env",this);
如需要使用reg_model需要增加如下内容
//1.cfg文件修改
foreach(this.master_cfg[i]) begin
this.master_cfg[i].is_active = 1;
...
end
this.master_cfg[0].uvm_reg_enable = 1;
//2.配置regmodel
uvm_config_db#(uvm_reg_block)::set(this,"u_ahb_env.master[0]", "ahb_regmodel",regmodel);
5. 端口连接
monitor采样端口连接
this.u_ahb_env.slave[x].monitor.item_observed_port.connect(this.chk.item_observed_response_export);