为什么这个 MUX 带有 const。输入没有优化掉?
Why is this MUX with const. inputs not optimised away?
这是 的后续问题。
我正在使用 Yosys(版本 0.5+ (git sha1 f13e387, gcc 5.3.1-8ubuntu2 -O2 -fstack-protector-strong -fPIC -Os)
)和以下综合脚本:
read_liberty -lib my_library.lib
read_verilog test.v
hierarchy -check -top test
proc; opt; memory; opt; fsm -norecode; opt
techmap; opt
dfflibmap -liberty my_library.lib
abc -liberty my_library.lib -script \
+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put
hilomap -hicell LIB_TIEHI Y -locell LIB_TIELO Y
clean
write_verilog -noattr -noexpr output.v
stat
...合成以下 Verilog 代码 (test.v):
module mux4(
input i0, i1, i2, i3,
input s0, s1,
output z);
reg zint;
always @(*) begin
case ({s1, s0})
2'b00: zint = i0;
2'b01: zint = i1;
2'b10: zint = i2;
2'b11: zint = i3;
default: zint = i3;
endcase
end
assign z = zint;
endmodule
module test (
input a,b,c,d,
output result
);
mux4 inst (
.i0(a), .i1(b), .i2(c), .i3(d),
.s0(1'b0), .s1(1'b0), # constants here!
.z(result)
);
endmodule
综合结果包括一个 LIB_MUX4
实例,其中 S0
和 S1
被两个 LIB_TIELO
实例绑低。
为什么 Yosys 看不到 S0
和 S1
是常量并将输出减少为这样的东西
module test(a, b, c, d, result);
input a;
input b;
input c;
input d;
output result;
assign result = a;
endmodule
代替?
我尝试使用 clean -purge
、opt_muxtree
和 opt_clean
命令,但没有成功 - 静态 LIB_MUX
实例总是在生成的网表中。
如果你想跨层级优化,你需要运行flatten
。
您可能想 运行 opt -full
在 运行 宁 techmap
之前不久,但在 运行 宁 [=30= 之后] 优化如 fsm
和 share
.
JFYI:如果您不提供 运行 测试用例所需的所有文件,人们将无法重现您所说的内容。我没有你的my_library.lib
,所以我什至懒得尝试运行你的代码。
这是
我正在使用 Yosys(版本 0.5+ (git sha1 f13e387, gcc 5.3.1-8ubuntu2 -O2 -fstack-protector-strong -fPIC -Os)
)和以下综合脚本:
read_liberty -lib my_library.lib
read_verilog test.v
hierarchy -check -top test
proc; opt; memory; opt; fsm -norecode; opt
techmap; opt
dfflibmap -liberty my_library.lib
abc -liberty my_library.lib -script \
+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put
hilomap -hicell LIB_TIEHI Y -locell LIB_TIELO Y
clean
write_verilog -noattr -noexpr output.v
stat
...合成以下 Verilog 代码 (test.v):
module mux4(
input i0, i1, i2, i3,
input s0, s1,
output z);
reg zint;
always @(*) begin
case ({s1, s0})
2'b00: zint = i0;
2'b01: zint = i1;
2'b10: zint = i2;
2'b11: zint = i3;
default: zint = i3;
endcase
end
assign z = zint;
endmodule
module test (
input a,b,c,d,
output result
);
mux4 inst (
.i0(a), .i1(b), .i2(c), .i3(d),
.s0(1'b0), .s1(1'b0), # constants here!
.z(result)
);
endmodule
综合结果包括一个 LIB_MUX4
实例,其中 S0
和 S1
被两个 LIB_TIELO
实例绑低。
为什么 Yosys 看不到 S0
和 S1
是常量并将输出减少为这样的东西
module test(a, b, c, d, result);
input a;
input b;
input c;
input d;
output result;
assign result = a;
endmodule
代替?
我尝试使用 clean -purge
、opt_muxtree
和 opt_clean
命令,但没有成功 - 静态 LIB_MUX
实例总是在生成的网表中。
如果你想跨层级优化,你需要运行
flatten
。您可能想 运行
opt -full
在 运行 宁techmap
之前不久,但在 运行 宁 [=30= 之后] 优化如fsm
和share
.JFYI:如果您不提供 运行 测试用例所需的所有文件,人们将无法重现您所说的内容。我没有你的
my_library.lib
,所以我什至懒得尝试运行你的代码。