AXI如何统计每个ID的带宽?
摘要:本文将基于前述的Verdi Tcl脚本(axi_read_bw.tcl)实现扩展功能。第一个部分:修改脚本以支持多个ID的带宽统计(AXI协议使用ID如rid来标识并发事务,按ID分组计算可分析每个事务流的BW)。第二个部分:提供将脚本与PTPX集成的示例(通过生成中间活动文件或直接在tcl中调用)。
回答假设您使用Synopsys工具链(Verdi + PTPX),脚本是可运行的Tcl示例。运行方式同前述:verdi -ssf your_fsdb.fsdb
后 source modified_script.tcl
。如果您的AXI ID宽度或信号名不同,请调整。
1. 如果AXI接口有多个ID,如何修改脚本来统计每个ID的带宽?
AXI协议支持多个outstanding事务,通过ID信号(e.g., rid for读通道, 典型4-8位宽度)区分。按ID统计BW需要:
- 查询ID信号(rid)。
- 在有效周期(rvalid && rready)时,根据当前rid值分组累加字节/周期(用Tcl数组存储per-ID数据)。
- 输出per-ID BW和总BW。
1.1 修改说明
- 新增:rid_hdl查询;数组
per_id_bytes
和per_id_cycles
存储数据;假设ID宽度8位(0-255),实际调整为您的设计(e.g., [AW/AR]ID宽度)。 - 计算:per-ID BW = 该ID总字节 / 时间;总BW = 所有ID总字节 / 时间。
- 注意:脚本假设rid在rvalid高时稳定;如果ID变化中途,需额外逻辑。适用于读通道;写通道类似替换为wid。
1.2 修改后的脚本示例(axi_read_bw_per_id.tcl)
# axi_read_bw_per_id.tcl - 计算AXI读通道带宽 (支持per-ID统计, 多窗口)
# 用户参数 (可修改)
set data_width 128 ;# AXI数据宽度 (位, e.g., 128=16字节/周期)
set id_width 8 ;# rid宽度 (位, e.g., 8位支持256 ID)
set scope "/top/dut/axi_if" ;# AXI接口scope路径 (调整为您的设计)
set time_windows [list {0 1000} {1000 2000} {2000 3000}] ;# 多时间窗口 (ns, list of pairs)
set output_file "axi_read_bw_per_id_report.csv" ;# 输出CSV文件
# 查询信号句柄 (使用npi)
set valid_hdl [npi_hdl_by_name -scope $scope -name "rvalid"]
set ready_hdl [npi_hdl_by_name -scope $scope -name "rready"]
set id_hdl [npi_hdl_by_name -scope $scope -name "rid"] ;# ID信号
set last_hdl [npi_hdl_by_name -scope $scope -name "rlast"] ;# 可选, 用于burst检查
# 检查信号是否存在
if {$valid_hdl == "" || $ready_hdl == "" || $id_hdl == ""} {
puts "Error: AXI read signal