KUE-CHIP2全体のSFL記述が終わり,SECONDSを用いたシミュレーションも うまくいくようでしたら,いよいよ,論理合成を行いましょう.
PARTHENONでは,SFLEXPやOPT_MAPなどのいくつかのプログラムが連携して
論理合成を行います.1つずつ実行していくこともできますが,autoというコ
マンドを用いると,一連のプログラムを自動的に起動することができます.こ
れは以下のようにして用います.
% auto kuechip2 ps DEMO demo
このように実行すると,しばらくの間いろいろなメッセージが出力されますが,
最終的には,kuechip2.nld_last/kuechip2.nldというファイルやkuechip2.ps
というファイルが出来るはずです.もし,最終段階のnld_psというプログラム
に時間がかかるようであれば,中断してもかまいません.この場合でも,
kuechip2.nld_last/kuechip2.nldというファイルはできているはずです.
このautoというコマンドの意味は,kuechip2というSFLのモジュールを論理 合成して,最終的にkuechip2.psというPostScript形式の論理回路図を作成し てください,その際に使用するセルライブラリは,DEMO社のdemoというセルラ イブラリです,ということです.kuechip2.nld_last/kuechip2.nld は最終的 なネットリストです.また,kuechip2.psはそのネットリストを回路図にした ものです.
論理合成が終わったkuechip2は,どれくらいの面積で,どれくらいの動作
速度なのかを見てみます.そのためには,OPT_MAPを用います.コマンドプロ
ンプトで,
% opt_map kuechip2 kuechip2.nld_last $PARTHENON/cell_lib.dir/DEMO/demo/cell.dir
と実行してみてください.OPT_MAPが起動したあと,
opt_map> move
position = /
type = NLD
class_name = kuechip2
power = 4644.1
area = 1157.9
gates = 1372
opt_map>
とすると,kuechip2の面積や消費電力などがわかります.
次に,動作速度についてみてみます.外部にあるメモリやIBUFがどれくら いの速度で動作するかわからないので,これらの値を参照する場合としない場 合を分けて考えます.まず,以下のようにすることで,クロックが立ち上がっ てレジスタの値が変化し,その変化が回路全体に伝わるのに要する時間を求め ることができます.これによると,m_clockが時刻0で立ち上がると(その他の 入力端子は変化していない),時刻13nsでレジスタir_reg5の値が変化し終わ り,時刻108nsにoai--211_48.znという端子が変化したのを最後に,それ以降 は回路のどの部分も変化しないということがわかります. kuechip2.nld_last/kuechip2.nldを見ると,oai--211_48のznは桁上げフラグ cfに接続されています.
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.29700e+00 (/i ) to (/z ) /m_clock-buf0-2(ni01d3) nml 2 max 1.25860e+01 (/m_clock ) to (/nout ) /ir_reg5(reg_wr_1) nml 3 max 1.59290e+01 (/a2 ) to (/zn ) /nor--2_37(nr02d1) : nml 31 max 9.31140e+01 (/a2 ) to (/zn ) /alu_nor-6(nr02d1) nml 32 max 9.72800e+01 (/a2 ) to (/zn ) /alu_oai-14(oa04d1) nml 33 max 9.82200e+01 (/i ) to (/zn ) /inv-_59(in01d1) nml 34 max 1.03160e+02 (/b3 ) to (/zn ) /oai--33_54(oa02d1) nml 35 max 1.05352e+02 (/b ) to (/zn ) /aoi--21_40(ao04d1) snk 36 max 1.08022e+02 (/a2 ) to (/zn ) /oai--211_48(oa05d1) opt_map>
メモリやIBUFの値を参照する場合はどうでしょか.まず,以下のようにし
て,m_clockが立ち上がってからmem_reやabやibuf_reが変化し終わるまでの時
間を求めます.これによると,m_clockが変化してからメモリ読み出しの準備
が整うまでに24nsかかることなどがわかります.
opt_map> net /mem_re
------------------------------------------------------------------
sink pin mem_re
maximum rise delay 2.39650e+01
minimum rise delay 1.27110e+01
opt_map> net /ab[0]
------------------------------------------------------------------
sink pin ab[0]
maximum rise delay 1.50720e+01
minimum rise delay 1.04670e+01
opt_map> net /ab[8]
------------------------------------------------------------------
sink pin ab[8]
maximum rise delay 1.35170e+01
minimum rise delay 1.33830e+01
opt_map> net /ibuf_re
------------------------------------------------------------------
normal pin ibuf_re
maximum rise delay 2.79520e+01
minimum rise delay 1.25690e+01
opt_map>
そして,入力端子dbiなどのm_clock以外の入力端子が変化してから,回路
全体が変化し終わるまでの時間を求めます.init pin 0はすべての外部端子に
立ち上がりイベントを設定するために用いています.unsetでm_clockの立ち上
がりイベントを消しています.この結果によると,m_clock以外の入力端子が
時刻0で立ち上がると,時刻79nsにoai--211_48.znという端子が変化して,そ
れ以降は回路のどの部分も変化しないということがわかります.この場合も,
桁上げフラグcfへの経路が最大遅延を引き起こしています.
opt_map> init pin 0
top module pin initialized
normal net 595
in calc net 0
source net 13
inhibit net 0
sink net 43
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 1.19700e+00 (/a1 ) to (/zn ) /sel_b_nand-2(nd02d1)
nml 2 max 4.01500e+00 (/a1 ) to (/z ) /sel_b_and-5(an03d1)
nml 3 max 6.71900e+00 (/a1 ) to (/z ) /sel-7_or-2(or02d1)
:
nml 24 max 6.38950e+01 (/a2 ) to (/zn ) /alu_nor-6(nr02d1)
nml 25 max 6.80610e+01 (/a2 ) to (/zn ) /alu_oai-14(oa04d1)
nml 26 max 6.90010e+01 (/i ) to (/zn ) /inv-_59(in01d1)
nml 27 max 7.39410e+01 (/b3 ) to (/zn ) /oai--33_54(oa02d1)
nml 28 max 7.61330e+01 (/b ) to (/zn ) /aoi--21_40(ao04d1)
snk 29 max 7.88030e+01 (/a2 ) to (/zn ) /oai--211_48(oa05d1)
opt_map>
仮に,mem_reが変化してからdbiが変化するまで(メモリの値を読み出すまで)
に40nsかかるとすると,m_clockが変化してからcfにそれが伝わるまで
24ns+40ns+79ns=143nsかかるということになります.
デザインコンテストでは,KUE-CHIP2のプログラムの実行クロック数を小さ くすることも大切ですが,出来上がったKUE-CHIP2の面積や動作周波数も重要 な評価基準となるでしょう.今回はautoを用いて論理合成を行いましたが,論 理合成の際のいろいろなパラメータをかえてみることで,よりよい論理合成結 果が得られるでしょう.
実は,今回のkuechip2のSFL記述は, 図1.1 のブロック図を忠実に反映しているわけではありません.図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.1のブ ロック図をSFL記述に忠実に反映させるだけでも,kuechip2の面積は減少する と思われます.
また,aluの部分が最大遅延を引き起こしているようですが,これはおそら く,加算を行うモジュールadd8を桁上げ伝搬加算器で構成したからであると思 われます.add8を桁上げ先見加算機に改良することで,最大遅延の値が減少す ることでしょう.
今回作成したSFL記述には,そのほかにもいろいろと改良すべき点がありま す.SFLで設計すると,設計変更が容易に行えるので,いろんなアイデアをす ぐに実現でき,SECONDSや論理合成プログラムですぐに評価することができま す.今回のSFL記述をたたき台として,すばらしいKUE-CHIP2を設計していただ きたいと思います.