スクリプトで論理合成を自動化する

(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
回路記述
.v
論理合成ツール
合成結果
.v
or
.db
...
set_operating_conditions
set_wire_load_model
create_clock
set_input_delay
set_output_delay
set_driving_cell
set_load
set_max_area
...
.scr
論理合成の一連のコマンドをファイルにしたものを合成スクリプトという
各種制約条件
ファイルの読み込みコマンド
結果を確認するレポートコマンド
合成結果をファイルに書き出すコマンド

論理合成はここまで紹介してきた各種コマンドによって行います。

合成は繰り返し行うのでこれらのコマンドを合成のたびにごとに与えるのは煩雑で、間違いも起きやすくなります。

そこで論理合成の一連のコマンドを一つのファイルにし、そのファイルを合成ツールに与えて論理合成を行います。

このファイルを合成スクリプトといいます。

合成スクリプトを使うことで回路を効率的に論理合成できます。

合成スクリプトはここであげたコマンドの他にファイルの読み込みコマンドや結果を確認するレポートコマンド、合成結果をファイルに書き出すコマンドなどを含みます。

(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
設問1 空白を埋める
  • 読み込みファイル bcd60.v
  • 論理合成ライブラリ hd350s
  • クロック周波数 33MHz
  • (小数点以下切り捨て)
  • クロックスキュー値 3Sec
  • 入力遅延値 5Sec
  • 出力遅延値 10Sec
設問2 出力遅延を設定している端子は?
  • □ クロック端子
  • □ すべての入力端子
  • ☑ すべての出力端子
設問3 最適化の手法はどちら?
  • □ 平坦化
  • ☑ 構造化

(6) 修了判定2

設問 回路記述をスクリプトを使って合成する。
合成後の回路規模、遅延時間、タイミング余裕を確認する。
制約条件を満たしているか確認する。
回路図やレポートで回路規模や遅延時間を確認する。
遅延時間はレポートのデータ到着時刻を確認する。
たいへん
よくでき
ました!!
BCD60
CLK ─▷
RES ─
─ / ─ MSB (0-5)
3
─ / ─ LSB (0-9)
4
─ COUT

回路記述: 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

設問 修正したスクリプトを使って論理合成し、制約条件を満たしていることを確認する。
合成後の回路規模、遅延時間、タイミング余裕を確認する。
制約条件を満たしているか確認する。
回路図やレポートで回路規模や遅延時間を確認する。
遅延時間はレポートのデータ到着時刻を確認する。
たいへん
よくでき
ました!!
BCD60
CLK ─▷
RES ─
─ / ─ MSB (0-5)
3
─ / ─ LSB (0-9)
4
─ COUT

回路記述: 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記述やスクリプトの間違いにより、思いがけない回路が合成される事があります。
したがって、合成後は回路図やレポートで必ず確認しましょう。