2. 开发环境与工具链搭建
PolarFire 算法加速工程不是“装一个 IDE 就能跑”的单工具任务,而是一条从 RTL/高层次综合到嵌入式软件、再到仿真验证与签核分析的完整工具链。理解这条链上各工具的职责边界与数据交接方式,比记住安装步骤更重要。本节围绕“装什么、怎么配、如何联调”展开,给出可执行的搭建路径。
工具链分工与数据流
Libero SoC 是 PolarFire 器件侧的“总装厂”:负责器件选型、约束、综合、布局布线、时序与功耗分析,并生成可供嵌入式软件使用的硬件平台描述。SmartHLS 把 C/C++ 算法综合为 RTL,再以 IP 形式导入 Libero。SoftConsole 面向 RISC-V 软核(如 Mi-V)或硬核处理器,负责固件开发与调试。ModelSim/Questa 承担 RTL 与混合语言仿真。时序与功耗分析则贯穿 Libero 的静态时序分析(STA)与 SmartPower 报告。
安装顺序与版本匹配
推荐顺序为:先装 Libero SoC(含器件族数据),再装 ModelSim/Questa(Libero 可调用其仿真库),随后装 SoftConsole,最后装 SmartHLS。关键约束是版本匹配:Libero 的仿真库需与 ModelSim/Questa 版本对应,否则会出现 vsim 找不到 polarfire 库的错误。安装后建议在 Libero 的 Project > Preferences > Simulation 中显式指定仿真器可执行文件路径,而不是依赖环境变量。
许可证方面,Libero 需要 Gold/Platinum 级别授权才能使用完整器件与 SmartHLS 流程;SoftConsole 与 ModelSim/Questa 各自有独立 license。建议在安装前用 lmutil lmstat -a -c <port>@<host> 确认 license 服务可达,避免装完后才发现无法综合。
环境变量与工程目录约定
为避免路径混乱,建议统一目录结构:D:/pf_work/<project>/hdl 放 RTL,/hls 放 SmartHLS 源与脚本,/softconsole 放固件工程,/sim 放 testbench 与波形,/reports 放时序与功耗报告。环境变量只需设置 PATH 追加 Libero、ModelSim、SoftConsole 的 bin 目录,以及 LM_LICENSE_FILE。不建议把器件库路径写进全局变量,交给 Libero 工程管理更稳妥。
SmartHLS 到 Libero 的交接
SmartHLS 工程通过 hls.tcl 描述综合目标。一个典型配置如下:
# hls.tcl 示例(参数为教学示例,非实测)
set_top fir_filter
add_files fir_filter.cpp
add_files -tb fir_filter_tb.cpp
create_clock -name clk -period 5.0
config_interface -m_axi_addr64=false
csynth_design
export_design -format libero -output fir_filter_ip
其中 -period 5.0 表示目标时钟 200 MHz,是综合的时序目标而非保证值。综合完成后导出为 Libero IP,在 Libero 中通过 Catalog > Add IP 导入,再在 SmartDesign 中连线。若综合报告显示 II(启动间隔)大于预期,应先回到 C 代码调整循环结构,而不是在 Libero 里硬调约束。
仿真联调:从功能到门级
功能仿真阶段,在 Libero 中生成仿真脚本后,用 ModelSim 执行 do run_sim.do,观察 testbench 中的激励与 DUT 输出。门级仿真需反标 SDF:在 vsim 命令中加入 -sdf max <path>/<design>_timing.sdf,并确保 sdf_annotate 的实例路径与网表层次一致。常见问题是 SDF 路径不匹配导致时序检查被跳过,此时波形“看起来正常”但实际未验证时序,必须检查仿真日志中是否有 sdf annotation completed。
时序与功耗分析要点
Libero 的 STA 报告需重点看四类路径:跨时钟域、输入到寄存器、寄存器到输出、寄存器到寄存器。判断依据是 WNS(最差负裕量)与 TNS(总负裕量):WNS 为负说明存在违例,需回到约束或 RTL 修正。功耗分析在 SmartPower 中完成,静态功耗由器件与配置决定,动态功耗需反标 VCD/SAIF 活动率。若未反标,工具按默认翻转率估算,结果偏乐观,不能作为签核依据。
可执行的搭建检查清单
| 检查项 | 判断依据 | 常见问题 |
|---|---|---|
| Libero 器件族可用 | 新建工程能看到 MPF 系列 | license 级别不足 |
| 仿真库映射 | vsim 能打开 polarfire 库 | 版本不匹配 |
| SmartHLS 导出 IP | Libero Catalog 可见该 IP | 接口协议不一致 |
| SoftConsole 连接目标 | OpenOCD 能识别 JTAG ID | 驱动或线序问题 |
| STA 无负裕量 | WNS ≥ 0 | 约束缺失或时钟定义错误 |
| 功耗反标成功 | 日志含 SAIF/VCD 读取记录 | 活动率文件路径错误 |