🏠

PL Kernels Packet Processing 模块深度解析

一句话概括

本模块是 Versal ACAP 平台上数据包交换(Packet Switching)架构的 PL 侧核心实现,通过 HLS 实现的报文收发器将多个独立的数据流复用到单一物理通道,解决了 AIE 阵列与 PL 之间多路并发数据传输的瓶颈问题。


1. 问题空间:为什么需要这个模块?

1.1 背景:AIE-PL 数据交互的挑战

在 Versal ACAP 架构中,AI Engine (AIE) 阵列通过 AXI4-Stream 接口与可编程逻辑(PL)通信。当应用需要多路独立数据流并发传输时,传统的电路交换(Circuit Switching)方式面临严峻挑战:

电路交换的问题 具体表现
物理通道浪费 每路数据流独占一条物理通路,即使带宽利用率低也无法共享
连线复杂度爆炸 N 路输入 + M 路输出需要 N×M 条物理连接
时隙刚性 通道一旦建立,即使无数据传输也保持占用

1.2 数据包交换:从"专用车道"到"智能快递"

想象一下城市物流系统:

  • 电路交换 = 为每对收发点修建专用高速公路,无论是否有货都保持畅通
  • 包交换 = 所有货物统一装入标准化快递箱,通过共享的物流网络智能路由,根据收件地址(报文头)自动分拣

本模块就是 PL 侧的"智能分拣中心"

  • 发送端(hls_packet_sender):将来自多个 MM2S 的独立数据流封装成带路由信息的报文
  • 接收端(hls_packet_receiver):解析报文头,按目的地分发到对应的 S2MM 通道

2. 心智模型:理解模块的三把钥匙

2.1 抽象层次:从物理信号到逻辑数据流

┌─────────────────────────────────────────────────────────────┐
│  应用视角:4 路独立的数据通道 (mm2s_1~4  →  s2mm_1~4)        │
├─────────────────────────────────────────────────────────────┤
│  逻辑视角:报文交换网络                                      │
│          ┌──────────────┐      ┌──────────────┐             │
│          │Packet Sender │─────▶│   AIE Array  │             │
│          │  (复用器)     │      │  (交换核心)   │             │
│          └──────────────┘      └──────────────┘             │
│                                         │                    │
│          ┌──────────────┐               │                    │
│          │Packet Receiver│◀─────────────┘                    │
│          │   (解复用器)  │                                   │
│          └──────────────┘                                   │
├─────────────────────────────────────────────────────────────┤
│  物理视角:AXI4-Stream 信号线                                 │
│           时钟(250MHz)、有效信号、数据总线(32/64bit)           │
└─────────────────────────────────────────────────────────────┘

2.2 数据流拓扑:多对一的收敛与一对多的发散

发送端拓扑 - 多路汇聚(Many-to-One)

mm2s_1.s ──┐
mm2s_2.s ──┼──▶ hls_packet_sender_1 ──▶ ai_engine_0.Datain0
mm2s_3.s ──┤    (复用 + 封装报文头)
mm2s_4.s ──┘

接收端拓扑 - 一路分发(One-to-Many)

ai_engine_0.Dataout0 ──▶ hls_packet_receiver_1 ──┬──▶ s2mm_1.s
                                                  ├──▶ s2mm_2.s
                                                  ├──▶ s2mm_3.s
                                                  └──▶ s2mm_4.s

2.3 报文格式:隐式的路由契约

虽然代码片段中没有展示报文头的具体定义,但从架构可以推断报文包含的关键字段:

┌─────────────────┬─────────────────┬─────────────────────────────┐
│   报文头字段    │     位宽        │          说明              │
├─────────────────┼─────────────────┼─────────────────────────────┤
│  Destination ID │     2-4 bits   │ 目标 S2MM 通道 (0~3)       │
│  Packet Type    │     2 bits     │ 数据/控制/同步报文类型       │
│  Payload Length │     8-16 bits  │ 有效载荷字节数              │
│  Sequence Num   │     8-16 bits  │ 用于保序和丢包检测           │
│  CRC/Checksum   │     16-32 bits │ 可选的数据完整性校验         │
└─────────────────┴─────────────────┴─────────────────────────────┘

3. 架构详解:组件与数据流

3.1 系统概览图

flowchart TB subgraph PL[PL Domain - 250MHz] direction TB MM2S1[mm2s_1
MM2S Kernel]:::dma MM2S2[mm2s_2
MM2S Kernel]:::dma MM2S3[mm2s_3
MM2S Kernel]:::dma MM2S4[mm2s_4
MM2S Kernel]:::dma PSENDER[hls_packet_sender_1
Packet Encoder]:::hls PRECV[hls_packet_receiver_1
Packet Decoder]:::hls S2MM1[s2mm_1
S2MM Kernel]:::dma S2MM2[s2mm_2
S2MM Kernel]:::dma S2MM3[s2mm_3
S2MM Kernel]:::dma S2MM4[s2mm_4
S2MM Kernel]:::dma end subgraph AIE[AIE Array - 1GHz] AIE0[ai_engine_0
Packet Switch Core]:::aie end subgraph HOST[Host Domain] HOSTAPP[Host Application
XRT Control]:::host end %% Data Flow - Send Path MM2S1 -->|AXI4-Stream| PSENDER MM2S2 -->|AXI4-Stream| PSENDER MM2S3 -->|AXI4-Stream| PSENDER MM2S4 -->|AXI4-Stream| PSENDER PSENDER -->|AXI4-Stream
Packetized| AIE0 %% Data Flow - Receive Path AIE0 -->|AXI4-Stream
Packetized| PRECV PRECV -->|AXI4-Stream| S2MM1 PRECV -->|AXI4-Stream| S2MM2 PRECV -->|AXI4-Stream| S2MM3 PRECV -->|AXI4-Stream| S2MM4 %% Host Control HOSTAPP -.->|XRT API| PL HOSTAPP -.->|XRT API| AIE classDef dma fill:#e1f5fe,stroke:#01579b,stroke-width:2px classDef hls fill:#fff3e0,stroke:#e65100,stroke-width:2px classDef aie fill:#f3e5f5,stroke:#4a148c,stroke-width:2px classDef host fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px

3.2 核心组件剖析

3.2.1 DMA 端点 (MM2S/S2MM)

┌────────────────────────────────────────────────────────────────┐
│  MM2S Kernel (Memory-to-Stream)                                │
├────────────────────────────────────────────────────────────────┤
│  职责: 从 DDR/HBM 读取数据块,通过 AXI4-Stream 输出            │
│  接口: m_axi (DDR) → hls::stream → axis (PL/AIE)               │
│  配置: 4 个实例 (mm2s_1~4),对应 4 路独立数据源                │
└────────────────────────────────────────────────────────────────┘

┌────────────────────────────────────────────────────────────────┐
│  S2MM Kernel (Stream-to-Memory)                                │
├────────────────────────────────────────────────────────────────┤
│  职责: 从 AXI4-Stream 接收数据,写入 DDR/HBM                   │
│  接口: axis (PL/AIE) → hls::stream → m_axi (DDR)               │
│  配置: 4 个实例 (s2mm_1~4),对应 4 路独立数据目的地            │
└────────────────────────────────────────────────────────────────┘

3.2.2 报文发送器 (hls_packet_sender)

架构角色:多路复用器 + 报文封装器

数据流处理链

输入阶段 (4 路并行):
┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐
│ mm2s_1  │  │ mm2s_2  │  │ mm2s_3  │  │ mm2s_4  │
└────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘
     │            │            │            │
     ▼            ▼            ▼            ▼
┌───────────────────────────────────────────────────┐
│          轮询/仲裁逻辑 (Round-Robin)               │
│  策略: 公平轮询,避免单路流饿死                     │
│  缓冲: 每路独立 FIFO,解耦生产者/消费者速率         │
└───────────────────────────────────────────────────┘
                          │
                          ▼
┌───────────────────────────────────────────────────┐
│          报文封装 (Packet Framing)                 │
│  - 插入报文头 (目标ID、序列号、长度)               │
│  - 计算 CRC/Checksum (可选)                        │
│  - 添加帧边界标记                                   │
└───────────────────────────────────────────────────┘
                          │
                          ▼
┌───────────────────────────────────────────────────┐
│       AXI4-Stream 输出 → ai_engine_0.Datain0     │
│  特性: 单一物理通道,逻辑多路复用                   │
└───────────────────────────────────────────────────┘

3.2.3 报文接收器 (hls_packet_receiver)

架构角色:解复用器 + 报文解析器

数据流处理链

输入阶段:
┌───────────────────────────────────────────────────┐
│       AXI4-Stream 输入 ← ai_engine_0.Dataout0    │
│  特性: 单一物理通道承载多路逻辑流                   │
└───────────────────────────────────────────────────┘
                          │
                          ▼
┌───────────────────────────────────────────────────┐
│          报文解析 (Packet Parsing)                   │
│  - 检测帧边界,提取完整报文                         │
│  - 解析报文头 (Destination ID, Length, Seq)         │
│  - 验证 CRC/Checksum (可选)                         │
│  - 错误处理: 丢包、错序、CRC 失败                   │
└───────────────────────────────────────────────────┘
                          │
                          ▼
┌───────────────────────────────────────────────────┐
│          路由分发 (Demultiplexing)                 │
│  逻辑: 根据 Destination ID 选择输出通道               │
│  - ID=0 → s2mm_1                                  │
│  - ID=1 → s2mm_2                                  │
│  - ID=2 → s2mm_3                                  │
│  - ID=3 → s2mm_4                                  │
│  缓冲: 每路独立 FIFO,吸收速率不匹配                │
└───────────────────────────────────────────────────┘
                          │
     ┌────────────────────┼────────────────────┐
     ▼                    ▼                    ▼
┌─────────┐          ┌─────────┐          ┌─────────┐
│ s2mm_1  │          │ s2mm_2  │          │ s2mm_3  │   + s2mm_4
└─────────┘          └─────────┘          └─────────┘

4. 设计决策与权衡

4.1 为什么选择包交换而非电路交换?

维度 电路交换 (Circuit Switching) 包交换 (Packet Switching) - 本方案
资源占用 N×M 条物理连接 N+M 条连接 + 报文处理逻辑
带宽利用率 低 (空闲时通道浪费) 高 (统计复用)
延迟确定性 高 (固定通路) 中 (排队和调度引入抖动)
复杂度 低 (硬连线) 高 (需要报文封装/解析)
扩展性 差 (新增流需重布线) 好 (软件配置路由表)

本模块的取舍逻辑

  • 接受更高的实现复杂度轻微的延迟不确定性
  • 换取物理通道数量的大幅减少 (4+4=8 条 vs 4×4=16 条)
  • 获得动态流调度的灵活性 (可在运行时调整路由)

4.2 为什么选择 4 路复用?

从配置看,系统选择了 4 路 MM2S 汇聚到 1 路报文通道,再从 1 路报文通道分发到 4 路 S2MM。这个数字的选择反映了以下权衡:

  1. AIE 阵列的并行度:典型的 AIE 设计采用 4、8、16 的并行粒度,4 路是一个自然的起点
  2. 报文开销的摊销:每包需要额外的报文头(可能 8-16 字节),4 路复用时开销占比合理
  3. FIFO 资源平衡:更多路数需要更大的缓冲 FIFO,4 路在典型 BRAM 预算内

4.3 HLS vs RTL 的实现选择

本模块使用 HLS (High-Level Synthesis) 实现报文收发器,而非手工编写 RTL:

方面 HLS (本方案) 手工 RTL
开发效率 高 (C++ 抽象) 低 (Verilog 细节)
时序收敛 依赖工具 (通常 400MHz 可达) 手工优化更可控
代码可维护性 高 (算法意图清晰) 低 (时序逻辑交织)
资源优化 工具决定,可能冗余 可精确到门级

关键配置freqhz=400000000 (400MHz)

  • 这是 PL 侧 HLS 核的目标时钟
  • 与 AIE 阵列的 1GHz 形成跨时钟域,但 AXI4-Stream 的握手协议天然处理速率匹配

5. 依赖关系与系统集成

5.1 模块依赖图

┌─────────────────────────────────────────────────────────────────────┐
│                    pl_kernels_packet_processing                    │
│                     (本模块 - PL 侧报文处理)                          │
├─────────────────────────────────────────────────────────────────────┤
│  依赖项:                                                              │
│  ├─► AIE_ML_Feature_Tutorials.buffer_aie.aie_kernels               │
│  │    (AIE 侧报文处理核 - 报文路由核心)                              │
│  │    关系: AIE 接收 PL 发送的报文,处理后返回                      │
│  │                                                                          │
│  ├─► AIE_ML_Feature_Tutorials.buffer_aie.host_control              │
│  │    (主机控制程序 - XRT 运行时)                                    │
│  │    关系: 配置 DMA 描述符、启动数据传输                            │
│  │                                                                          │
│  └─► AIE_Design_System_Integration.baseline_aie_pl_integration   │
│       (AIE-PL 基础集成模式)                                          │
│       关系: 继承基础集成架构,添加报文交换层                         │
└─────────────────────────────────────────────────────────────────────┘

5.2 数据流时序图

Host Control                    PL Kernels                    AIE Array
    │                               │                              │
    │  1. XCL_MAP_BUFFER            │                              │
    │───────────────────────────────▶│                              │
    │                               │                              │
    │  2. START MM2S DMA            │                              │
    │───────────────────────────────▶│                              │
    │                               │                              │
    │                               │  3. READ FROM DDR              │
    │                               │◀─────────────────────────────│
    │                               │                              │
    │                               │  4. AXI4-STREAM TO SENDER    │
    │                               │────┬────────────────────────▶  │
    │                               │    │                         │
    │                               │  5. PACKET ENCODING         │
    │                               │◀───┘                         │
    │                               │                              │
    │                               │  6. PACKET TO AIE           │
    │                               │─────────────────────────────▶│
    │                               │                              │
    │                               │  7. AIE PROCESSING          │
    │                               │◀─────────────────────────────│
    │                               │                              │
    │                               │  8. PACKET FROM AIE         │
    │                               │─────────────────────────────▶│
    │                               │                              │
    │                               │  9. PACKET DECODING         │
    │                               │────┬───────────────────────▶ │
    │                               │    │                        │
    │                               │ 10. DEMUX TO S2MM          │
    │                               │◀───┘                        │
    │                               │                             │
    │                               │ 11. WRITE TO DDR           │
    │                               │────────────────────────────▶│
    │                               │                             │
    │  12. SYNC/READBACK           │                             │
    │◀─────────────────────────────│                             │
    │                               │                             │

Legend:
  ───▶ 控制流/配置
  ──▶  数据流 (AXI4-Stream)
  ◀──▶ 双向交互

6. 关键设计权衡与决策分析

6.1 为什么采用 4 路复用?

设计约束空间:
                    带宽利用率
                       ▲
                       │
          理论最优 ─────┼───── 实际折中
           (16路)      │      (本设计: 4路)
                       │
                       │
   资源消耗 ◀──────────┼──────────▶ 复杂度
   (BRAM/FIFO)        │           (时序收敛)
                       │
          资源极限 ─────┼───── 复杂度爆炸
           (1路独占)   │      (16路全交换)
                       │
                       ▼
                    延迟确定性

选择 4 路的核心逻辑

  1. AIE 架构对齐:AIE 计算单元通常以 4、8、16 为并行粒度组织,4 路是 AIE-PL 接口的自然宽度
  2. 报文开销摊销:假设报文头 16 字节,载荷 256 字节,开销比例为 6%;若降为 2 路,为保持吞吐量需增加包频,开销比例上升至不理想水平
  3. FIFO 资源平衡:每路需要独立的缓冲 FIFO 吸收速率波动,4 路在典型 BRAM (18Kb/36Kb) 预算内可配置合理的 FIFO 深度 (如 4KB/路)

6.2 时钟域交叉策略

时钟域架构:

   Host Domain (PCIe)          PL Domain              AIE Domain
        │                        │                       │
    ~100MHz                 250MHz (本模块)            1GHz
        │                        │                       │
        │    ┌───────────────────┘                       │
        │    │                                           │
        ▼    ▼                                           ▼
   [XRT Runtime] ──────► [MM2S/S2MM] ──────► [AIE Array]
   (控制面)              (数据面 250MHz)       (计算面 1GHz)
                            │
                            └────► [Packet Sender/Receiver]
                                   (本模块核心)

跨时钟域交互点:
1. XRT ↔ PL: 通过 PCIe BAR 寄存器 + DMA 描述符,标准 XRT 驱动处理
2. PL (250MHz) ↔ AIE (1GHz): AXI4-Stream 接口天然支持异步时钟,通过 FIFO 缓冲

为何 250MHz 是合理选择

  • 400MHz 是 HLS 综合目标,但实际运行配合 AIE 的 1GHz,选择 1/4 分频 (250MHz) 简化时钟树
  • AXI4-Stream 的 TVALID/TREADY 握手机制天然处理速率匹配,无需额外同步逻辑

6.3 HLS 实现的关键优化

#pragma HLS 优化策略映射:

┌───────────────────────────────────────────────────────────────────┐
│  DATAFLOW - 任务级流水线                                           │
│  ┌─────────┐   ┌─────────┐   ┌─────────┐   ┌─────────┐             │
│  │ Read    │──▶│ Frame   │──▶│ Process │──▶│ Write   │             │
│  │ Input   │   │ Header  │   │ Payload │   │ Output  │             │
│  └─────────┘   └─────────┘   └─────────┘   └─────────┘             │
│       │            │            │            │                     │
│       └────────────┴────────────┴────────────┘                     │
│                     并发执行 (并发度=4)                              │
└───────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────┐
│  PIPELINE - 循环级流水线                                           │
│                                                                   │
│  for (int i = 0; i < PACKET_SIZE; i++) {                         │
│      #pragma HLS PIPELINE II=1                                    │
│      process_word(input[i], output[i]);                           │
│  }                                                                │
│                                                                   │
│  目标: Initiation Interval = 1 周期                                 │
│  效果: 每周期输出一个处理后的字,吞吐量 = 时钟频率 × 数据宽度          │
└───────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────┐
│  INTERFACE - 端口协议定义                                          │
│                                                                   │
│  #pragma HLS INTERFACE axis port=input_stream                     │
│  #pragma HLS INTERFACE axis port=output_stream                    │
│  #pragma HLS INTERFACE s_axilite port=ctrl_reg bundle=control   │
│                                                                   │
│  效果:                                                            │
│  - input/output: AXI4-Stream 协议 (TVALID/TREADY/TDATA/TLAST)       │
│  - ctrl_reg: AXI4-Lite 寄存器接口,用于主机配置                     │
└───────────────────────────────────────────────────────────────────┘

7. 新贡献者指南:避坑与最佳实践

7.1 隐式契约与假设

时序假设

// 隐式契约 1: AXI4-Stream 握手必须在一个时钟周期内完成
// 危险代码:
if (valid) {  // 假设 valid 只持续一周期
    data = read();
}
// 安全代码:
if (valid && ready) {  // 完整握手
    data = read();
}

// 隐式契约 2: TLAST 必须在包的最后一个字上置位
// 违规后果:接收端无法正确识别包边界,导致后续包解析错位

资源假设

BRAM 预算契约:
- Packet Sender: 4 × 2KB FIFO = 8KB BRAM
- Packet Receiver: 4 × 2KB FIFO = 8KB BRAM
- 总计: 16KB (约 8 个 18Kb BRAM)
- 假设: 器件为 xcve2802,可用 BRAM ~600 个,占比 <2%

7.2 常见陷阱

陷阱 1: 报文头字段对齐

// 错误: 未考虑字节序和对齐
struct PacketHeader {
    uint8_t dest_id;      // 偏移 0
    uint16_t payload_len; // 偏移 1 (非对齐!某些 HLS 版本可能警告)
    uint8_t seq_num;      // 偏移 3
}; // 总大小 4 字节

// 正确: 显式填充和对齐
struct PacketHeader {
    ap_uint<8> dest_id;       // 8 bits
    ap_uint<8> reserved;      // 填充,确保 16-bit 对齐
    ap_uint<16> payload_len;  // 16 bits
    ap_uint<8> seq_num;       // 8 bits
    ap_uint<8> crc;           // 8 bits
} __attribute__((packed)); // 或 #pragma pack(1)

陷阱 2: 背压传播

// 问题: 下游阻塞未正确传播到上游,导致 FIFO 溢出
void packet_sender(...) {
    #pragma HLS INTERFACE axis port=in0
    #pragma HLS INTERFACE axis port=in1
    #pragma HLS INTERFACE axis port=out
    
    // 错误: 只检查当前输入,不检查输出是否就绪
    if (!in0.empty()) {
        out.write(in0.read()); // 可能阻塞!
    }
    
    // 正确: 完整握手检查
    if (!in0.empty() && !out.full()) {
        out.write(in0.read());
    }
}

陷阱 3: 跨时钟域数据一致性

场景: Packet Sender 运行在 400MHz,但 AIE 接口运行在 250MHz
危险: 数据在跨时钟域时可能被采样到不稳定状态

解决方案:
1. AXI4-Stream 协议天然包含握手机制,FIFO 插入 CDC (Clock Domain Crossing)
2. 使用 tool-generated 的 AXI Stream FIFO IP,自动处理 CDC
3. 确保 depth 足够吸收速率差异 (250MHz vs 400MHz 需要至少 16 深度)

7.3 调试与验证策略

仿真验证层次

Level 1: HLS C-Simulation
- 验证算法逻辑正确性
- 快速迭代,无需综合
- 工具: vitis_hls -csim

Level 2: HLS RTL Co-Simulation  
- 验证 HLS 生成的 RTL 与 C 模型行为一致
- 检查时序和握手协议
- 工具: vitis_hls -cosim

Level 3: System-Level Emulation (hw_emu)
- 完整系统软硬件协同仿真
- 验证 AIE-PL 交互、DMA 传输
- 工具: v++ -t hw_emu

Level 4: Hardware Validation (hw)
- 实际板卡运行
- 性能 profiling, 吞吐量/延迟测量

关键检查点

# 伪代码: 验证报文完整性的自检逻辑
def verify_packet_integrity(tx_data, rx_data):
    """
    检查发送和接收的报文是否一致
    """
    errors = []
    
    # 1. 包数量匹配
    if len(tx_data) != len(rx_data):
        errors.append(f"Packet count mismatch: TX={len(tx_data)}, RX={len(rx_data)}")
    
    # 2. 每包内容匹配
    for i, (tx_pkt, rx_pkt) in enumerate(zip(tx_data, rx_data)):
        if tx_pkt.payload != rx_pkt.payload:
            errors.append(f"Payload mismatch at packet {i}")
        if tx_pkt.header.seq_num != rx_pkt.header.seq_num:
            errors.append(f"Sequence number mismatch at packet {i}")
    
    # 3. 顺序检查
    rx_seq_nums = [p.header.seq_num for p in rx_data]
    if rx_seq_nums != sorted(rx_seq_nums):
        errors.append("Out-of-order packets detected")
    
    return errors

8. 相关模块导航

8.1 上游依赖 (被本模块依赖)

模块 关系 说明
AIE_ML_Feature_Tutorials-buffer_aie-aie_kernels 数据消费方 AIE 侧报文处理核,接收/发送 PL 侧的报文
AIE_ML_Feature_Tutorials-buffer_aie-host_control 控制方 主机 XRT 程序,配置 DMA 描述符、启动数据传输

8.2 下游依赖 (依赖本模块)

模块 关系 说明
AIE_ML_Feature_Tutorials-buffer_aie-system_config 集成方 系统集成配置,实例化本模块的核并连接拓扑

8.3 同级相关模块

模块 关系 说明
AIE_ML_Feature_Tutorials-pktstream_aie-pl_kernels 变体 基于 pktstream 接口的 PL 报文处理,本模块基于 buffer 接口

9. 总结:模块的架构角色

┌─────────────────────────────────────────────────────────────────────┐
│                        架构定位卡片                                 │
├─────────────────────────────────────────────────────────────────────┤
│  模块名称: pl_kernels_packet_processing                             │
│  架构层级: PL 侧数据平面 (Data Plane)                                │
│  核心职责: 多路数据流的报文封装、复用、解复用、解析                  │
├─────────────────────────────────────────────────────────────────────┤
│  输入接口: 4× AXI4-Stream (from MM2S)                               │
│  输出接口: 1× AXI4-Stream (to AIE)                                  │
│  返回路径: 1× AXI4-Stream (from AIE) → 4× AXI4-Stream (to S2MM)    │
├─────────────────────────────────────────────────────────────────────┤
│  关键设计模式:                                                       │
│  • 统计复用 (Statistical Multiplexing)                              │
│  • 轮询仲裁 (Round-Robin Arbitration)                                 │
│  • 报文交换 (Packet Switching)                                        │
│  • 流控背压 (Backpressure Flow Control)                              │
├─────────────────────────────────────────────────────────────────────┤
│  性能特征:                                                          │
│  • 目标频率: 400MHz (HLS 综合), 运行 250MHz                         │
│  • 吞吐能力: 每路最大 100MB/s (32-bit @ 250MHz)                     │
│  • 聚合吞吐: 400MB/s (4路复用)                                       │
│  • 延迟特性: 微秒级 (取决于包大小和仲裁)                             │
└─────────────────────────────────────────────────────────────────────┘

文档信息

  • 模块路径: AI_Engine_Development/AIE/Feature_Tutorials/04-packet-switching/buffer_aie/pl_kernels
  • 核心组件: config.cfg.s2mm, system.cfg.mm2s_1~4, system.cfg.hls_packet_receiver_1, system.cfg.hls_packet_sender_1
  • 相关模块: buffer_aie-aie_kernels, buffer_aie-host_control
On this page