前回は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には存在しないようです(少なくとも今のバージョンでは)。



