AXI Interconnect VIP使用示例

介绍

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位宽相同。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值