KUE-CHIP2全体のSFL記述が終わり,SECONDSを用いたシミュレーションも うまくいくようでしたら,いよいよ,論理合成を行いましょう.
PARTHENONでは,SFLEXPやOPT_MAPなどのいくつかのプログラムが連携して
論理合成を行います.1つずつ実行していくこともできますが,autoというコ
マンドを用いると,一連のプログラムを自動的に起動することができます.こ
れは以下のようにして用います.
% auto kuechip2 nld4 DEMO demo
このように実行すると,しばらくの間いろいろなメッセージが出力されますが,
最終的には,kuechip2.4th/kuechip2.nldというファイルが出来るはずです.
このautoというコマンドの意味は,kuechip2というSFLのモジュール
を論理合成して,最終的にkuechip2.4th/kuechip2.nld というネットリストを
作成してください,その際に使用するセルライブラリは,DEMO社のdemoという
セルライブラリです,ということです.
論理合成が終わったkuechip2は,どれくらいの面積で,どれくら
いの動作速度なのかを見てみます.そのためには,OPT_MAPを用います.コマ
ンドプロンプトで,
% opt_map kuechip2 kuechip2.4th $PARTHENON/cell_lib.dir/DEMO/demo/cell.dir
と実行してみてください.OPT_MAPが起動したあと,
OPT_MAP> move
position = /
type = NLD
class_name = kuechip2
power = 3884.4
area = 514.47
gates = 1972
OPT_MAP>
とすると,kuechip2の面積や消費電力などがわかります.
次に,動作速度についてみてみます.外部にあるメモリの値を参照する場 合としない場合を分けて考えます.まず,以下のようにすることで,クロック が立ち上がってレジスタの値が変化し,その変化が回路全体に伝わるのに要す る時間を求めることができます.これによると,m_clockが時刻0で立ち上がる と(その他の入力端子は変化していない),時刻4.9nsでレジスタ ir_reg5の値が変化し終わり,時刻46.7nsにoai--31_29.zn という端子が変化したのを最後に,それ以降は回路のどの部分も変化しないと いうことがわかります.kuechip2.4th/kuechip2.nldを見ると, oai--31_29のznは零フラグzfに接続されていま す.
OPT_MAP> scalc all statistics calculated OPT_MAP> lcalc all load calculated OPT_MAP> set /m_clock 0 normal pin (kuechip2) m_clock changed to source pin OPT_MAP> dcalc all delay calculated OPT_MAP> maxn / maximum rise delay path 1 src 0 max 0.00000e+00 nml 1 max 2.53030e+00 (/i ) to (/z ) /m_clock-buf0-0(bf3_i1) nml 2 max 4.90650e+00 (/m_clock ) to (/nout ) /ir_reg5(dtr_reg) nml 3 max 6.64490e+00 (/i ) to (/z ) /ir_reg5-buf0-0-0(bf2_i1) : nml 29 max 3.90641e+01 (/a2 ) to (/zn ) /alu_oai-10(oa_i21) nml 30 max 4.04673e+01 (/a2 ) to (/zn ) /alu_enor-1(xn1_i2) nml 31 max 4.17985e+01 (/a2 ) to (/z ) /alu_eor-9(xo1_i2) nml 32 max 4.31413e+01 (/b1 ) to (/zn ) /aoi--221_31(ao_i221) nml 33 max 4.45333e+01 (/a2 ) to (/zn ) /kuechip2_subm-1_nand--2_26(nd1_i2) snk 34 max 4.66829e+01 (/a2 ) to (/zn ) /oai--31_29(oa_i31) OPT_MAP>
メモリの値を参照する場合はどうでしょか.まず,以下のようにして,
m_clockが立ち上がってからmem_reやabが変化し終わるま
での時間を求めます.これによると,m_clockが変化してからメモリ読み出し
の準備が整うまでに11.5nsかかることなどがわかります.
OPT_MAP> net /mem_re
------------------------------------------------------------------
sink pin mem_re
maximum rise delay 1.15199e+01
minimum rise delay 6.23130e+00
OPT_MAP> net /ab[0]
------------------------------------------------------------------
sink pin ab[0]
maximum rise delay 8.22590e+00
minimum rise delay 5.74430e+00
OPT_MAP> net /ab[8]
------------------------------------------------------------------
sink pin ab[8]
maximum rise delay 7.88840e+00
minimum rise delay 7.73590e+00
OPT_MAP>
そして,m_clock以外の入力端子が変化してから,回路全体が変化し終わるま
での時間を求めます.init pin 0はすべての外部入力端子に立ち上がりイベン
トを設定するために用いています.unsetでm_clockの立ち上がりイベントを消
しています.この結果によると,m_clock以外の入力端子が時刻0で立ち上がる
と,時刻30.6nsにoai--31_29.znという端子が変化して,それ以降は回
路のどの部分も変化しないということがわかります.この場合も,零フラグ
zfへの経路が最大遅延を引き起こしています.
OPT_MAP> init pin 0
top module pin initialized
normal net 621
in calc net 0
source net 13
inhibit net 0
sink net 45
OPT_MAP> unset /m_clock
source pin (kuechip2) m_clock changed to normal pin
OPT_MAP> dcalc
all delay calculated
OPT_MAP> maxn /
maximum rise delay path 1
src 0 max 0.00000e+00
nml 1 max 6.36000e-01 (/a1 ) to (/zn ) /sel_b_nand-2(nd1_i2)
nml 2 max 1.36200e+00 (/a1 ) to (/zn ) /sel_b_nand-29(nd1_i3)
nml 3 max 1.98000e+00 (/a1 ) to (/zn ) /sel-7_nand-6(nd1_i2)
:
nml 21 max 2.29416e+01 (/a2 ) to (/zn ) /alu_oai-10(oa_i21)
nml 22 max 2.43448e+01 (/a2 ) to (/zn ) /alu_enor-1(xn1_i2)
nml 23 max 2.56760e+01 (/a2 ) to (/z ) /alu_eor-9(xo1_i2)
nml 24 max 2.70188e+01 (/b1 ) to (/zn ) /aoi--221_31(ao_i221)
nml 25 max 2.84108e+01 (/a2 ) to (/zn ) /kuechip2_subm-1_nand--2_26(nd1_i2)
snk 26 max 3.05604e+01 (/a2 ) to (/zn ) /oai--31_29(oa_i31)
OPT_MAP>
仮に,mem_reが変化してからdbiが変化するまで(メモリ
の値を読み出すまで)に30.0nsかかるとすると,m_clockが変化してから
zfにそれが伝わるまで11.5ns+30.0ns+30.6ns=72.1nsかかるというこ
とになります.
デザインコンテストでは,KUE-CHIP2のプログラムの実行クロック数を小さ くすることも大切ですが,出来上がったKUE-CHIP2の面積や動作周波数も重要 な評価基準となるでしょう.今回はautoコマンドを一度実行しただけですが, 動作速度などの設計条件をきちんと設定したり,OPT_MAPやONSETに与えるコマ ンドを変更することで,論理合成結果を改善することができます.
実は,今回のKUE-CHIP2のSFL記述は,図1 のブロック図を忠実に反映しているわけではありません.図1では,内部のセ レクタとして,sel_aとsel_bが明示されていますが,SFL記述では,sel_bしか 明示していません.また,ACCやIXへの入力は,一度DBoにまとめられたものが 供給されていますが,SFL記述ではこのような書き方はしていません.SFLでは, 1つの転送先に対して複数の転送元がある場合,自動的にセレクタが挿入され ます.例えば,accに対しては,alu.out, dbi, shifter.out, ixからの転送があるので,8ビットの4to1セレクタが挿入されます.従っ て,現在のままのSFL記述では,共有できる多くのセレクタが共有されていま せん.図1のブロック図をSFL記述に忠実に反映させるだけでも, kuechip2の面積は減少すると思われます.
また,aluの部分が最大遅延を引き起こしているようですが,こ れは,加算を行うモジュールadd8を桁上げ伝搬加算器で構成したか らであると思われます.add8を桁上げ先見加算機に改良することで, 最大遅延の値が減少することでしょう.
今回作成したSFL記述には,そのほかにもいろいろと改良すべき点がありま す.SFLで設計すると,設計変更が容易に行えるので,いろんなアイデアをす ぐに実現でき,SECONDSや論理合成プログラムですぐに評価することができま す.今回のSFL記述をたたき台として,すばらしいKUE-CHIP2を設計していただ きたいと思います.