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

如何用Verilog基于Xilinx 7系列CARRY4实现占用单slice的4位加法器

Xilinx 7系列CARRY4实现4位可加减加法器的资源优化方案

占用LUT过多的核心原因

你当前代码逻辑本身是正确的,出现LUT占用过高的核心原因是Vivado综合器默认优化策略没有识别你手动例化CARRY4的设计意图,会将组合逻辑拆分、甚至对CARRY4原语做冗余转换,额外占用了不必要的LUT资源。

具体优化步骤

  • 给模块和CARRY4原语添加保留属性,禁止综合器优化你手动定义的结构:
    模块定义前添加(* keep_hierarchy = "yes" *),CARRY4例化前添加(* DONT_TOUCH = "yes" *),防止层次被打散、原语被修改。
  • 给所有输入输出端口添加(* KEEP = "YES" *)属性,避免未绑定引脚时综合器优化掉端口关联逻辑。
  • 关闭不必要的综合优化选项:在Vivado综合设置中,将resource_sharing(资源共享)设置为OFF,retiming(重定时)设置为OFF,避免综合器将加法逻辑拆分复用其他资源。
  • 若仅需作为子模块使用,不要将该加法器模块设为顶层进行综合,顶层模块的悬空端口会触发额外的优化逻辑。

优化后的参考代码

(* keep_hierarchy = "yes" *)
module fast_4adder(
    (* KEEP = "YES" *) input  wire [3:0]   a,
    (* KEEP = "YES" *) input  wire [3:0]   b,
    (* KEEP = "YES" *) input  wire         c_in,
    (* KEEP = "YES" *) input  wire         subtract,
    (* KEEP = "YES" *) output wire [3:0]   sum,
    (* KEEP = "YES" *) output wire         c_out);
    
    wire [3:0] b_sub;
    wire [3:0] carry;
    wire [3:0] prop;
    wire [3:0] gen;
    
    assign b_sub = b ^ {4{subtract}};
    assign gen = a & b_sub;
    assign prop = a ^ b_sub;
    assign c_out = carry[3];
        
    (* DONT_TOUCH = "yes" *)
    CARRY4 CARRY4_inst(
        .CO(carry),
        .O(sum),
        .CI(1'b0),  
        .CYINIT(c_in),
        .DI(gen),
        .S(prop));  
endmodule

效果验证

综合完成后打开综合后的设计视图,查看资源报告即可看到LUT占用为4个,且4个LUT和CARRY4原语会被映射到同一个SLICE中,符合你的设计预期。

内容的提问来源于stack exchange,提问作者Arne Cl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:24:02