组合合成:更好的技术映射结果

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 的新默认脚本。