2022年1月16日日曜日

IC Compiler で配置が正しく行われているか調べる(check_legality)

IC Compiler で配置が正しく行われているか,check_legality コマンドで調べる事が出来る.

check_legality

実行すると,行 (Row) に載っていないセルの数,重なっているセルの数などが報告される.また legalize できなかったのでエラーコード PSYN-215 が報告される.
これを利用して,IC Compiler で配置が正しくできなかった場合に終了するプロシージャを以下に示す.
  1. proc ::checkLegalityAndExit { design } {
  2. set fid [open ${design}.legal r]
  3. while {![eof $fid]} {
  4. set line [gets $fid]
  5. puts $line
  6. if {[string match "*PSYN-215*" $line]} {
  7. close $fid
  8. quit
  9. }
  10. }
  11. close $fid
  12. }


使い方

  1. # 前略
  2. place_opt
  3. redirect ${design}.legal { check_legality }
  4.  
  5. # place_opt/legalize_placementに失敗していれば終了
  6. ::checkLegalityAndExit { $design }

2022年1月15日土曜日

IC Compiler で DRC Error の一覧を出力する(get_drc_errors)

DRC Error をリスト形式で得るために get_drc_errors を利用する.

get_drc_errors
-error_view mw_error_view : 対象の Milkyway view (デフォルトで現在の view)
-error_id error_idserror_idと一致するオブジェクトのみ出力
-type error_typeerror_type に一致する違反を出力
-bbox {lx ly ux uy}:検索範囲
-quit:マッチしないときのメッセージを表示しない
-regexp | -exact-regexp では正規表現を有効に,-exact はワイルドカードを有効に
-nocaseerror_id および -filter オプションで大文字小文字を区別しない
-filter expressionfilter_collection コマンドで指定可能な形式でフィルタする

例えばショートが1000以上ある場合に ICC を止めるプロシージャを以下のように書ける.

2023/02/28 嘘を書いていたことが判明.get_drc_errors は collection を出力するので, get_object_name で list に変換しないといけません.
  1. proc ::checkDRCAndExit { } {
  2. set drcerror_coll [get_drc_errors -type "Short" -quiet]
  3. set drcerror_list [get_object_name $drcerror_coll]
  4. set drcerror_num [llength $drcerror_list]
  5. if {$drcerror_num > 1000} then {
  6. echo "Error: Exit icc, so many drc errors!"
  7. echo $drcerror_num
  8. quit
  9. }
  10. }

2022年1月14日金曜日

IC Compiler で配置配線可能な最小面積を調べる

Shell スクリプトで IC Compilerの create_floorplan のパラメータを変更していき設計が最後まで到達できたか調べれば良いのだが,面積制約を満たさない場合は DRC 違反が大量に出る中 ICC は(100%設計完了できないにもかかわらず)延々と頑張って設計改良をするので時間がかかる.一方で一度面積制約を満たしたら処理は終了したい.
そこで
(0) Shell スクリプトで tcl ファイルの create_floorplan のパラメータを変える
(1) 処理の要素要素で Utilization を調べて既定値以下なら終了する
(2) 一度最後まで到達したらフラグを出力し for ループをブレイクする

(0) はこんなコード

  1. echo "--------------" > _b01_.log
  2. for ((row=%%START%%; row<%%END%%;row=row+%%INC%%))do
  3. sed -e "s/%%row%%/${row}/g" tcl/b01.tcl > _b01_.tcl
  4. icc_shell -64 -shared_license -f _b01_.tcl
  5. echo "--------------" >> _b01_.log
  6. echo ${row} >> _b01_.log
  7. grep Error b01.log >> _b01_.log
  8. grep "filler cells with master" b01.log >> _b01_.log
  9. grep "Leaf Cell Count" b01.log >> _b01_.log
  10. if [ -e b01.finish ]; then
  11. break
  12. fi
  13. done
 
このコードをさらに外部のsedコマンドで%%START%%,%%END%%,%%INC%%,%%ROW%%を置換する.

(1) 以下のようなプロシージャを定義して

  1. proc ::checkAreaAndExit { } {
  2. set cell_util [get_utilization]
  3. if {$cell_util < -0.99} then {
  4. echo "Error: Exit icc, floorplan failes"
  5. echo $cell_util
  6. quit
  7. }
  8. set exit_threshold 0.95
  9. if {$cell_util > $exit_threshold} then {
  10. echo "Error: Exit icc, cell area exceeds die area"
  11. echo $cell_util
  12. quit
  13. }
  14. }

メインのtclファイル中で要所要所で呼び出す.

  1. set row 119
  2. set corew [expr $row * 1.08]
  3. create_floorplan \
  4. -control_type width_and_height \
  5. -flip_first_row \
  6. -bottom_io2core 1.08 \
  7. -top_io2core 1.08 \
  8. -left_io2core 1.08 \
  9. -right_io2core 1.08 \
  10. -core_height 10.800000 \
  11. -core_width $corew
  12.  
  13. ::checkAreaAndExit

(2) メインのtclファイルの末尾に完遂した場合のフラグファイルの出力と,冒頭にフラグファイルがある場合にquitするようにする.

  1. ## 冒頭
  2. if { [ file exists ${design}.finish ] == 1 } then {
  3. quit
  4. }
  5. ...(省略)...
  6. ## 末尾
  7. redirect ${design}.finish {echo finish}

フラグファイルがある場合は(0)のシェルスクリプトでもbreakするようにしているので,tcl 中の if 文は無駄ではあるが念のため.

2022年1月5日水曜日

Procedural-continuous assignments

Verilog では以下のように always の中に assign 文を入れることが出来るらしい(@ryos36さんのTwitterから).
  1. module dff (q, d, clear, preset, clock);
  2. output q;
  3. input d, clear, preset, clock;
  4. reg q;
  5.  
  6. always @(clear or preset)
  7. if(!clear)
  8. assign q = 0;
  9. else if(!preset)
  10. assign q = 1;
  11. else
  12. deassign q;
  13.  
  14. always@(posedge clock)
  15. q = d;
  16. endmodule
always 文の中に assign を入れる構文は Procedural-continuous assignments (手続き文の継続的代入?)と呼ぶらしく,DesignCompiler では「Procedural-continuous assignments は合成できないよ」とエラーが出た.純粋に動作モデルを立てるために使うのだろう.