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;
相关推荐
深圳市尚想信息技术有限公司1 天前
HITENX海速芯TM52F1363-SSOP24 8KB Flash存储+EEPROM,国产8位MCU单片机
单片机·mcu·flask·芯片·控制器·海速芯
深圳市贝乐实业股份有限公司1 天前
内存不够用?APS6404L-3SQR-SN给小 MCU 开个外挂
芯片·智能手表·psram·存储芯片
大唐荣华3 天前
机器人/智能驾驶/域控 芯片&体系高频缩写大全
机器人·芯片·具身
Summer-Bright3 天前
深度 | OpenAI 联合三星造芯:从模型层向底层算力延伸,AI 算力供应链开始重新洗牌
人工智能·ai·openai·芯片
上海芯聚电子6 天前
一块工业采集板的时钟替代:泰艺与SiTime如何从参数对比走到上板验证?
芯片·晶振·晶体震荡器
Lifangyun_WD6 天前
RTX 5090 与 RTX PRO 6000 怎么选?32GB 和 96GB 显存分别适合哪些 AI 任务
人工智能·aigc·gpu算力·芯片·gpu租赁
芯片人0076 天前
纯硬件一键开关机ASIC芯片,为什么比 MCU 方案更适合更可靠
人工智能·单片机·嵌入式硬件·物联网·芯片
芯片人0076 天前
武汉广昇科技的GMUX1308A模拟开关芯片成功导入中国台湾上市企业联昌电子,助力汽车电子供应链自主可控
科技·嵌入式硬件·物联网·汽车·芯片
至为芯8 天前
PY32F002B至为芯集成32位ARM内核的低成本MCU单片机
单片机·集成电路·芯片
ZenasLDR9 天前
LDR6600实现AR眼镜边充电边投屏功能
接口·芯片·usb