【目次に戻る】

6. KUE-CHIP2の論理合成


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

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

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

論理合成が終わった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_29znは零フラグ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_reabが変化し終わるま での時間を求めます.これによると,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を設計していただ きたいと思います.