如何防止未接顶层输出的DSP模块被Quartus综合优化移除?
解决Quartus Prime保留未接输出引脚的全部DSP模块的方法
针对Intel Stratix 10 FPGA和Quartus Prime Pro 21.4的场景,以下是几种可行的方案,确保所有3000个DSP模块被综合保留:
1. 给DSP实例添加preserve属性约束
直接在HDL代码中给每个DSP实例标记preserve属性,强制综合器不优化该模块:
generate for (genvar i=0; i<3000; i=i+1) begin : u_dsp_array // 标记该DSP实例不被优化 (* preserve *) dsp_mult u_dsp ( .a(dsp_a[i]), .b(dsp_b[i]), .q(dsp_q[i]) ); end endgenerate
也可以通过Quartus的Tcl约束全局配置:
# 在.qpf或约束文件中添加,匹配所有DSP实例 set_instance_assignment -name PRESERVE_REGISTER ON -to u_dsp_array[*]
2. 构建DSP自循环链路
将每个DSP的输出延迟后反馈到自身输入,让综合器认为信号处于持续使用状态:
reg [31:0] dsp_feedback[3000]; generate for (genvar i=0; i<3000; i=i+1) begin : u_dsp_array dsp_mult u_dsp ( .a(dsp_feedback[i]), .b({32{1'b1}}), // 固定输入全1,确保DSP持续运算 .q(dsp_q[i]) ); // 输出延迟一拍后反馈到输入 always @(posedge clk) begin dsp_feedback[i] <= dsp_q[i]; end end endgenerate
这种方式让每个DSP始终处于工作状态,综合器不会判定为“无用逻辑”。
3. 全局异或消耗所有DSP输出
把所有DSP的输出做全局异或运算,结果存入一个带keep属性的寄存器,避免被优化:
// 标记该寄存器不被优化 (* keep *) reg dummy; wire [31:0] dsp_q[3000]; wire all_xor; // 把所有DSP输出逐位异或,生成一个单bit信号 assign all_xor = ^dsp_q; always @(posedge clk) begin dummy <= all_xor; end
3000个DSP的异或运算会被综合器处理为树形结构,不会产生过大的时序压力,同时能让所有DSP输出被“使用”。
4. 调整Quartus综合全局设置
- 进入
Assignment > Settings > Compiler Settings > Synthesis Settings,将Optimization Technique改为Area(面积优先),降低综合器的优化优先级。 - 在More Settings中关闭
Remove Unused Logic选项,全局禁用无用逻辑移除(建议配合实例级约束使用,避免保留无关资源)。
内容的提问来源于stack exchange,提问作者sealenator
相关产品推荐
相关产品推荐

