【目次に戻る】

6. KUE-CHIP2の論理合成


KUE-CHIP2全体のSFL記述が終わり,SECONDSを用いたシミュレーションも うまくいくようでしたら,いよいよ,論理合成を行いましょう.

コマンド1つで論理合成 [TOP]

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の面積と動作速度 [TOP]

論理合成が終わった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を設計していただ きたいと思います.