yosysで論理合成(フリップ・フロップ)

設計

前回はyosysをubuntunにインストールして簡単な基本ゲートの論理合成を行いました。今回は、クロックを使用した設計データの論理合成を試してみます。

合成を行う設計データ

クロックを使用した設計で一番簡単なDフロップ・プロップで論理合成を試します。具体的なコードは次のとおりです。ファイル名はtest.vです。

module dff (
 input i_d,  
 output reg o_d,
 input rst_x,
 input clk
);

always @(posedge clk or negedge rst_x) begin
  if (~rst_x) o_d <= 1'b0;
  else o_d <= i_d;
end

endmodule

論理合成

合成スクリプト

yosysの合成スクリプトは次のとおりです。セル・ライブラリはyosys付属のcmos_cells.libを利用しています。ファイル名はtest.ysとしました。一般的な論理合成ツールではクロックの設定が必要なのですが、yosysのマニュアルにはそのような記述は見当たりません。例えば、

  • クロック名の指定
  • クロック周波数の指定
  • クロックのデューティ指定

といった設定についての記述は見当たりません。

read_verilog test.v
hierarchy
proc; opt
techmap; opt
abc -liberty cmos_cells.lib
write_verilog synth.v
show
clean

論理合成の実行

次のコマンドで論理合成を実行します。

$yosys test.ys

論理結果

合成結果(synth.v)は次のとおりです。Verilogのregがそのまま残っていて、フリップ・フロップのセルに置き換わっていないのがわかります。

(* src = "test.v:1" *)
module dff(i_d, o_d, rst_x, clk);
  (* src = "test.v:5" *)
  input clk;
  (* src = "test.v:2" *)
  input i_d;
  (* src = "test.v:3" *)
  output o_d;
  reg o_d;
  (* src = "test.v:4" *)
  input rst_x;
  always @(posedge clk or negedge rst_x)
    if (!rst_x)
      o_d <= 0;
    else
      o_d <= i_d;
endmodule

showコマンドで表示される図は次のとおりです。

合成結果

合成結果

合成スクリプトの修正

Verilogのregをセルにマッピングするには、合成スクリプトにdfflibmap -libertyを追加します。

read_verilog test.v
hierarchy
proc; opt
techmap; opt
dfflibmap -liberty cmos_cells.lib
abc -liberty cmos_cells.lib
write_verilog synth.v
show
clean

再合成結果

dfflibmapを追加した合成スクリプトを実行すると、regがセルにマッピングされた次のネットリストが生成されます。

(* src = "test.v:1" *)
module dff(i_d, o_d, rst_x, clk);
  wire _0_;
  wire _1_;
  wire _2_;
  (* src = "test.v:5" *)
  input clk;
  (* src = "test.v:2" *)
  input i_d;
  (* src = "test.v:3" *)
  output o_d;
  (* src = "test.v:4" *)
  input rst_x;
  NOT _3_ (
    .A(_0_),
    .Y(_1_)
  );
  DFFSR _4_ (
    .C(clk),
    .D(i_d),
    .Q(o_d),
    .R(_2_),
    .S(1'b0)
  );
  assign _0_ = rst_x;
  assign _2_ = _1_;
endmodule

showの結果は次のとおりです。Verilogソース・コード中のo_dというregがDFFSRというフリップ・プロップにマッピングされていることがわかります。

合成結果

合成結果

まとめ

yosysを使ってクロック入力のある簡単な設計データの論理合成を行いました。一般的な論理合成ツールでは、クロックに対して周波数などの設定が必要になりますが、yosysには存在しないようです(少なくとも今のバージョンでは)。

タイトルとURLをコピーしました