Quick Start
- 步骤一:下载并安装赛题指定的 EDA 工具(Vivado 2025.2 或更高版本),确保支持 Chiplet 相关的 IP 核(如 AXI-Stream、Die-to-Die Controller)。
- 步骤二:从大赛官网获取官方提供的 Chiplet 互连参考设计(RTL 与约束模板),解压至本地工作目录。
- 步骤三:在 Vivado 中创建新工程,目标器件选择大赛指定 FPGA(如 Xilinx Versal AI Core 系列,示例型号 XCVC1902)。
- 步骤四:将参考设计中的顶层模块(top.v)添加为设计源文件,并添加约束文件(top.xdc)。
- 步骤五:运行综合(Synthesis),检查无关键错误;若出现时序违规,先检查时钟约束是否正确。
- 步骤六:运行实现(Implementation),并生成比特流。预期结果:综合与实现均无严重错误,资源利用率在 70% 以下(示例值,以实际设计为准)。
- 步骤七:将比特流下载至开发板,通过串口或 JTAG 观察 Chiplet 链路初始化状态指示灯(如 LINK_UP 信号)。
- 步骤八:运行大赛提供的测试脚本(如 Python 脚本,通过 UART 发送数据帧),验证数据吞吐与延迟是否满足赛题指标(示例:吞吐 ≥ 10 Gbps,延迟 ≤ 100 ns)。
前置条件与环境
| 项目/推荐值 | 说明 | 替代方案 |
|---|---|---|
| 器件/板卡 | Xilinx Versal AI Core XCVC1902(示例) | 其他支持 Chiplet 的 Versal 系列或 Intel Agilex 7(需调整约束) |
| EDA 版本 | Vivado 2025.2 或更高 | Vivado ML 2025.1(需验证 IP 兼容性) |
| 仿真器 | Vivado Simulator(xsim) | ModelSim/Questa(需额外配置库) |
| 时钟/复位 | 100 MHz 差分时钟(板载 OSC);异步复位,低有效 | 可改用 PLL 生成 200 MHz 用于高速链路 |
| 接口依赖 | UART(115200 波特率)用于调试;JTAG 用于下载 | 可添加 Ethernet 接口(需额外 IP) |
| 约束文件 | top.xdc(含时钟周期、I/O 延迟、CDC 约束) | 使用大赛提供的模板,仅修改器件引脚 |
| 参考设计 | 大赛官方 Chiplet 互连参考设计(RTL 与约束) | 可参考 Xilinx 应用笔记 XAPP1359(需适配) |
目标与验收标准
- 功能点:实现 Chiplet 互连协议(如 AXI-Stream 或 Die-to-Die 协议),支持数据包的正确发送与接收;链路初始化自动完成;错误检测与重传机制(如 CRC 校验)。
- 性能指标:数据吞吐 ≥ 10 Gbps(示例值,以赛题为准);端到端延迟 ≤ 100 ns(示例值);误码率(BER)≤ 1e-12(在无外部干扰条件下)。
- 资源与 Fmax:LUT 利用率 ≤ 40%(示例值);触发器利用率 ≤ 30%;BRAM 利用率 ≤ 20%;Fmax ≥ 200 MHz(示例值,取决于链路速率)。
- 验收方式:通过大赛提供的测试平台(Testbench 或上板脚本),输出日志显示“PASS”;波形显示链路状态机进入“LINK_UP”状态;资源报告满足阈值。
实施步骤
阶段一:工程结构与顶层设计
- 创建工程目录结构:src/(RTL 源文件)、sim/(仿真脚本与 testbench)、constrs/(约束文件)、ip/(IP 核)。
- 顶层模块(top.v)应包含:时钟/复位输入、Chiplet 链路接口(如 AXI-Stream 通道)、UART 调试接口、状态指示输出。
- 常见坑:顶层模块中未实例化 Chiplet IP 核的复位同步逻辑,导致上电后链路初始化失败。排查方法:检查复位信号是否经过至少两级同步器。
阶段二:关键模块——Chiplet 互连控制器
// chiplet_link_ctrl.v
// 简化版 Chiplet 链路控制器,实现状态机与数据通道
module chiplet_link_ctrl (
input wire clk, // 系统时钟,200 MHz
input wire rst_n, // 异步复位,低有效
input wire link_up_i, // 来自 PHY 的链路状态
output reg link_up_o, // 控制器链路状态
input wire [31:0] data_in, // 输入数据
output reg [31:0] data_out, // 输出数据
input wire valid_in, // 输入数据有效
output reg ready_out, // 输出就绪
output reg valid_out // 输出数据有效
);
// 状态机定义
localparam IDLE = 2'b00;
localparam INIT = 2'b01;
localparam ACTIVE = 2'b10;
localparam ERROR = 2'b11;
reg [1:0] state, next_state;
// 状态寄存器
always @(posedge clk or negedge rst_n) begin
if (!rst_n)
state <= IDLE;
else
state <= next_state;
end
// 次态逻辑
always @(*) begin
next_state = state;
case (state)
IDLE: if (link_up_i) next_state = INIT;
INIT: if (&link_up_i) next_state = ACTIVE; // 简化:等待稳定
ACTIVE: if (!link_up_i) next_state = ERROR;
ERROR: if (link_up_i) next_state = INIT;
endcase
end
// 输出逻辑
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
link_up_o <= 1'b0;
data_out <= 32'b0;
valid_out <= 1'b0;
ready_out <= 1'b0;
end else begin
link_up_o <= (state == ACTIVE);
ready_out <= (state == ACTIVE);
if (valid_in && (state == ACTIVE)) begin
data_out <= data_in;
valid_out <= 1'b1;
end else begin
valid_out <= 1'b0;
end
end
end
endmodule逐行说明
- 第 1 行:模块声明,定义输入输出端口。clk 为 200 MHz 系统时钟,rst_n 为异步复位(低有效)。
- 第 2 行:link_up_i 来自物理层(PHY),表示底层链路已建立;link_up_o 是控制器输出的链路状态,用于上层模块。
- 第 3 行:data_in 和 data_out 为 32 位数据总线;valid_in/ready_out 实现握手(类似 AXI-Stream 的 TVALID/TREADY)。
- 第 4 行:状态机定义四个状态:IDLE(空闲)、INIT(初始化)、ACTIVE(活动)、ERROR(错误)。
- 第 5 行:状态寄存器采用异步复位,确保上电后进入 IDLE 状态。
- 第 6 行:次态逻辑组合电路,IDLE 下检测 link_up_i 为高时进入 INIT;INIT 下等待 link_up_i 稳定(简化:连续为高)后进入 ACTIVE。
- 第 7 行:ACTIVE 下若 link_up_i 变低则进入 ERROR;ERROR 下若 link_up_i 恢复则重新初始化。
- 第 8 行:输出逻辑在时钟上升沿更新,复位时清零所有输出;ACTIVE 状态下允许数据通道打开。
- 第 9 行:link_up_o 在 ACTIVE 状态时为高,ready_out 同样为高,表示控制器准备接收数据。
- 第 10 行:当 valid_in 为高且状态为 ACTIVE 时,将输入数据寄存到 data_out,并置位 valid_out 一个周期。
阶段三:时序与 CDC 约束
# top.xdc 约束片段
# 时钟约束
create_clock -period 5.000 [get_ports clk] # 200 MHz
set_clock_uncertainty 0.200 [get_clocks clk]
# 输入延迟约束(假设数据在时钟上升沿后 1 ns 到达)
set_input_delay -clock clk -max 1.000 [get_ports data_in*]
set_input_delay -clock clk -min 0.500 [get_ports data_in*]
# 输出延迟约束
set_output_delay -clock clk -max 1.500 [get_ports data_out*]
set_output_delay -clock clk -min 0.500 [get_ports data_out*]
# 异步复位约束(false path)
set_false_path -from [get_ports rst_n]逐行说明
- 第 1 行:定义 200 MHz 主时钟,周期 5 ns。这是时序分析的基础。
- 第 2 行:设置时钟不确定性为 200 ps,模拟时钟抖动与板级偏差。
- 第 3 行:输入延迟约束,假设外部数据在时钟上升沿后 1 ns(最大)或 0.5 ns(最小)到达,用于建立/保持时间分析。
- 第 4 行:输出延迟约束,要求数据在时钟上升沿后 1.5 ns 内稳定输出。
- 第 5 行:将异步复位端口设置为 false path,避免工具分析复位路径的时序(因为复位信号与时钟异步)。
阶段四:验证与仿真
- 编写 testbench:实例化 chiplet_link_ctrl,提供时钟(200 MHz)、复位(先低后高)、模拟 link_up_i 信号(先低后高)。
- 发送测试数据:在仿真中通过 valid_in 发送 32 位数据包(如 0xA5A5A5A5),观察 data_out 与 valid_out 是否匹配。
- 常见坑:仿真中 link_up_i 信号未正确模拟 PHY 行为,导致状态机卡在 INIT。排查方法:在 testbench 中手动拉高 link_up_i 并保持至少 10 个时钟周期。
原理与设计说明
Chiplet 互连协议的核心在于将多个裸片(Die)通过高速 SerDes 或并行总线连接,形成逻辑上统一的系统。在 FPGA 原型验证中,我们使用 FPGA 内部的 GTY 收发器模拟 Chiplet 的物理层,而上层协议(如 AXI-Stream)负责数据包的路由与流量控制。关键 trade-off 包括:
- 资源 vs Fmax:使用状态机实现链路控制器(如本示例)比使用硬核 IP 更灵活,但 LUT 消耗更高,Fmax 可能受限。建议在满足时序的前提下优先使用硬核(如 Xilinx 的 Die-to-Die Controller IP)。
- 吞吐 vs 延迟:增加数据位宽(如从 32 位改为 64 位)可提升吞吐,但会引入额外的流水线寄存器,增加延迟。对于延迟敏感的应用(如实时控制),建议保持窄位宽并优化握手逻辑。
- 易用性 vs 可移植性:使用厂商专用 IP(如 Xilinx 的 AXI-Stream IP)可快速集成,但迁移到其他平台(如 Intel Agilex)需重写接口逻辑。建议在顶层封装一层通用接口(如 AXI-Stream 标准),便于跨平台移植。
验证与结果
| 指标 | 测量值(示例) | 测量条件 |
|---|---|---|
| Fmax | 210 MHz | Vivado 2025.2,Versal XCVC1902,时序约束 5 ns |
| LUT 利用率 | 35% | 整个工程(含 Chiplet 控制器 + UART) |
| 触发器利用率 | 28% | 同上 |
| BRAM 利用率 | 15% | 用于数据缓冲 |
| 吞吐 | 12.8 Gbps | 32 位数据总线,200 MHz 时钟,连续传输 |
| 端到端延迟 | 85 ns | 从 valid_in 到 valid_out(17 个时钟周期) |
| 误码率 | < 1e-12 | 仿真 10^13 个数据包,无错误 |
注意:以上数值为示例或典型配置,以实际工程与数据手册为准。测量时需确保环境温度 25°C,核心电压 0.85V。
故障排查(Troubleshooting)
- 现象:综合报告显示时序违规(setup violation)。原因:时钟周期过紧或组合逻辑过深。检查点:查看关键路径的延迟报告。修复建议:在数据路径中插入流水线寄存器,或降低时钟频率。
- 现象:上板后 LINK_UP 指示灯不亮。原因:PHY 未正确初始化或约束错误。检查点:确认差分时钟输入引脚分配正确;检查 I/O 延迟约束。修复建议:重新运行实现并检查 I/O 分配。
- 现象:仿真中 valid_out 始终为低。原因:状态机未进入 ACTIVE 状态。检查点:查看 link_up_i 信号波形。修复建议:在 testbench 中确保 link_up_i 在复位释放后至少保持 10 个周期的高电平。
- 现象:数据吞吐低于预期。原因:握手信号(ready_out)未正确拉高。检查点:检查 ready_out 逻辑。修复建议:确保 ready_out 在 ACTIVE 状态下始终为高,或实现背压机制。
- 现象:比特流生成失败,提示“Routing congestion”。原因:资源利用率过高或布局不合理。检查点:查看资源利用率报告。修复建议:优化代码(减少 LUT 使用),或增加布局约束(如 pblock)。
- 现象:UART 输出乱码。原因:波特率不匹配或时钟分频错误。检查点:确认 UART IP 的时钟分频系数。修复建议:根据系统时钟(200 MHz)重新计算分频值(如 200 MHz / 115200 = 1736)。
- 现象:仿真中数据包 CRC 校验失败。原因:CRC 计算逻辑错误或数据位序不对。检查点:对比 CRC 算法与标准(如 CRC-32)。修复建议:使用 Xilinx CRC IP 核或参考 IEEE 802.3 标准。
- 现象:上板后温度过高。原因:FPGA 内部逻辑翻转率过高或散热不足。检查点:查看温度传感器读数。修复建议:降低时钟频率或增加门控时钟。
扩展与下一步
- 参数化设计:将数据位宽、FIFO 深度、状态机超时值等定义为参数,便于适配不同 Chiplet 配置。
- 带宽提升:使用多通道(如 4 通道)并行传输,总吞吐可达 50 Gbps 以上(示例值)。
- 跨平台移植:将设计迁移到 Intel Agilex 7 平台,使用其 Die-to-Die 接口 IP(如 F-Tile)。
- 加入断言与覆盖:在 testbench 中使用 SystemVerilog 断言(SVA)验证协议时序,并使用功能覆盖率收集链路状态跳转。
- 形式验证:使用工具(如 OneSpin)对 Chiplet 控制器进行形式化验证,确保状态机不会进入非法状态。
参考与信息来源
- Xilinx UG974: Versal ACAP Technical Reference Manual
- Xilinx PG344: Die-to-Die Controller LogiCORE IP Product Guide
- 大赛官方赛题文档(2026 FPGA 大赛 Chiplet 赛道)
- IEEE 802.3-2022: Standard for Ethernet (CRC-32 算法)
技术附录
术语表
- Chiplet:将大型 SoC 拆分为多个小芯片,通过互连协议集成。
- Die-to-Die (D2D):裸片间互连,通常使用 SerDes 或并行总线。
- AXI-Stream:ARM 定义的高性能流式数据传输协议。
- CDC (Clock Domain Crossing):跨时钟域同步,防止亚稳态。
检查清单
- 确认 EDA 工具版本与器件兼容
- 添加所有 RTL 源文件与约束文件
- 运行综合并检查无错误
- 运行实现并检查时序报告
- 上板前验证比特流生成成功
- 使用测试脚本验证功能与性能
关键约束速查
- 时钟周期:5 ns(200 MHz)
- 输入延迟:max 1.0 ns, min 0.5 ns
- 输出延迟:max 1.5 ns, min 0.5 ns
- 异步复位:false path



