4. Lattice Diamond与Radiant测试工程环境
Lattice 的两代主流 FPGA 开发工具——Diamond 与 Radiant——在测试工程的组织方式上差异明显。Diamond 面向 MachXO2/3、ECP5、iCE40 等较早期器件,采用"工程 + 策略 + 约束"的传统结构;Radiant 面向 MachXO3D/4、CrossLink-NX、Certus-NX/Pro、Avant 等新器件,采用"工程 + 策略 + 约束 + 时序分析 + 编程"一体化流程。理解两者的工程创建、约束管理、时序分析与编程文件生成路径,是搭建可复现测试环境的前提。
一、工程创建:从器件选型到目录结构
Diamond 中新建工程通过 File → New → Project 向导完成,关键输入是器件系列、具体型号、速度等级、封装与温度等级。例如测试 MachXO3LF 时选择 LCMXO3LF-6900C-5BG256C,其中 5 表示速度等级,C 表示商业级。工程目录下会自动生成 .ldf 工程文件、.lpf 约束文件、impl1 实现目录与 *.prj 源文件列表。Radiant 中对应的是 .rdf 工程文件、.ldc 约束文件与 impl_1 目录,器件选型粒度更细,例如 LIFCL-40-9BG256C 中的 9 表示速度等级。
测试工程与量产工程的一个关键区别是:测试工程通常需要保留可切换的调试端口、可配置的时钟源和可观测的测试点,因此建议在工程创建阶段就规划好目录结构,把 RTL、约束、脚本、激励文件、输出文件分开放置,便于后续自动化调用。
二、约束文件管理:LPF 与 LDC 的差异
Diamond 使用 LPF(Lattice Preference File),Radiant 使用 LDC(Lattice Design Constraints),两者语法相近但关键字与支持范围不同。测试工程中最常用的约束包括:引脚位置约束、IO 标准约束、时钟频率约束、时序例外约束。
# Diamond LPF 示例
LOCATE COMP "clk_50m" SITE "P3";
IOBUF PORT "clk_50m" IO_TYPE=LVCMOS33;
FREQUENCY PORT "clk_50m" 50 MHz;
LOCATE COMP "test_out[0]" SITE "R1";
IOBUF PORT "test_out[0]" IO_TYPE=LVCMOS33 DRIVE=8;
# Radiant LDC 示例
ldc_set_location -site {P3} [get_ports clk_50m]
ldc_set_port -iobuf {IO_TYPE=LVCMOS33} [get_ports clk_50m]
create_clock -name clk_50m -period 20 [get_ports clk_50m]
ldc_set_location -site {R1} [get_ports test_out[0]]
约束管理最容易出问题的地方是引脚复用与 IO 标准冲突。测试工程中常把多个功能映射到同一组引脚,若 LPF/LDC 中未显式声明 IO_TYPE,工具会按默认值推断,导致实际电平与预期不符。建议在约束文件顶部集中定义所有 IO 标准,并在每次修改后运行一次约束检查。
三、时序分析与编程文件生成
Diamond 的时序分析通过 Timing Analysis 视图完成,输入是 .lpf 中的时钟约束与实现后的 .ncd 文件,输出是建立/保持时间报告与时钟域交叉报告。Radiant 的 Timing Analyzer 基于 SDC 风格约束,报告更接近通用 EDA 流程。测试工程中应重点关注三类路径:跨时钟域路径、异步复位路径、IO 输入输出路径。
编程文件生成方面,Diamond 输出 .jed(JTAG 下载)与 .bin(配置 Flash),Radiant 输出 .bit 与 .bin。测试工程通常需要同时保留 JTAG 下载文件和 Flash 配置文件,前者用于快速迭代,后者用于模拟真实上电流程。
四、测试相关工具链集成
Diamond 的测试工具链以 Reveal Analyzer 为核心,通过 JTAG 在运行时抓取内部信号,配合 Programmer 完成下载与 Flash 烧写。Radiant 在此基础上增加了 Power Calculator 与更完整的 IP 集成流程,Reveal Analyzer 的触发条件配置也更灵活。测试工程中建议把 Reveal 的触发信号、采样深度、时钟域配置写入独立的 .rvl 文件,与主约束分离,避免调试配置污染量产约束。
五、可复现测试工程检查清单
| 检查项 | Diamond 对应 | Radiant 对应 | 判断依据 |
|---|---|---|---|
| 器件型号与速度等级 | .ldf 中器件配置 | .rdf 中器件配置 | 与实物丝印一致 |
| IO 标准集中声明 | .lpf 顶部 IOBUF 段 | .ldc 顶部 ldc_set_port 段 | 无默认推断告警 |
| 时钟约束完整 | FREQUENCY 覆盖所有时钟 | create_clock 覆盖所有时钟 | 时序报告无未约束时钟 |
| 跨时钟域路径 | Timing Analysis 报告 | Timing Analyzer 报告 | 无未处理 CDC 告警 |
| 编程文件双版本 | .jed + .bin | .bit + .bin | JTAG 与 Flash 均可下载 |
| 调试配置独立 | .rvl 独立文件 | .rvl 独立文件 | 移除后不影响功能 |
实际搭建时,建议先用一个最小工程(仅时钟输入 + 一个计数器输出到测试引脚)验证工具链是否完整:工程能创建、约束能生效、时序能分析、编程文件能生成、板级能观测。这个最小闭环跑通后,再逐步加入被测逻辑与调试端口,可以显著降低环境问题与设计问题混杂带来的排查难度。