3. 资源利用率分析方法
在 FPGA 工程中,资源利用率分析不是“看一眼编译结果”这么简单。它要回答三个层次的问题:设计到底用了哪些资源、这些资源分布在芯片的什么位置、以及这种分布是否会影响时序收敛和后续迭代。Quartus 提供了三条互补的分析路径:Chip Planner 负责空间视角,Resource Property Viewer 负责层次与属性视角,编译报告负责汇总与趋势视角。三者结合,才能把 LUT、FF、BRAM、DSP 的使用情况看清楚。
一、编译报告:先建立资源总账
编译完成后,在 Compilation Report 中展开 Fitter → Resource Section → Resource Utilization,可以看到一张按模块层级汇总的资源表。它给出的是“总账”:每种资源用了多少、占器件总量的百分比、以及各子模块的分解。以某 Cyclone IV E(EP4CE115F29C7)工程为例,假设编译报告显示:
| 资源类型 | 使用量 | 器件总量 | 占用率 |
|---|---|---|---|
| Logic elements(LE/LUT) | 18,432 | 114,480 | 16% |
| Registers(FF) | 12,760 | 114,480 | 11% |
| Memory bits(BRAM) | 1,048,576 | 3,981,312 | 26% |
| Embedded 9-bit multipliers(DSP) | 48 | 532 | 9% |
这张表的价值在于“比例判断”。如果 LUT 占用 16% 而 FF 占用 11%,说明组合逻辑相对偏重;如果 BRAM 占用 26% 而 LUT 只有 16%,说明设计是存储密集型,后续优化重点应放在存储结构而不是逻辑。编译报告还提供 Analysis & Synthesis 阶段的估算值和 Fitter 阶段的最终值,两者差异过大时,往往意味着综合推断与布局实现之间存在资源映射偏差,需要回到代码检查推断结果。
二、Chip Planner:把资源放到芯片上看
Chip Planner 是 Quartus 的物理布局视图工具,通过 Tools → Chip Planner 打开。它把器件内部按行列划分成 LAB(Logic Array Block)、M9K/M10K 存储块、DSP 块、IO 单元等物理资源,并用颜色标注每个位置的使用状态。默认视图下,蓝色表示已使用,灰色表示未使用,红色或橙色往往表示高扇出或拥塞区域。
使用 Chip Planner 分析资源时,建议按以下顺序操作:
- 在左侧 Task 面板选择
Resource Utilization或Logic Lock Regions,先看整体热力分布。 - 用 Find 功能定位关键模块,例如输入节点名
u_dsp_top|mult_gen,Chip Planner 会高亮该模块占用的所有 LAB 和 DSP 块。 - 观察 BRAM 是否被分散到多个 M9K 块中。如果代码中一个 8K×16 的 RAM 被拆成多个小块,说明推断粒度不理想,可考虑改用
altsyncram原语或调整ramstyle属性。 - 检查 DSP 块是否被真正使用。若乘法器被综合成 LUT 逻辑而非 DSP,Chip Planner 中对应位置不会出现 DSP 块占用,此时应检查是否因位宽不匹配或复位方式导致 DSP 推断失败。
一个典型现象是:编译报告显示 DSP 使用量为 0,但代码中明明有乘法运算。进入 Chip Planner 后会发现乘法器全部落在 LAB 中,原因是操作数位宽为 12 位而 DSP 块支持 9×9 或 18×18,综合器选择了 LUT 实现。这类问题只有把“报告数字”和“物理位置”对照起来才能快速定位。
三、Resource Property Viewer:按层次和属性下钻
Resource Property Viewer 通常与 Chip Planner 联动使用。在 Chip Planner 中选中某个 LAB、DSP 或 BRAM 块后,打开 Resource Property Viewer,可以看到该物理资源的详细属性:所属层次路径、占用的逻辑单元编号、输入输出连接、以及该位置实现的寄存器数量。它解决的是“这个位置到底放了什么”的问题。
例如,选中一个 DSP 块后,Property Viewer 会显示它被哪个模块实例使用、工作模式是 mult_only 还是 mult_accum、输入寄存器是否启用。如果发现 DSP 的输入寄存器未启用,而设计又要求高频率,就可以回到代码中检查是否缺少输入寄存级,从而在资源不变的前提下改善时序。
Resource Property Viewer 的另一个用途是核对 FF 与 LUT 的配对关系。选中一个 LAB 后,可以看到其中每个逻辑单元的 LUT 和 FF 使用情况。如果某个 LAB 中 LUT 用满而 FF 大量空闲,说明该区域组合逻辑密集;反之则说明寄存器密集。这种细粒度信息对局部优化非常有用。
四、把三种视图串成分析闭环
实际工程中,建议按“报告 → 定位 → 下钻 → 验证”的顺序使用这三件工具。先在编译报告中找到异常项,例如 BRAM 占用率突然从 18% 跳到 26%,说明某次修改引入了新的存储推断;然后进入 Chip Planner 找到新增的 M9K 块位置,判断是否集中在某个区域;再用 Resource Property Viewer 查看该 BRAM 的端口配置和读写模式,确认是否与设计意图一致;最后回到代码或综合属性中调整,重新编译并对比报告数字。
需要特别注意的是,资源利用率分析不能只看总量。一个 LUT 占用 60% 但分布均匀的设计,可能比 LUT 占用 40% 但集中在两个 LAB 的设计更容易收敛。Chip Planner 中的拥塞热图、Property Viewer 中的局部 FF/LUT 比例,都是判断“资源是否用得好”的关键依据。把编译报告的宏观数字、Chip Planner 的空间分布、Property Viewer 的微观属性三者结合,才能从“用了多少”推进到“用在哪里、用得好不好”,为后续的时序优化和功耗优化提供可靠起点。