如何用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
相关产品推荐
相关产品推荐

