Лишние буферы / инверторы в синтезированном нетлисте

Это еще один дополнительный вопрос к комбинаторному синтезу: лучшие результаты картирования технологий.

Это мой скрипт управления Yosys TCL:

yosys -import
set libfile osu018_stdcells.lib
read_liberty -lib  $libfile
read_verilog test.v
hierarchy; 
procs; opt
memory; opt
fsm -norecode; opt -full
techmap; opt -full
dfflibmap -liberty $libfile
abc -liberty $libfile \
    -script {+strash;ifraig;scorr;dc2;dretime;strash;&get,-n;&dch,-f;&nf,{D};&put}
clean
write_verilog test_synth.v

Используемый файл osu018_stdcells.lib является частью пакета Qflow версии 1.1.

Это файл test.v:

module test (
    input rx_clk,
    input rxena,
    input rstn,
    input [2:0] d,
    output reg [2:0] q
  );
  wire rx_rstn = rstn & rxena;
  always @ (negedge rx_clk or negedge rx_rstn) begin
    if (!rx_rstn) begin
      q <= 0;
    end else begin
      q <= d;
    end
  end
endmodule

Yosys (версия 0.5+ (git sha1 f13e387, gcc 5.3.1-8ubuntu2 -O2 -fstack-protector-strong -fPIC -Os)) создает следующий список соединений вывода test_synth.v:

/* Generated by Yosys 0.5+ (git sha1 f13e387, gcc 5.3.1-8ubuntu2 -O2 -fstack-protector-strong -fPIC -Os) */

(* src = "test.v:1" *)
module test(rx_clk, rxena, rstn, d, q);
  wire _0_;
  wire _1_;
  wire _2_;
  (* src = "test.v:5" *)
  input [2:0] d;
  (* src = "test.v:6" *)
  output [2:0] q;
  (* src = "test.v:4" *)
  input rstn;
  (* src = "test.v:2" *)
  input rx_clk;
  (* src = "test.v:8" *)
  wire rx_rstn;
  (* src = "test.v:3" *)
  input rxena;
  INVX1 _3_ (
    .A(rx_clk),
    .Y(_0_)
  );
  AND2X1 _4_ (
    .A(rstn),
    .B(rxena),
    .Y(rx_rstn)
  );
  INVX1 _5_ (
    .A(rx_clk),
    .Y(_1_)
  );
  INVX1 _6_ (
    .A(rx_clk),
    .Y(_2_)
  );
  DFFSR _7_ (
    .CLK(_1_),
    .D(d[0]),
    .Q(q[0]),
    .R(rx_rstn),
    .S(1'b1)
  );
  DFFSR _8_ (
    .CLK(_2_),
    .D(d[1]),
    .Q(q[1]),
    .R(rx_rstn),
    .S(1'b1)
  );
  DFFSR _9_ (
    .CLK(_0_),
    .D(d[2]),
    .Q(q[2]),
    .R(rx_rstn),
    .S(1'b1)
  );
endmodule

Очевидно, есть 3 случая INVX1 ячейка, по одному для каждого из трех шлепанцев в этом дизайне. Я бы ожидал, что только один из этих инверторов и его управляемая сеть поделены между триггерами. CLK входы.

В другом проекте (с приблизительно 30 регистрами, которые запускаются с падающего фронта тактового сигнала), я видел только один инвертор, но его выход проходит через один буфер на триггер, что тоже не идеально.

Есть ли способ заставить Yosys объединить / разделить эти ресурсы между регистрами?

1 ответ

Решение

Есть ли способ заставить Yosys объединить / разделить эти ресурсы между регистрами?

Просто беги opt_merge после запуска dfflibmap,

Другие вопросы по тегам