Addition/Substraction Yosys 中的优化

Addition/Substraction Optimization in Yosys

我有以下非常简单的 verilog 模块,它根据输入操作执行 a+b 或 a-b。

module addsub (a, b, op, r);
    parameter DATA_WIDTH = 4;
    input [DATA_WIDTH-1:0] a, b;
    input op;
    output [DATA_WIDTH-1:0] r;
    
    assign r = op ? a-b : a+b;
endmodule

现在,当我使用 yosys(版本 0.9,下面的脚本)合成此代码时,我得到两个 $alu 模块,均由输入 a 和 b 提供,其中一个模块的 CI 和 BI 输入已断言。输出 r 是使用多路复用器生成的。

read_verilog addsub.v
synth -flatten -run begin:fine
#share -aggressive; opt
show

但是,我想让 yosys 认识到只需要一个 $alu,其中 CI 和 BI 输入连接到 op。因此,我尝试了 share 命令(在上面的脚本中注释掉了),实际上这两个 $alus 合并为一个,但现在我在输入 a 和 b see here 处得到了一个奇怪的(冗余的)多路复用器结构。 =15=]

我的问题是我做错了什么,是否有特殊的通道来摆脱这些多路复用器,还是我完全走错了路?

David Shah 建议的解决方案: 我安装的 yosys 版本没有 opt_share 命令。因此,我编译了当前版本 (0.9+3558),现在以下合成脚本按预期工作:

read_verilog addsub.v
synth -flatten -run begin:fine
share -aggressive; opt
opt_share; opt
show

您正在寻找的通行证是 opt_share,但它可能比 0.9 版本更新,在这种情况下您需要 git master 的 Yosys。