スクリプトで論理合成を自動化する
この章のスクリプトと数値は、旧来の合成ツールの書式を使った説明例です。今回の合成実測ではありません。コマンドはツールや版によって異なります。時間単位はこの演習ではnsとし、実際のライブラリ単位はツールで確認してください。
(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
- 読み込みファイル .v
- 論理合成ライブラリ
- クロック周波数 MHz
- (小数点以下切り捨て)
- クロック不確かさ ns
- 入力遅延値 ns
- 出力遅延値 ns
解答と読み取り方
読み込みファイルはbcd60.v、ライブラリはhd350s。周期30nsなので周波数は約33.33MHz(設問の整数指定では33)。uncertaintyは3ns、入力遅延5ns、出力遅延10ns。出力遅延の対象はすべての出力端子で、指定はset_structure。uncertaintyは不確かさの予算で、測定したクロックスキューそのものとは限りません。
(6) 確認問題2:スクリプトで合成する
以下の合成結果レポートを見て、回路規模・遅延時間・タイミング余裕を確認しよう。
3
4
回路記述: bcd60.v
スクリプト: bcd60.scr
- 回路規模
- 遅延時間
- タイミング余裕
解答と読み取り方
この説明例では規模の合計は295、到着時刻は23.70、余裕は16.20−23.70=−7.50。示した経路のsetup条件を満たしていません。規模の単位はライブラリ依存です。
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
compile
report_area > bcd60.rpt
report_timing >> bcd60.rpt
write -format verilog -output bcd60.net
解答と読み取り方
次の説明例への切り替えはset_flattenを意図しています。ただし、平坦化すれば必ずタイミングが改善するわけではありません。対象ツールのコマンド仕様と、再合成したレポートを確認します。
(8) 確認問題4:修正後の合成結果
以下の合成結果レポートを見て確認しよう。
3
4
回路記述: bcd60.v
スクリプト: bcd60.scr
- 回路規模
- 遅延時間
- タイミング余裕
解答と読み取り方
この説明例では規模327、到着時刻16.18、余裕0.02。示した経路のsetup条件を満たしますが、他の経路やhold条件まで合格したことにはなりません。
BCD60の論理合成後のゲートレベル回路図 (平坦化) とレポート
下の説明例では到着時刻が短く、規模の値は大きくなっています。この関係は一般則ではなく、再合成後のレポートで判断します。
****************************************
レポート : 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
set_operating_conditions MAX567 -library hd350sset_wire_load_model -name hd350s_05k -library hd350sset_fix_hold CLKset_drive 0 CLKset_dont_touch_network CLKset_structurecompile
解答と読み取り方
この例ではset_clock_uncertainty 10とset_fix_holdの組合せを見直します。実際のhold修復に入る遅延セルはクロック関係・制約・対象ツールに依存します。制約が厳しいという理由だけで値を小さくせず、実システムの要求に合っているか調べます。