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,432114,48016%
Registers(FF)12,760114,48011%
Memory bits(BRAM)1,048,5763,981,31226%
Embedded 9-bit multipliers(DSP)485329%

这张表的价值在于“比例判断”。如果 LUT 占用 16% 而 FF 占用 11%,说明组合逻辑相对偏重;如果 BRAM 占用 26% 而 LUT 只有 16%,说明设计是存储密集型,后续优化重点应放在存储结构而不是逻辑。编译报告还提供 Analysis & Synthesis 阶段的估算值和 Fitter 阶段的最终值,两者差异过大时,往往意味着综合推断与布局实现之间存在资源映射偏差,需要回到代码检查推断结果。

编译报告中的资源数字是“器件级”统计,不反映资源在芯片上的物理分布。两个设计可能 LUT 占用率相同,但一个集中在芯片一角导致布线拥塞,另一个均匀分布时序轻松。要判断这一点,必须进入 Chip Planner。

二、Chip Planner:把资源放到芯片上看

Chip Planner 是 Quartus 的物理布局视图工具,通过 Tools → Chip Planner 打开。它把器件内部按行列划分成 LAB(Logic Array Block)、M9K/M10K 存储块、DSP 块、IO 单元等物理资源,并用颜色标注每个位置的使用状态。默认视图下,蓝色表示已使用,灰色表示未使用,红色或橙色往往表示高扇出或拥塞区域。

使用 Chip Planner 分析资源时,建议按以下顺序操作:

  1. 在左侧 Task 面板选择 Resource Utilization 或 Logic Lock Regions,先看整体热力分布。
  2. 用 Find 功能定位关键模块,例如输入节点名 u_dsp_top|mult_gen,Chip Planner 会高亮该模块占用的所有 LAB 和 DSP 块。
  3. 观察 BRAM 是否被分散到多个 M9K 块中。如果代码中一个 8K×16 的 RAM 被拆成多个小块,说明推断粒度不理想,可考虑改用 altsyncram 原语或调整 ramstyle 属性。
  4. 检查 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 大量空闲,说明该区域组合逻辑密集;反之则说明寄存器密集。这种细粒度信息对局部优化非常有用。

资源利用率分析三视角协同 编译报告 Resource Utilization LUT 18,432 / 16% FF 12,760 / 11% BRAM 1,048,576 / 26% DSP 48 / 9% 总账:用量与占比 Chip Planner 物理布局视图 空间:分布与拥塞 Resource Property Viewer 层次与属性下钻 层次:u_dsp_top|mult 模式:mult_accum 输入寄存器:启用 占用 LAB:X12_Y8 细节:属性与配对 定位 下钻 典型判断链:从数字到结论 报告:DSP=0 但代码有乘法 Chip Planner 乘法落在 LAB Property Viewer 位宽 12 位不匹配 结论:改用 18×18 DSP 或调整位宽

四、把三种视图串成分析闭环

实际工程中,建议按“报告 → 定位 → 下钻 → 验证”的顺序使用这三件工具。先在编译报告中找到异常项,例如 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 的微观属性三者结合,才能从“用了多少”推进到“用在哪里、用得好不好”,为后续的时序优化和功耗优化提供可靠起点。