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

3 配置类

cust_svt_axi_system_configuration

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

ini 复制代码
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

ini 复制代码
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相关

arduino 复制代码
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

ini 复制代码
  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;

包含虚接口

ini 复制代码
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;

ini 复制代码
int port_id;
local string port_name;
bit is_active = 1;

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

ini 复制代码
svt_axi_system_configuration sys_cfg;

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

ini 复制代码
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数

ini 复制代码
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

ini 复制代码
svt_axi_port_configuration port_cfg;

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

ini 复制代码
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

ini 复制代码
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等

ini 复制代码
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;
相关推荐
程序员爱德华4 小时前
华为韬定律
集成电路·芯片·韬定律
ZenasLDR2 天前
Type-C接口iPad键盘皮套
接口·芯片·usb
至为芯3 天前
IP5385P至为芯支持2路C口双向快充100W新国标移动电源方案芯片
集成电路·芯片·电子元器件
义嘉泰3 天前
PN27G04BBGITG 存储芯篇章
芯片
深圳市贝乐实业股份有限公司4 天前
APS1604M-SQR-SN:这颗芯片如何成为移动打印机的“隐形功臣”?
芯片·psram·存储芯片·aps1604m-sqr-sn
洞察物理世界4 天前
【硬件_τ定律】华为韬定律(τ 定律)理论重塑半导体行业
芯片·半导体·韬定律·摩尔定律
蚁小二官方6 天前
华为韬定律突破芯片迭代瓶颈,赋能AI芯片多场景创新落地
芯片·ai芯片·华为韬定律
fuquxiaoguang6 天前
华为“韬(τ)定律”深度解读:后摩尔时代芯片设计的新范式
人工智能·华为·芯片·韬(τ)定律
武子康6 天前
调查研究-145 华为韬定律与LogicFolding深度解析:时间缩微如何绕过制程焦虑
人工智能·华为·ai·chatgpt·大模型·芯片·具身智能