You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止未接顶层输出的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:10:19