Как создать собственную карту ячейки технологии для Yosys - PullRequest
1 голос
/ 10 февраля 2020

У меня есть следующий простой дизайн Verilog (в test.v):

module digital (
  input a, b, c,
  output reg q
);
  wire ena = a & b;
  always @ (ena, c) begin
    if (ena)
      q <= c;
  end
endmodule

, который моделирует простую защелку с затвором на входе ena. Я использую следующий сценарий Yosys TCL:

yosys -import
set name digital
set libfile my_tech.lib
read_liberty -lib $libfile
read_verilog test.v
hierarchy -check -top ${name}
procs; opt
memory; opt
fsm -norecode; opt -full
techmap; opt -full
dfflibmap -liberty $libfile
opt
abc -liberty $libfile \
    -script {+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put}
hilomap -hicell TIEHIM Y -locell TIELOM Y
clean -purge
write_verilog ${name}_synth.v

Несмотря на то, что DFF отображаются нормально (я пробовал с другим дизайном), полученный файл Verilog содержит экземпляр ячейки \$_DLATCH_P_.

Поэтому я попытался следовать примечанию в этом комментарии , т.е. записать файл пользовательской карты технологий, чтобы сопоставить защелки Yosys с данными из библиотеки технологий:

1. Используя шаблон, полученный из команды yosys help $dlatch+ и просматривая некоторые примеры в встроенной технической карте Yosys , я создал файл отображения, который я считаю test_map.v для использования TLATX1M защелка ячейки библиотеки:

(* techmap_simplemap *)
(* techmap_celltype = "$dlatch" *)
module _library_latch (EN, D, Q);

    parameter WIDTH = 0;
    parameter EN_POLARITY = 1'b1;

    input EN;
    input [WIDTH-1:0] D;
    output reg [WIDTH-1:0] Q;

    genvar i;
    generate begin
        for (i = 0; i < WIDTH; i=i+1) begin:latch_bit
          TLATX1M _TECHMAP_REPLACE_ (  // TODO: support EN_POLARITY = 1'b0
            .D(D[i]),
            .G(EN),
            .Q(Q[i]),
            .QN()
          );
        end
    end endgenerate

endmodule

2. Затем я также добавил строку techmap -map test_map.v после строки techmap; opt -full в моем скрипте синтеза.

К сожалению, безуспешно: в списке вывода Yosys все еще есть экземпляр \$_DLATCH_P_. Я также не смог найти связанных предупреждений / ошибок в выходных данных журнала Yosys.

3. Я также пытался изменить имя модуля ячейки отображения (_library_latch в коде выше) и / или комментарий techmap_celltype к \$_DLATCH_P_, но это тоже не помогло.

Чего мне не хватает?

1 Ответ

2 голосов
/ 10 февраля 2020

Найдя официальный файл сопоставления защелок Yosys для ПЛИС ICE40 , я изменил файл test_map.v на следующее:

module \$_DLATCH_N_ (E, D, Q);
  wire [1023:0] _TECHMAP_DO_ = "simplemap; opt";
  input E, D;
  output Q;
  TLATNX1M _TECHMAP_REPLACE_ (
    .D(D),
    .GN(E),
    .Q(Q),
    .QN()
  );
endmodule

module \$_DLATCH_P_ (E, D, Q);
  wire [1023:0] _TECHMAP_DO_ = "simplemap; opt";
  input E, D;
  output Q;
  TLATX1M _TECHMAP_REPLACE_ (
    .D(D),
    .G(E),
    .Q(Q),
    .QN()
  );
endmodule

... и techmap -map test_map.v строка в моем скрипте Yosys уже была правильной, вот весь файл для справки:

yosys -import
set name digital
set libfile my_tech.lib
read_liberty -lib $libfile
read_verilog test.v
hierarchy -check -top ${name}
procs; opt
memory; opt
fsm -norecode; opt -full
techmap; opt -full
techmap -map test_map.v
dfflibmap -liberty $libfile
opt
abc -liberty $libfile \
    -script {+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put}
hilomap -hicell TIEHIM Y -locell TIELOM Y
clean -purge
write_verilog ${name}_synth.v

Теперь у выходного списка соединений есть такой пример:

  TLATX1M _1_ (
    .D(c),
    .G(ena),
    .Q(q),
    .QN()
  );
...