组合合成:更好的技术映射结果
Combinatorial synthesis: Better technology mapping results
使用以下脚本,我正在合成一个标准单元库,我有一个 lib 文件,my_library.lib
:
read_liberty -lib my_library.lib
script yosys_readfiles.ys
proc; opt; memory; opt; fsm -norecode; opt
techmap; opt
dfflibmap -liberty my_library.lib
abc -liberty my_library.lib
hilomap -hicell LIB_TIEHI Y -locell LIB_TIELO Y
clean
write_verilog -noattr -noexpr output.v
stat
虽然这通常有效,但我发现某些逻辑没有有效映射。例如,我有以下 4 路多路复用器的 Verilog 模型:
module mux4(
input i0,
input i1,
input i2,
input i3,
input s0,
input s1,
output z
);
reg zint;
parameter tdelay = `default_gate_delay;
always @(i0 or i1 or i2 or i3 or s0 or s1) 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
Yosys 将其合成为以下门级网表:
/* Generated by Yosys 0.5+ (git sha1 f13e387, gcc 5.3.1-8ubuntu2 -O2 -fstack-protector-strong -fPIC -Os) */
module mux4(i0, i1, i2, i3, s0, s1, z);
wire _00_;
wire _01_;
wire _02_;
wire _03_;
wire _04_;
wire _05_;
input i0;
input i1;
input i2;
input i3;
input s0;
input s1;
output z;
wire zint;
NAND3 _06_ (
.A(s1),
.B(s0),
.C(i3),
.Y(_04_)
);
INV _07_ (
.A(s1),
.Y(_05_)
);
NAND3 _08_ (
.A(_05_),
.B(s0),
.C(i1),
.Y(_00_)
);
INV _09_ (
.A(s0),
.Y(_01_)
);
NAND3 _10_ (
.A(_05_),
.B(_01_),
.C(i0),
.Y(_02_)
);
NAND3B _11_ (
.AN(s0),
.B(s1),
.C(i2),
.Y(_03_)
);
NAND4 _12_ (
.A(_02_),
.B(_00_),
.C(_03_),
.D(_04_),
.Y(z)
);
assign zint = z;
endmodule
因为我正在使用的库已经有一个 MXI4
单元格,所以我希望得到类似于以下内容的内容:
module mux4(i0, i1, i2, i3, s0, s1, z);
input i0;
input i1;
input i2;
input i3;
input s0;
input s1;
output z;
MXI4 _12_ (
.A(i0),
.B(i1),
.C(i2),
.D(i3),
.S0(s0),
.S1(s1),
.Y(z)
);
endmodule
我想知道如何指示 Yosys 使用 MXI4
单元而不是上面的级联 NAND 实例,因为这会导致面积显着减少。
虽然对于这个特定的单元格,我可以使用 手动映射到 MXI4
单元格,但我担心我的设计中可能还有其他(更复杂的)区域需要这样的手动映射不那么明显 and/or 不可行。
我尝试的一件事是将以下选项添加到我的综合脚本中的 abc
命令,I found on Reddit:
-script +strash;scorr;ifraig;retime,{D};strash;dch,-f;map,-M,1,{D}
但是也没有解决问题。 (我也找不到关于其中一些 ABC 命令的任何文档,如果有任何帮助,我们将不胜感激。)
以下 ABC 脚本应该能够映射 MUX4,或者至少在使用与 Yosys 0.7 捆绑在一起的 ABC 版本时是这样的:
abc -liberty my_library.lib -script \
+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put
从 git commit 8927e19 开始,这是 abc -liberty
的新默认脚本。
使用以下脚本,我正在合成一个标准单元库,我有一个 lib 文件,my_library.lib
:
read_liberty -lib my_library.lib
script yosys_readfiles.ys
proc; opt; memory; opt; fsm -norecode; opt
techmap; opt
dfflibmap -liberty my_library.lib
abc -liberty my_library.lib
hilomap -hicell LIB_TIEHI Y -locell LIB_TIELO Y
clean
write_verilog -noattr -noexpr output.v
stat
虽然这通常有效,但我发现某些逻辑没有有效映射。例如,我有以下 4 路多路复用器的 Verilog 模型:
module mux4(
input i0,
input i1,
input i2,
input i3,
input s0,
input s1,
output z
);
reg zint;
parameter tdelay = `default_gate_delay;
always @(i0 or i1 or i2 or i3 or s0 or s1) 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
Yosys 将其合成为以下门级网表:
/* Generated by Yosys 0.5+ (git sha1 f13e387, gcc 5.3.1-8ubuntu2 -O2 -fstack-protector-strong -fPIC -Os) */
module mux4(i0, i1, i2, i3, s0, s1, z);
wire _00_;
wire _01_;
wire _02_;
wire _03_;
wire _04_;
wire _05_;
input i0;
input i1;
input i2;
input i3;
input s0;
input s1;
output z;
wire zint;
NAND3 _06_ (
.A(s1),
.B(s0),
.C(i3),
.Y(_04_)
);
INV _07_ (
.A(s1),
.Y(_05_)
);
NAND3 _08_ (
.A(_05_),
.B(s0),
.C(i1),
.Y(_00_)
);
INV _09_ (
.A(s0),
.Y(_01_)
);
NAND3 _10_ (
.A(_05_),
.B(_01_),
.C(i0),
.Y(_02_)
);
NAND3B _11_ (
.AN(s0),
.B(s1),
.C(i2),
.Y(_03_)
);
NAND4 _12_ (
.A(_02_),
.B(_00_),
.C(_03_),
.D(_04_),
.Y(z)
);
assign zint = z;
endmodule
因为我正在使用的库已经有一个 MXI4
单元格,所以我希望得到类似于以下内容的内容:
module mux4(i0, i1, i2, i3, s0, s1, z);
input i0;
input i1;
input i2;
input i3;
input s0;
input s1;
output z;
MXI4 _12_ (
.A(i0),
.B(i1),
.C(i2),
.D(i3),
.S0(s0),
.S1(s1),
.Y(z)
);
endmodule
我想知道如何指示 Yosys 使用 MXI4
单元而不是上面的级联 NAND 实例,因为这会导致面积显着减少。
虽然对于这个特定的单元格,我可以使用 MXI4
单元格,但我担心我的设计中可能还有其他(更复杂的)区域需要这样的手动映射不那么明显 and/or 不可行。
我尝试的一件事是将以下选项添加到我的综合脚本中的 abc
命令,I found on Reddit:
-script +strash;scorr;ifraig;retime,{D};strash;dch,-f;map,-M,1,{D}
但是也没有解决问题。 (我也找不到关于其中一些 ABC 命令的任何文档,如果有任何帮助,我们将不胜感激。)
以下 ABC 脚本应该能够映射 MUX4,或者至少在使用与 Yosys 0.7 捆绑在一起的 ABC 版本时是这样的:
abc -liberty my_library.lib -script \
+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put
从 git commit 8927e19 开始,这是 abc -liberty
的新默认脚本。