Vitis Final System Kernel Instances
概述
system.cfg 是 Vitis 平台链接阶段的配置文件,它定义了完整的系统集成拓扑。这个文件将 HLS 生成的 PL 核与 AI Engine Graph 连接成一个可运行的硬件系统。
可以把 system.cfg 想象成一座复杂工厂的管道和线路图纸——它规定了哪些机器(kernels)需要安装、它们之间如何连接(streams)、以及从哪里获取原材料/输出产品(memory interfaces)。
时钟配置
freqhz=312500000:permute_i.ap_clk,permute_o.ap_clk,cyclic_shift.ap_clk,dma_src.ap_clk,dma_snk.ap_clk
所有 PL kernels 统一运行在 312.5 MHz。这个频率的选择基于以下考量:
- AIE 时钟的整数分频:1.25 GHz / 4 = 312.5 MHz,简化跨时钟域设计
- 时序收敛裕量:在 -2M 速度等级的 Versal 器件上,3.2ns 周期(约 312.5 MHz)对大多数 HLS 生成的逻辑来说有足够裕量
- 数据宽度匹配:128-bit @ 312.5 MHz = 4 cint16 samples/cycle,与 SSR=8 架构匹配
注意:如果修改此频率,必须同步更新:
- HLS 配置文件 (
hls.cfg) 中的clock参数 - AIE Graph 中的 PLIO 速率设置
- MATLAB 黄金模型的参考时钟
Kernel 实例化 (nk)
nk = m16_ssr8_permute_fb_i_wrapper:1:permute_i
nk = m16_ssr8_permute_fb_o_wrapper:1:permute_o
nk = m16_ssr8_cyclic_shift_wrapper:1:cyclic_shift
nk = dma_stream_src_wrapper:1:dma_src
nk = dma_stream_snk_wrapper:1:dma_snk
| 实例名 | Wrapper 核 | 数量 | 说明 |
|---|---|---|---|
permute_i |
m16_ssr8_permute_fb_i_wrapper |
1 | 输入置换核 |
permute_o |
m16_ssr8_permute_fb_o_wrapper |
1 | 输出置换核 |
cyclic_shift |
m16_ssr8_cyclic_shift_wrapper |
1 | 循环移位核 |
dma_src |
dma_stream_src_wrapper |
1 | DMA 数据源 |
dma_snk |
dma_stream_snk_wrapper |
1 | DMA 数据汇聚 |
命名约定:实例名(如 permute_i)用于后续连接声明,必须与 sc= 和 sp= 行中的名称一致。
AXI Stream 连接 (sc)
Source → Permute_I (7 streams)
sc = dma_src.sig_o_0:permute_i.sig_i_0
sc = dma_src.sig_o_1:permute_i.sig_i_1
...
sc = dma_src.sig_o_6:permute_i.sig_i_6
DMA Source 输出 7 路流(对应 P/Q = 8/7 的过采样比),连接到输入置换核。
Permute_I → AIE Filterbank (8 streams)
sc = permute_i.sig_o_0:ai_engine_0.PLIO_fbank_i_0
sc = permute_i.sig_o_1:ai_engine_0.PLIO_fbank_i_1
...
sc = permute_i.sig_o_7:ai_engine_0.PLIO_fbank_i_7
置换后的 8 路流通过 PLIO 进入 AIE Filterbank。注意 ai_engine_0 是系统自动生成的 AIE Graph 实例名。
AIE Filterbank → Permute_O (8 streams)
sc = ai_engine_0.PLIO_fbank_o_0:permute_o.sig_i_0
...
sc = ai_engine_0.PLIO_fbank_o_7:permute_o.sig_i_7
Filterbank 输出经过输出置换核恢复通道顺序。
Permute_O → Cyclic_Shift (8 streams)
sc = permute_o.sig_o_0:cyclic_shift.sig_i_0
...
sc = permute_o.sig_o_7:cyclic_shift.sig_i_7
Cyclic_Shift → AIE DFT (8 streams)
sc = cyclic_shift.sig_o_0:ai_engine_0.PLIO_dft_i_0
...
sc = cyclic_shift.sig_o_7:ai_engine_0.PLIO_dft_i_7
AIE DFT → DMA Sink (8 streams)
sc = ai_engine_0.PLIO_dft_o_0:dma_snk.sig_i_0
...
sc = ai_engine_0.PLIO_dft_o_7:dma_snk.sig_i_7
内存接口 (sp)
sp=dma_src.mem:LPDDR
sp=dma_snk.mem:LPDDR
两个 DMA 核的 m_axi 接口都连接到 LPDDR(低功耗 DDR)内存控制器。这允许 PS(处理系统)通过标准内存访问准备输入数据和读取结果。
内存布局:
- 输入缓冲区:
NSTREAM * DEPTH个 128-bit 字 = 7 * 512 * 16 bytes = 56 KB - 输出缓冲区:8 * 512 * 16 bytes = 64 KB
Vivado 物理实现选项
[vivado]
prop=run.impl_1.steps.phys_opt_design.is_enabled=1
prop=run.impl_1.steps.post_route_phys_opt_design.is_enabled=1
启用物理优化步骤,有助于在高利用率设计中改善时序收敛。对于主要由 AIE 和固定连接组成的本设计,这些选项通常不是关键,但启用它们可以提供额外的时序裕量。
常见修改场景
添加调试探针
如需在硬件仿真中观察特定信号,可以在 system.cfg 中添加 debug 配置(需要配合 Vitis IDE 使用):
[debug]
chipscope=dma_src.sig_o_0:pin_depth=1024
修改 PLIO 宽度
当前配置使用 64-bit PLIO。如需改为 32-bit 或 128-bit:
- 修改 AIE Graph 中的
plio_64_bits为plio_32_bits或plio_128_bits - 调整 HLS 核的数据宽度常量
- 重新计算时钟频率以维持吞吐量
多实例扩展
虽然本设计每个核只实例化 1 个,但可以通过增加 nk 的数量来创建多个独立的信道化器通道:
nk = dma_stream_src_wrapper:2:dma_src_0,dma_src_1
然后为每个实例独立配置连接关系。
依赖关系
该配置文件依赖于以下子模块的输出:
- DMA Stream Endpoints HLS Kernels - 提供
dma_stream_src_wrapper.xo和dma_stream_snk_wrapper.xo - SSR8 Reordering and Cyclic Shift HLS Kernels - 提供三个置换/移位核的
.xo文件 - AIE Graph 编译输出 - 提供
libadf.a(在aie/m16_ssr8目录中生成)
链接阶段命令示例:
v++ -l -t hw --platform xilinx_vck190_base_202420_1 \
system.cfg \
dma_stream_src_wrapper.xo dma_stream_snk_wrapper.xo \
m16_ssr8_permute_fb_i_wrapper.xo m16_ssr8_permute_fb_o_wrapper.xo \
m16_ssr8_cyclic_shift_wrapper.xo \
libadf.a -o system.xclbin