github.com/cliffordwolf/yosys/blob/master/techlibs/ice40/...

ьзуя следующий скрипт, я синтезирую в стандартную библиотеку ячеек, для которой у меня есть файл 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

Хотя это обычно работает, я обнаружил, что некоторая логика не отображается эффективно. Например, у меня есть следующая модель 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 ячейка, но я обеспокоен тем, что могут быть другие (более сложные) области моего дизайна, где такое ручное отображение не столь очевидно и / или невозможно.

Я попытался добавить следующую опцию кabc команда в моем сценарии синтеза, которыйЯ нашел на Reddit:

-script +strash;scorr;ifraig;retime,{D};strash;dch,-f;map,-M,1,{D}

Но это тоже не решило проблему. (Также я не смог найти какую-либо документацию по некоторым из этих команд ABC, любая помощь там была бы признательна.)

Ответы на вопрос(1)

Ваш ответ на вопрос