1. AXI环境配置
1) 基础配置
作为master或者slave使用时,对应的is_active = 1
只作为i监测(monitor)使用时,对应slave_cfg的is_active = 0(对应端口连接也有所区别)
class axi_cfg extends svt_axi_system_configuration;
`uvm_object_utils(aix_cfg)
function new(string name="axi_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 = 512;
this.master_cfg[i].addr_width = 48;
this.master_cfg[i].id_width = 8;
this.master_cfg[i].axi_interface_type = `SVT_AXI_INTERFACE_AXI3;
end
//slave ……
endfunction
endclass
2)其他配置
如果user_enable、qos_enable不做配置,VIP默认采用0进行发送
foreach(this.master_cfg[i]) begin
this.master_cfg[i].aruser_enable = 1;
this.master_cfg[i].awuser_enable = 1;
this.master_cfg[i].wuser_enable = 1;
this.master_cfg[i].arqos_enable = 1;
this.master_cfg[i].awqos_enable = 1;
end
同样ready信号在不做配置的情况下,VIP默认置位状态(为1),可根据需求设置
foreach(this.slave_cfg[i]) begin
this.slave_cfg[i].default_awready = 0;
this.slave_cfg[i].default_wready = 0;
end
2. interface连接
1)各端口相同时钟
assign axi_fab_if.common_aclk = Aclk;
assign axi_fab_if.master_if[x].aresetn = Preset_n;
2)各端口不同时钟
除上述common_aclk的赋值外,需要对单个master//slave_if时钟进行赋值
assign axi_fab_if.master_if[x].aclk = ACLK;
3)is_active=1 端口连接(master为例)
assign `TOP.awvalid = axi_fab_if.master_if[x].awvalid;
assign `TOP.awaddr = axi_fab_if.master_if[x].awaddr;
//……
assign axi_fab_if.master_if[x].awready = `TOP.awready;
assign axi_fab_if.master_if[x].arready = `TOP.arready;
4)is_acitve=0 端口连接(master、slave相同)
assign axi_fab_if.slave_if[x].awvalid = `TOP.awvalid;
assign axi_fab_if.slave_if[x].awaddr = `TOP.awaddr;
//……
assign axi_fab_if.slave_if[x].awready = `TOP.awready;
assign axi_fab_if.slave_if[x].arready = `TOP.arready;
3. 环境例化
svt_axi_system_env axi_env;
uvm_config_db#(svt_axi_system_configuration)::set(this,"axi_env","cfg",axi_cfg);
axi_env = svt_axi_system_env::type_id::create("axi_env",this);
4. 端口连接
this.axi_env.slave[x].monitor.item_observed_port.connect(this.chk.item_observed_response_export);