スクリプトで論理合成を自動化する
(1) ここで学ぶ内容
概要
- 制約条件を集めたコマンドスクリプトについて学ぶ
- 修了判定を通じて、スクリプトを用いた論理合成を体験する
目標
以下の項目を理解し説明できる
- 論理合成コマンドを組み合わせて、合成方針に合ったスクリプトを作成できる
いよいよ論理合成もこれが最後のユニットになります。実際に論理合成を行うときは合成スクリプトを使うと効果的です。合成スクリプトの内容をよく理解して効率のよい論理合成が出来るようになってください。
もふねこ:
論理合成は何度もやり直すことが多いから、コマンドを一つずつ手打ちしてると日が暮れちゃうよ🐾
だから、制約条件やコンパイルの指示を「スクリプト(Tclファイル)」にまとめて一気に実行するのがプロのやり方!これさえマスターすれば、仕事のスピードが何倍にもなるから頑張ろうね!
(2) 論理合成はバッチ処理
...
set_operating_conditions
set_wire_load_model
create_clock
set_input_delay
set_output_delay
set_driving_cell
set_load
set_max_area
...
ファイルの読み込みコマンド
結果を確認するレポートコマンド
合成結果をファイルに書き出すコマンド
論理合成はここまで紹介してきた各種コマンドによって行います。
合成は繰り返し行うのでこれらのコマンドを合成のたびにごとに与えるのは煩雑で、間違いも起きやすくなります。
そこで論理合成の一連のコマンドを一つのファイルにし、そのファイルを合成ツールに与えて論理合成を行います。
このファイルを合成スクリプトといいます。
合成スクリプトを使うことで回路を効率的に論理合成できます。
合成スクリプトはここであげたコマンドの他にファイルの読み込みコマンドや結果を確認するレポートコマンド、合成結果をファイルに書き出すコマンドなどを含みます。
(3) 標準スクリプト
read -format verilog clock24.v /* ファイル読み込みコマンド */
set_operating_conditions MAX567 -library hd350s
set_wire_load_model -name hd350s_20k
create_clock -p 100 -w { 0 50 } CLK
set_input_delay 10 -clock CLK all_inputs()
set_output_delay 40 -clock CLK all_outputs()
set_driving_cell -cell NI1L -pin X all_inputs()
set_drive 0 CLK
set_dont_touch_network CLK
set_load load_of (hd350s/NI1L/A) all_outputs()
set_max_area 0
compile /* 合成コマンド */
report_area > ../log/clock24.rpt /* 回路面積レポート */
report_timing >> ../log/clock24.rpt /* タイミングレポート */
write -format verilog
-hier -output ../gate/clock24.v /* 合成結果書き込みコマンド */
quit /* 合成ツール終了コマンド */
標準的な合成スクリプトの内容を示します。
動作環境や配線遅延モデルの設定、各種制約条件の他に、ファイル読み込みや書き込みコマンド、合成コマンドや結果解析のためのレポートコマンドなどが一つのファイルになっています。
このスクリプトファイルを必要に応じてコピーし、他の回路記述のスクリプトファイルとして使用します。
その場合にはファイル名の変更や必要に応じて動作環境や配線遅延モデルの変更、制約条件の追加削除などを行います。
(4) レポートコマンド
- report_area 回路規模を表示する
- report_timing タイミング解析の結果を表示する
report_area 実行例
****************************************
レポート : area
回路 : elelock
****************************************
ポート数: 13
ネット数: 79
セル数: 50
セル種類: 12
組み合わせ回路: 60
非組み合わせ回路: 186
合計: 246
report_timing 実行例
****************************************
レポート : timing
回路 : elelock
****************************************
ライブラリ: hd350s
配線遅延モデル: hd350s_05k
コンディション: MAX567
-----------------------------------------------------------
クロック ck (rise edge) 0.00 0.00
key_reg[0][1]/D 36.69
データ到着時刻 36.69
クロック ck (rise edge) 50.00 50.00
クロックスキュー -1.00 49.00
ライブラリのセットアップタイム -1.60 47.40
データ到着要求時刻 47.40
-----------------------------------------------------------
データ到着要求時刻 47.40
データ到着時刻 -36.69
-----------------------------------------------------------
タイミング余裕 10.71
論理合成後の回路の解析を行うのが、レポートコマンドです。
レポートコマンドはたくさんの種類がありますが、ここでは代表的な二つのコマンドの実行例を示します。
回路規模を表示するのが、report_areaコマンドです。
組み合わせ回路とそれ以外の部分の回路規模や、ポート数、セル数なども表示されます。
タイミング解析を行うのがreport_timingコマンドです。
回路の遅延時間がデータ到着時刻として表示されます。
動作速度の制約条件がデータ到着要求時刻として表示されます。
遅延時間が制約条件を満たさない場合はタイミング余裕がマイナスの値に、満たして場合はプラスの値になります。
レポートコマンドはこのほかにも多数ありますので、詳細は各ツールのマニュアルをみてください。
(5) 修了判定1
よくでき
ました!!
read -format verilog bcd60.v
set_operating_conditions MAX567 -library hd350s
set_wire_load_model -name hd350s_05k -library hd350s
create_clock -p 30 -w { 0 15 } CLK
set_clock_uncertainty 3 CLK
set_fix_hold CLK
set_input_delay 5 -clock CLK all_inputs()
set_output_delay 10 -clock CLK all_outputs()
set_load 3 * load_of(hd350s/IV/A) all_outputs()
set_driving_cell -cell IV -pin Z all_inputs()
set_drive 0 CLK
set_dont_touch_network CLK
set_structure
compile
report_area > rpt/bcd60.rpt
report_timing >> rpt/bcd60.rpt
write -format verilog -output gate/bcd60.v
quit
- 読み込みファイル bcd60⭕.v
- 論理合成ライブラリ hd350s⭕
- クロック周波数 33⭕MHz
- (小数点以下切り捨て)
- クロックスキュー値 3⭕Sec
- 入力遅延値 5⭕Sec
- 出力遅延値 10⭕Sec
- □ クロック端子
- □ すべての入力端子
- ☑ すべての出力端子
- □ 平坦化
- ☑ 構造化
(6) 修了判定2
合成後の回路規模、遅延時間、タイミング余裕を確認する。
制約条件を満たしているか確認する。
回路図やレポートで回路規模や遅延時間を確認する。
遅延時間はレポートのデータ到着時刻を確認する。
よくでき
ました!!
3
4
回路記述: bcd60.v
スクリプト: bcd60.scr
- 回路規模 295⭕
- 遅延時間 23.7⭕
- タイミング余裕 -7.5⭕
- □ 満たしている
- ☑ 満たしていない
BCD60の論理合成後のゲートレベル回路図 (構造化) とレポート
多数の論理ゲートが複雑に絡み合った多段論理の回路図が生成されています。
****************************************
レポート : area
回路 : BCD60
****************************************
ポート数: 10
ネット数: 133
セル数: 110
セル種類: 31
組み合わせ回路: 236
非組み合わせ回路: 59
合計: 295
****************************************
レポート : timing
回路 : BCD60
****************************************
ライブラリ: hd350s
配線遅延モデル: hd350s_05k
コンディション: MAX567
-----------------------------------------------------------
クロック CLK (rise edge) 0.00 0.00
MSB[1] (out) 0.00 23.70
データ到着時刻 23.70
クロック CLK (rise edge) 30.00 30.00
クロックスキュー -3.00 27.00
ライブラリのセットアップタイム -0.80 26.20
出力遅延 -10.00 16.20
データ到着要求時刻 16.20
-----------------------------------------------------------
データ到着要求時刻 16.20
データ到着時刻 -23.70
-----------------------------------------------------------
タイミング余裕 -7.50
(7) 修了判定3
よくでき
ました!!
set_operating_conditions MAX567 -library hd350s
set_wire_load_model -name hd350s_05k -library hd350s
create_clock -p 30 -w { 0 15 } CLK
set_clock_uncertainty 3 CLK
set_fix_hold CLK
set_input_delay 5 -clock CLK all_inputs()
set_output_delay 10 -clock CLK all_outputs()
set_load 3 * load_of(hd350s/IV/A) all_outputs()
set_driving_cell -cell IV -pin Z all_inputs()
set_drive 0 CLK
set_dont_touch_network CLK
set_flatten⭕
compile
report_area > bcd60.rpt
report_timing >> bcd60.rpt
write -format verilog -output bcd60.net
(8) 修了判定4
合成後の回路規模、遅延時間、タイミング余裕を確認する。
制約条件を満たしているか確認する。
回路図やレポートで回路規模や遅延時間を確認する。
遅延時間はレポートのデータ到着時刻を確認する。
よくでき
ました!!
3
4
回路記述: bcd60.v
スクリプト: bcd60.scr
- 回路規模 327⭕
- 遅延時間 16.18⭕
- タイミング余裕 0.02⭕
- ☑ 満たしている
- □ 満たしていない
BCD60の論理合成後のゲートレベル回路図 (平坦化) とレポート
平坦化されたため、2段論理が中心となり、横に広く縦に浅い回路構造が生成されています。遅延時間が改善され、制約を満たしています。
****************************************
レポート : area
回路 : BCD60
****************************************
ポート数: 10
ネット数: 136
セル数: 112
セル種類: 24
組み合わせ回路: 270
非組み合わせ回路: 57
合計: 327
****************************************
レポート : timing
回路 : BCD60
****************************************
ライブラリ: hd350s
配線遅延モデル: hd350s_05k
コンディション: MAX567
-----------------------------------------------------------
クロック CLK (rise edge) 0.00 0.00
LSB[1] (out) 0.00 16.18
データ到着時刻 16.18
クロック CLK (rise edge) 30.00 30.00
クロックスキュー -3.00 27.00
ライブラリのセットアップタイム -0.80 26.20
出力遅延 -10.00 16.20
データ到着要求時刻 16.20
-----------------------------------------------------------
データ到着要求時刻 16.20
データ到着時刻 -16.18
-----------------------------------------------------------
タイミング余裕 0.02
(9) 修了判定5
スクリプトの中でインバータ生成の原因となっているコマンドはどれか?
よくでき
ました!!
module SHIFT2(CLK,SI,SO);
input CLK,SI;
output SO;
reg [1:0] Q;
assign SO = Q[1];
always @(posedge CLK) begin
Q <= { Q[0],SI };
end
endmodule
- □
read -format verilog shift2.v -
set_operating_conditions MAX567 -library hd350s -
set_wire_load_model -name hd350s_05k -library hd350s - □
create_clock -p 50 -w { 0 25 } CLK - ☑
set_clock_uncertainty 10 CLK -
set_fix_hold CLK - □
set_input_delay 2 -clock CLK all_inputs() - □
set_output_delay 3 -clock CLK all_outputs() - □
set_load 3 * load_of(hd350s/IV/A) all_outputs() - □
set_driving_cell -cell IV -pin Z all_inputs() -
set_drive 0 CLK -
set_dont_touch_network CLK -
set_structure -
compile
graph LR
SI((SI)) --> INV1[INV]
INV1 --> INV2[INV]
INV2 --> INV3[INV]
INV3 --> INV4[INV]
INV4 --> INV5[INV]
INV5 --> INV6[INV]
INV6 --> INV7[INV]
INV7 --> INV8[INV]
INV8 --> DFF1[D-FF]
CLK((CLK)) --> DFF1
CLK --> DFF2[D-FF]
DFF1 --> INV9[INV]
INV9 --> INV10[INV]
INV10 --> INV11[INV]
INV11 --> INV12[INV]
INV12 --> INV13[INV]
INV13 --> INV14[INV]
INV14 --> INV15[INV]
INV15 --> INV16[INV]
INV16 --> DFF2
DFF2 --> INV17[INV]
INV17 --> INV18[INV]
INV18 --> INV19[INV]
INV19 --> INV20[INV]
INV20 --> SO((SO))
解説
create_clock -p 50 -w { 0 25 } CLK
set_clock_uncertainty 10 CLK
set_fix_hold CLK
HDL記述やスクリプトの間違いにより、思いがけない回路が合成される事があります。
したがって、合成後は回路図やレポートで必ず確認しましょう。