Verilog译码器映射为AND/OR/NAND/XOR/NOT标准单元实现方法
4输入20位译码器映射到基础标准逻辑单元的实现方案
原设计源码
module my_decoder( input [3:0] in, output reg[19:0] out ); always@(*) begin case (in) 4'd0: out= 20'd114912; 4'd1: out= 20'd114912; 4'd2: out= 20'd180324; 4'd3: out= 20'd409644; 4'd4: out= 20'd917535; 4'd5: out= 20'd395532; 4'd6: out= 20'd137988; 4'd7: out= 20'd16128; 4'd8: out= 20'd16128; 4'd9: out= 20'd16128; 4'd10: out= 20'd137988; 4'd11: out= 20'd395532; 4'd12: out= 20'd917535; 4'd13: out= 20'd409644; 4'd14: out= 20'd180324; 4'd15: out= 20'd114912; endcase end endmodule
已尝试方案的可行调整技巧
Sympy生成逻辑表达式优化
默认SOP/POS生成逻辑不会主动提取XOR结构,做两个调整即可解决:
- 调用逻辑最小化接口时开启XOR允许参数,比如使用
sympy.logic.minimize函数时传入allow_xor=True,工具会自动识别可替换为XOR的对称子项,大幅降低表达式复杂度。 - 生成最小化表达式后不需要额外工具做NAND转换,直接按照德摩根定律改写即可:两级SOP结构可以直接映射为两级NAND结构,所有与项替换为NAND输出加一级反相,或项替换为输入反相的NAND,反相器本身可以用输入短接的NAND实现,不需要单独保留NOT门的优化流程。
你当前设计本身存在强对称性:输出满足out(in) = out(in ^ 4'b1111),也就是输入按位取反时输出完全一致,提取这个XOR公共项后,逻辑规模可以直接缩减一半。
Vivado综合流程调整
不要使用默认面向FPGA的综合配置,按以下步骤设置即可输出纯门级网表:
- 新建工程时目标器件选择
Generic(通用工艺),不要选择具体FPGA型号。 - 综合设置中关闭LUT映射选项,开启
use_xor_gates、use_nand_gates优化开关,优化策略选择Area(面积优先)。 - 综合完成后执行
write_verilog -mode gate命令,导出的网表就仅包含NOT、AND、OR、NAND、XOR五类基础单元,不会出现LUT结构。
Yosys综合流程简化
不需要编写带物理参数的完整.lib库,仅需编写一个只包含逻辑功能描述的极简单元库即可,整个文件内容不超过20行,示例结构如下:
library(generic_gates) { cell(not) { pin(A) { direction: input; } pin(Y) { direction: output; function: "~A"; } } cell(and2) { pin(A,B) { direction: input; } pin(Y) { direction: output; function: "A & B"; } } cell(or2) { pin(A,B) { direction: input; } pin(Y) { direction: output; function: "A | B"; } } cell(nand2) { pin(A,B) { direction: input; } pin(Y) { direction: output; function: "~(A & B)"; } } cell(xor2) { pin(A,B) { direction: input; } pin(Y) { direction: output; function: "A ^ B"; } } }
写好库文件后,在yosys中依次执行以下脚本即可完成映射:
read_verilog my_decoder.v hierarchy -check proc; opt; techmap -map 你的极简库文件路径 opt_clean write_verilog gate_level_decoder.v
整个配置过程耗时不超过10分钟,远低于完整.lib编写的工作量。
低工作量优化路径
由于设计只有4位输入,总共仅16种输入组合,不需要完全依赖EDA工具优化,可以先做人工结构提取再配合工具映射:
- 第一步先利用对称性做输入变换:令
s = in[3],低3位a[2:0] = in[2:0] ^ {3{s}},变换后所有输出仅和a有关,和s无关,直接把需要优化的逻辑从4输入降为3输入,规模砍半。 - 第二步对3位输入的8种组合,逐位列出输出真值表,3输入逻辑的最优门级实现可以直接通过固定的3输入逻辑最优映射表得到,不需要复杂算法优化。
- 第三步统一做NAND转换,把所有AND/OR结构替换为NAND实现,最终结果完全符合单元使用要求。
内容的提问来源于stack exchange,提问作者gudise
相关产品推荐
相关产品推荐

