Synopsys AXI VIP 解析(2)——配置类和传输类

3 配置类

cust_svt_axi_system_configuration

example中新定义类,父类是svt_axi_system_configuration,和父类区别在new()函数增加了默认初始化,默认配置主要包含主/从设备数、开启监视器、设定主/从接口宽度、设定slave范围

this.num_masters = 1;
this.num_slaves  = 1;
this.system_monitor_enable = 1;

this.create_sub_cfgs(1,1);

this.master_cfg[0].data_width = 256;
this.slave_cfg[0].data_width = 256;
this.master_cfg[0].id_width = 8;
this.slave_cfg[0].id_width = 8;

this.set_addr_range(0,64'h0,64'hffff_ffff_ffff_ffff);

svt_axi_system_configuration

定义在svt_amba_uvm_pkg中
主要包含 虚接口、系统配置、port子类,其中公用时钟模式缺省为1

typedef virtual svt_axi_if AXI_IF;
AXI_IF axi_if;

bit common_clock_mode = 1;
rand int num_masters;
rand int num_lp_masters=0;
rand int num_slaves;
rand svt_axi_port_configuration master_cfg[];
rand svt_axi_lp_port_configuration lp_master_cfg[];
rand svt_axi_port_configuration slave_cfg[];
rand svt_axi_interconnect_configuration ic_cfg;

也包含一些方法,create_sub_cfgs用于创建子类,_ic为interconnect接口、_lp为AXI低功耗接口,缺省均为0。set_addr_range用于设定指定slave的地址范围,tdest开始变量目前还不支持,可能是未来支持转AXIStream相关

function void create_sub_cfgs(int num_masters = 1, int num_slaves = 1, int num_ic_master_ports = 0, int num_ic_slave_ports = 0, int num_lp_masters=0);

function void set_addr_range(int slv_idx, bit [`SVT_AXI_MAX_ADDR_WIDTH-1:0] start_addr, bit [`SVT_AXI_MAX_ADDR_WIDTH-1:0] end_addr, bit [`SVT_AXI_MAX_TDEST_WIDTH-1:0] tdest = 0, bit[`SVT_AXI_ADDR_TAG_ATTRIBUTES_WIDTH-1:0] addr_attribute=0);

svt_axi_port_configuration

定义在svt_amba_uvm_pkg中
可以在枚举定义看到port支持的协议,类型包括AXI3、AXI4、AXI4_Lite、AXI4-Stream、ACE、ACE_LITE,默认为AXI3

  typedef enum {
    AXI3        = `SVT_AXI_INTERFACE_AXI3,
    AXI4        = `SVT_AXI_INTERFACE_AXI4,
    AXI4_LITE   = `SVT_AXI_INTERFACE_AXI4_LITE,
    AXI4_STREAM = `SVT_AXI_INTERFACE_AXI4_STREAM,
    AXI_ACE     = `SVT_AXI_INTERFACE_ACE,
    ACE_LITE    = `SVT_AXI_INTERFACE_ACE_LITE
  } axi_interface_type_enum;

rand axi_interface_type_enum axi_interface_type = AXI3;

包含虚接口

AXI_MASTER_IF master_if;
AXI_SLAVE_IF slave_if;
AXI_PORT_STREAM_IF port_stream_if;

包含一些变量,port_id用于区分多个主从port,和协议无关;port_name用于打印信息;is_active为0时,不会处理传输,接口中output信号不会有驱动,只保留monitor;

int port_id;
local string port_name;
bit is_active = 1;

包含svt_axi_system_configuration句柄,可能类中一些变量不需要配置,而是来自这个句柄

svt_axi_system_configuration sys_cfg;

需要配置的变量主要包括信号位宽,和一些信号是否缺省(只列举AW通道,其他通道略),环境下的每个master和slave可以通过port类独立的配置接口信息。

rand int addr_width = `SVT_AXI_MAX_ADDR_WIDTH;
rand int addr_user_width = `SVT_AXI_MAX_ADDR_USER_WIDTH;
rand int data_width = `SVT_AXI_MAX_DATA_WIDTH;
rand int data_user_width = `SVT_AXI_MAX_DATA_USER_WIDTH;
rand int resp_user_width = `SVT_AXI_MAX_BRESP_USER_WIDTH;
rand int id_width  = `SVT_AXI_MAX_ID_WIDTH;

rand bit awregion_enable   = 0;
rand bit arregion_enable   = 0;
rand bit awid_enable       = 1;
rand bit awlen_enable      = 1;
rand bit awsize_enable     = 1;
rand bit awburst_enable    = 1;
rand bit awlock_enable     = 1;
rand bit awcache_enable    = 1;
rand bit awprot_enable     = 1;
rand bit awqos_enable      = 0;

还可以通过num_outstanding_xact配置outstanding深度,num_read/write_outstanding_xact仅在num_outstanding_xact=-1时有意义,用来分别配置读和写的outstanding数

rand int num_outstanding_xact = 4;
rand int num_read_outstanding_xact = 4;
rand int num_write_outstanding_xact = 4;

4 传输类

svt_axi_transaction

包含svt_axi_port_configuration句柄,所以是可以知道统计的transaction来自哪个port

svt_axi_port_configuration port_cfg;

包含AXI AW/AR/W/R/B通道数据,AW/AR共用地址变量addr,W/R共用数据变量data

rand xact_type_enum xact_type = WRITE; //READ/COHERENT
rand bit [`SVT_AXI_MAX_ADDR_WIDTH - 1 : 0] addr = 0;
rand bit [`SVT_AXI_MAX_DATA_WIDTH - 1:0] data[];
rand bit [`SVT_AXI_WSTRB_WIDTH - 1:0] wstrb[];
rand resp_type_enum bresp = OKAY;
rand resp_type_enum rresp[];
rand bit data_before_addr = 0;

包含AXI burst模式信息,其中burst_length为实际长度,不需要像AW/RLEN再-1

rand bit [`SVT_AXI_MAX_BURST_LENGTH_WIDTH: 0] burst_length = 1;
rand burst_size_enum burst_size = BURST_SIZE_8BIT;
rand burst_type_enum burst_type = INCR; //FIXED/WRAP

包含AXI地址边带信号,分别对应AWID、AWLOCK、AWCACHE、AWPROT等

rand bit [`SVT_AXI_MAX_ID_WIDTH - 1:0] id = 0;
rand atomic_type_enum atomic_type = NORMAL; //EXCLUSIVE/LOCKED
rand bit [`SVT_AXI_CACHE_WIDTH - 1:0] cache_type = 0;
rand  prot_type_enum prot_type = DATA_SECURE_NORMAL;

rand bit[`SVT_AXI_MAX_ADDR_USER_WIDTH - 1:0] addr_user = 0;
rand bit[`SVT_AXI_MAX_DATA_USER_WIDTH - 1:0] data_user[];
rand bit[`SVT_AXI_MAX_BRESP_USER_WIDTH - 1:0] resp_user = 0;

rand bit[`SVT_AXI_QOS_WIDTH - 1:0] qos = 0;
rand bit[`SVT_AXI_REGION_WIDTH - 1:0] region = 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值