Quartus 资源不够放不下速查:Fitter 报错与资源回收的排查主线
更新时间:2026-10-23。FAQ 速查页,属于 FPGA 工具报错排错系列。Quartus 在 Analysis and Synthesis 阶段通常一切顺利,一进 Fitter 就报「放不下」,是新手最容易懵的一类失败:工程明明编译过大半,最后死在布局布线。这类报错的真相几乎总是某一种资源类型被打满——逻辑单元、RAM 块、DSP 块、引脚、I/O bank,任何一类超了 Fitter 都直接放弃。本篇给出报错原文、分流图与逐项回收动作;编译时间层面的「卡住不动」是另一类问题,见 Quartus 编译卡死速查。
本文要回答的问题
Error (170012): Can't place design到底是哪类资源不够?- 总逻辑利用率没到 100%,为什么照样布局失败?
- 怎么判断 RAM 被推断成了寄存器而不是 M9K/M10K 块?
- 乘法器没进 DSP 硬核时去哪里确认?
- 不换器件的前提下有哪些立即可做的降载手段?
一、报错原文与现象
Fitter 阶段失败,典型原文如下(器件与数值为示意):
Error (170012): Fitter cannot place the design.
Info (170028): Fitter performed Auto Fit compilation. Optimizations may
have affected the design's performance.
Error (170040): Can't place all RAM cells in design
Error (170084): Can't route design because device is too full
Error (171000): Can't fit design in device
Warning (15714): Some pins have incomplete I/O assignments
Error (171169): Can't place 39 pins in pin location because ...
I/O bank voltage requirement conflictCompilation Report 的 Fitter → Resource Section → Resource Usage Summary 里会看到某一行刺眼的超百读数:Total logic elements 105%、Total memory bits 124%、Embedded Multiplier 9-bit elements 100%、Total pins 溢出。最常见的迷惑点:逻辑单元只到 80%,但 Memory bits 一栏 130%——FPGA 资源不能跨类型拆借,LE 再有富余也救不了 RAM 块打满。
还有一个容易误读的细节:Analysis and Synthesis 阶段给出的资源估算是「网表名义值」,Fitter 之后才是真实落位值,两者之间常有百分之几的浮动——估算 95% 看似安全,落位后局部拥塞照样报 170012。所以评估余量一律以 Fitter 后的 Usage Summary 为准,综合估算只当早期预警看。
二、排查决策流程图
先看 Report 里哪一栏破百,再进对应通道,这是唯一正确的顺序。
读这张图抓住主线:红色是入口现象与「确实装不下」的最后判决,蓝色是按资源类型分诊的四条通道,橙色是对应的回收动作,紫色是沉淀。千万不要在没看 Report 的情况下先动手改代码——逻辑超了去调引脚、RAM 超了去砍乘法器,都是改错通道白跑一轮几十分钟的编译。
三、病因速查表
| 现象 / 报错锚点 | 根因 | 一判据 | 处置方向 |
|---|---|---|---|
| Error 170012 + LE 一栏超 100% | 器件选型偏小或逻辑确实过多 | Resource Usage Summary 的 Total logic elements | 砍功能、降并行度、换大器件 |
| Memory bits 破百,LE 反而低 | RAM 推断成寄存器阵列,或真超 | RAM Summary 里是否有大块进 registers | 修推断、显式 ramstyle、上块 RAM |
| Embedded Multiplier 打满且 LE 异常高 | 乘法器没进 DSP 硬核 | DSP Block Usage 与乘法器数量对不上 | 按推断模板重写乘法、对齐位宽 |
| Error 171169 引脚放不下 | 引脚规划冲突、专用脚被占 | Pin Planner 里有红色非法分配 | 重排引脚、释放专用时钟脚 |
| I/O bank voltage conflict | 同 bank 引脚电压不兼容 | 报告列出冲突 bank 与 VCCIO 组 | 按电压分组重排或换封装 |
| 每类都没超但整体报 too full | 资源碎片、时钟网络或 LAB 放不下 | Fitter messages 的详细瓶颈段 | 开 Physical Synthesis、降扇出 |
| Auto Fit 信息后出现 170012 | 优化仍救不回来 | 170028 提示优化已介入 | 走真实降载,不靠优化硬塞 |
表中不写具体器件容量数字——各型号 LE、M9K/M10K、DSP 数量差异大,以所用器件手册与 Report 实测为准。
四、逐条排查
逻辑单元超了。 先在 Report 的 Fitter → Resource Section 里按实体(design entity)排序,找到占用最大的模块从大头砍起。常见可收的口子:状态机编码从 one-hot 改 binary(寄存器数量直接降一个量级);大位宽总线改窄;并行处理单元改时分复用;确认没有重复例化。同时到 Assignments → Settings → Compiler Settings 确认 Auto DSP Block Replacement 与 Auto RAM Replacement 打开——默认设置下 Quartus 已会尽量把乘法和存储往硬核塞,但老工程或手动关掉的设置会让它们白白落在 LE 里。
RAM 破百。 这是 Quartus 资源问题里性价比最高的一条修复通道:很多工程把大数组写成了异步读或带同步复位,综合器无法映射进 M9K/M10K 块,退化成上千个寄存器,Memory bits 一栏没涨多少、LE 却爆炸。判据是看 RAM Summary:大数组出现在「Implemented in registers」一栏即中招。修法是读口加寄存、去掉复位路径,或用 (* ramstyle = "M9K" *) 显式指定目标块。ROM 同理用 romstyle 引导进块 RAM。
DSP 打满。 乘法器没进硬核的两个常见原因:位宽超过单块能力又没写流水线让工具拆分;或者操作数带工具不认的组合逻辑。对照器件手册的 DSP 推断模板改写,必要时显式例化 megafunction。反过来也要注意:有些乘法其实位宽很小(如 8 乘 8),与其让它们继续占 DSP 块,不如强制走 LE((* multstyle = "logic" *))把硬核留给真正的大乘法——DSP 打满但 LE 有余时,这是免费的一笔回收。
引脚与 bank。 Pin Planner 里红色条目逐条处理:专用时钟输入脚被普通信号占了就释放;同 bank 电压不兼容(如 3.3V 与 1.8V 混排)按电压分组重排;实在不够就只能换大封装,这条没有软件解。
各类都没超却报 too full。 这是碎片化场景:LAB 级别的局部拥塞、时钟网络超限或布线资源紧张。开 Physical Synthesis(Settings → Compiler Settings → Advanced Settings,Fitter 选项里允许 netlist 级优化),降关键信号扇出,必要时对设计做 floorplan 约束把大模块钉住。此时「超时没收敛」与「资源碎片化」经常混在一起,分辨口径见 Quartus 编译卡死速查。
五、防复发
- 每次编译归档 Resource Usage Summary,红线按单类型设(建议各类 80%),不看总表均值。
- 新模块评审时对照推断模板写 RAM 与乘法器,声明处即写 ramstyle,把推断坑消灭在综合前。
- 器件选型留余量:估算资源时按预期值的 1.3 倍选档,留出后期加功能的空间。
- 引脚规划先行:原理图阶段就锁 bank 电压分组与专用脚,别等 RTL 写完再倒挤。
- 第三方 IP 入工程前先单独编译一次记底数:很多「莫名放不下」是新引入的 IP 把 RAM 或 DSP 一口气吃掉大半,有底数才能一眼定位是谁的锅。
- 确实要换型时直接换大一号器件,比在 98% 利用率下死磕 Fitter 便宜得多。
这一篇在知识体系里的位置
本篇是 FPGA 工具排错速查簇中「资源触顶」的 Quartus 侧分流页:编译不失败但跑不满时间是 Quartus 编译卡死速查 的地盘;同类问题在 Vivado 侧的对应物(LUT/BRAM 爆了的修复细节)见 Vivado 资源超限速查,两边推断坑的思路同构,可以对照阅读。
一句话总结
Quartus 报 Error 170012 时先别动代码,打开 Fitter 资源摘要找破百的那一栏:LE 超了砍逻辑、开 Auto DSP/RAM 替换;Memory bits 超了九成大数组被推断成寄存器,改同步读加 ramstyle 让它进 M9K/M10K;DSP 打满对照推断模板重写乘法;引脚或 bank 冲突在 Pin Planner 里按电压分组重排;各类都没超却 too full 是碎片化,开 Physical Synthesis;真装不下就换大器件,并把单类型利用率红线归档成纪律。