介绍
AXI Interconnect VIP包含在Synopsys AXI VIP中,可以使用集成的axi_system_env_svt例化,也可以直接使用axi_interconnect_env_svt例化。axi_interconnect_env_svt中包含svt_axi_ic_master_agent和svt_axi_ic_slave_agent,环境通过svt_axi_interconnect_configuration类配置,类中又包含和agent数量匹配的svt_axi_port_configuration。
vip有一个限制就是要interconnect等写数据完成(wlast握手)才能转发至下级slave,手册的描述是vip是协议功能实现而不是最高效率实现。
集成
如果使用axi_system_env_svt环境,且同时有常规master/slave agent,环境会自动将interconnect接口和常规agent对应接口进行连接。
例如环境包含3个ic slave和2个常规master,则会自动将ic slave的0、1连接到常规master的0、1,然后用户再自行将ic slave的2连接至DUT的master或做其他处理。自动连接也会自动进行匹配比对,会确认接口宽度和模式等信息一致(实际上就是比对两个接口的svt_axi_port_configuration)。
手册建议interconnect的主/从接口数量和常规从/主接口数量匹配,如果外面还要接DUT那对应接口is_active设成0即可,不会有驱动或干扰,还能保留monitor功能。
示例
示例采用axi_system_env_svt环境,配置interconnect为3主、2从,同时配置常规agent 2主、3从。
environment
AXI interconnect VIP和常规AXI VIP环境相似,主要是区别在svt_axi_system_configuration类的配置,配置类中又包含ic_cfg成员变量,对应interconnect的配置类。
首先使能interconnect,配置常规agent数量,再通过create_sub_cfg配置常规agent和ic_agent数量。
this.num_masters = 2;
this.num_slaves = 3;
this.use_interconnect = 1;
this.create_sub_cfgs(2,3,3,2);
常规主agent配置为AXI4、数据宽度256bit,ic从agent可以直接copy,但属性要配置为AXI_SLAVE。
foreach(master_cfg[fi]) begin
this.master_cfg[fi].axi_interface_type = svt_axi_port_configuration::AXI4;
this.master_cfg[fi].data_width = 256;
this.ic_cfg.slave_cfg[fi].do_copy(this.master_cfg[fi]);
this.ic_cfg.slave_cfg[fi].axi_port_kind = svt_axi_port_configuration::AXI_SLAVE;
end
常规从、ic主agent配置相似。
foreach(slave_cfg[fi]) begin
this.slave_cfg[fi].axi_interface_type = svt_axi_port_configuration::AXI4;
this.slave_cfg[fi].data_width = 256;
this.ic_cfg.master_cfg[fi].do_copy(this.slave_cfg[fi]);
this.ic_cfg.master_cfg[fi].axi_port_kind = svt_axi_port_configuration::AXI_MASTER;
end
设置3个常规从agent地址范围,interconnect会根据读写地址自动找到对应从agent,对于无效地址interconnect会直接报UVM_ERROR,而不是返回resp错误。
this.set_addr_range(0,64'h0,64'h10000000-1);
this.set_addr_range(1,64'h10000000,64'h20000000-1);
this.set_addr_range(2,64'h20000000,64'h30000000-1);
sequence
进行6次读写传输,每次地址递增0x8000000,相当于每个从设备地址读写2次。
由于主agent共用sequence,为了区别主agent0/1,agent1地址再加上0x1000。
for(i=0;i<6;i++) begin
`uvm_do_with(req,
{
xact_type == svt_axi_transaction::WRITE;
burst_type == svt_axi_transaction::INCR;
burst_size == svt_axi_transaction::BURST_SIZE_32BIT;
burst_length == 16;
addr == i*'h8000000 + 'h1000*port_cfg.port_id;
id == i;
foreach(data[fi]) data[fi] == fi + i*'h1000;
foreach(wstrb[fi]) wstrb[fi] == 4'hf;
})
end
读传输相似。
for(i=0;i<6;i++) begin
`uvm_do_with(req,
{
xact_type == svt_axi_transaction::READ;
burst_type == svt_axi_transaction::INCR;
burst_size == svt_axi_transaction::BURST_SIZE_32BIT;
burst_length == 16;
id == i;
addr == i*'h8000000 + 'h1000*port_cfg.port_id;
})
end
波形
从波形可以看到master0发送了6次写和读传输,地址、数据、id递增,应答和读数据正确。
从波形可以看到,slave0收到master0和master1共4次写和读,interconnect传递写不会有outstanding,但传递读还是可以outstanding。
同时可以看到interconnect会修改id,master0的id0、1传到slave时被改成了5、0x6d,vip处理id的机制和Synopsys DW_AXI不太一样,不是直接对id进行扩位,不过这样可以允许interconnect的主/从接口id位宽相同。