【发布时间】:2020-12-22 17:22:47
【问题描述】:
我有以下非常简单的 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 处得到了一个奇怪的(冗余)多路复用器结构。
我的问题是我做错了什么,是否有特殊的通行证可以摆脱这些多路复用器,还是我完全走错了路?
David Shah 建议的解决方案: 我安装的 yosys 版本没有 opt_share 命令。因此,我编译了当前版本(0.9+3558),现在以下合成脚本可以正常工作:
read_verilog addsub.v
synth -flatten -run begin:fine
share -aggressive; opt
opt_share; opt
show
【问题讨论】: