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。
我有以下非常简单的 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。