Applistar

3. 4. 3 RTLモデルを高速化するための抽象化の方法を知りたいのですが

TOP > 3 高速協調検証システム > 3. 4 ハードウェアのモデル > 3. 4. 3 RTLモデルを高速化するための抽象化の方法を知りたいのですが
  3. 4. 3 RTLモデルを高速化するための抽象化の方法を知りたいのですが  

3. 4. 3 RTLモデルを高速化するための抽象化の方法を知りたいのですが

シミュレーションを高速にするには、イベントの数を減少させることが必要です。 そこで、イベント数を削減することを基本方針として、モデルの抽象化を行います。

モデルの抽象化による高速方法には以下の方法があります。

  • 抽象化方法
    • 実行制御方式の変更(クロック同期→イべント駆動)
    • ブロック構成の変更
    • 実装構成の変更
    • データ転送手順の変更
    • 付加回路の削除
    • データ型の変更
  • 抽象化方法の組合せ
    • 準RTLモデル、TLMモデル(1?n)、ソフトウェアモデル

以下では、これらの方法を順に見て行くことにします。

3. 4. 3. 1 実行制御方式の変更 (クロック同期 → イべント駆動)

RTLモデルのシミュレーションはクロックに同期しているため、 クロックが変化する毎にプロセスが起動されます。 これは例えそのプロセスが、その時には何も変化を与えない場合でも 起動され、例えば、メモリの割当が必要など、時間と資源を消費します。

そこで、 クロックが変化しても動作が行われないところではプロセスが起動しないように すると 高速化が可能になります。 つまりクロックが変化するたびに起動するのでなく、イべントがある時だけ 起動するようにします。 以下では、 SDRAM 制御回路とアドレスデコーダにクロック発生器が付いている RTL のモデルから、 クロック回路を省く例を示します。

3. 4. 3. 10 実行時間の調整

(変更前)

{{incex2(execution-time1.cpp)}}

(変更後)

{{incex2(execution-time2.cpp)}}

3. 4. 3. 10 実行時間の調整

(変更前)

{{incex2(execution-time1.cpp)}}

(変更後)

{{incex2(execution-time2.cpp)}}

3. 4. 3. 11 実行時間調整中の割込

(変更前)

{{incex2(interrupt1.cpp)}}

(変更後)

{{incex2(interrupt2.cpp)}}

3. 4. 3. 2 Address Decoder 部分

{{inc_dir("mef/hit")}} 次の記述は変更前のクロック同期の記述です。

{{incex2(address-decoder1.cpp)}}

次の記述は これをイべント駆動に書き替えたものです。 上の 3,4,5,6 行目にある 4 行の sc_port が、下の 6 行目にある event_if のポート一つに変っています。 また 上の 11,16 行目にある -> write() の行 が 16 行目の -> notify() に書き替っています。

{{incex2(address-decoder2.cpp)}}

3. 4. 3. 3 SDRAM Controller 部分

変更前の SDRAM Controller 部分 です:

{{incex2(sdram-controller1.cpp)}}

3,11 行目にあるクロックを削除。 4 行目のポート接続をイべントに変更。 これに関連して 14 行目の if 文を wait 文に変更しています。

{{incex2(sdram-controller2.cpp)}}

3. 4. 3. 4 Clock Generator (クロック発生器)

変更前のクロック発生部分です。

{{incex2(clock-gen1.cpp)}}

変更後は、この部分は不要になります。

3. 4. 3. 5 ブロック構成の変更

(変更前の RTL ブロック構成)

(変更後の構成)

ブロック構成の変更は、上図の上半分と下半分に分けて説明します。 ブロック構成の変更の一つ目は、次のように アドレス・デコーダと、バス調停の二つを一つにします。

(Bus Arbiter) + (Bus) + (Address Decoder)

                 ↓

                (Bus) + (Bus Arbiter & Addres Decoder)

先の図では、上半分の変更に相当します。 それぞれのブロックの、変更前の記述は次のとおりです。

■バス調停(変更前)

{{incex2(block/bus_arbiter1.cpp)}}

■アドレス・デコーダ(変更前)

{{incex2(block/address_decoder1.cpp)}}

■変更後は、以上のアドレス・デコーダとバス調停を 合せて次の一つにします。

{{incex2(block/address-decoder-bus-arbiter.cpp)}}

■Bus の部分は次のように書き換えます 。Bus の部分の変更前:

{{incex2(block/bus1.cpp)}}

■Bus の部分の変更後:

3,4 行目 の HBUSREQ/HBUSGRNT の行がなくなり、代りに ARBT_ADEC_IF の arbt になります。また 10,11 行目が 8 行目の arbt -> Arbitration( ) に変っています。

{{incex2(block/bus2.cpp)}}

■変更前のクロック部分は次の通りですが、これは変更後はなくなります。

{{incex2(block/clock1.cpp)}}

ブロック構成の変更の二つ目は、 前の図の下半分の SDRAM controller です。 ここは、6 個のモジュールからなっていたものを、一つのモジュールにします。 その部分だけを取出して変更の様子を図で示すと次のようになります。

この中の変更を次に六組の記述で示します。

■.1 初めは Bus Slave1 と Bus Slave2 を合せて SDRAM_Controller とする部分です。

{{incex2(block/bus-slave1.cpp)}}

{{incex2(block/bus-slave2.cpp)}}

以上の二つ Bus_Slave1 と Bus_Slave2 は 良く似ていて、 1,10,14 行目が違うだけです。 これらを一つの main にして、次のように書きます。 上の slave1 の 14 行目の slv_start->write(1); は、下の 16 行目の SDRAM_Register_Control() に変換します。 上の slave2 の 14 行目の reg_start -> write(1); は下の 18 行目の sdm_cmd_ACT(); に変換します。

{{incex2(block/main.cpp)}}

■.2 次の一組は図中央上の SDRAM_controller 部分です。

(変更前)

{{incex2(block/sdram-controller1.cpp)}}

(変更後)

{{incex2(block/sdram-controller2.cpp)}}

■.3 三組目は図中央下の register controller 部分です。

(変更前)

{{incex2(block/register1.cpp)}}

(変更後)

{{incex2(block/register2.cpp)}}

■.4 四組目は図右上の Bus Response 部分です。

(変更前)

{{incex2(block/bus-response1.cpp)}}

(変更後)

{{incex2(block/bus-response2.cpp)}}

■.5 五組目は図右下の Refresh Timer 部分です。 変更前は次のとおりですが、変更後は不要となり、記述はありません。

(変更前)

{{incex2(block/refresh-timer.cpp)}}

■.6 六組目は全体の接続構成を示す記述ですが、変更後は必要なくなります。

(変更前)

{{incex2(block/top.cpp)}}

3. 4. 3. 6 実装構成の変更

(変更前)

{{incex2(5.cpp)}}

(変更後)

{{incex2(6.cpp)}}

(変更前)

{{incex2(7.cpp)}}

(変更後)

{{incex2(8.cpp)}}

3. 4. 3. 7 データ転送手順の変更

(変更前)

{{incex2(data-transfer1.cpp)}}

(変更後)

{{incex2(data-transfer2.cpp)}}

(変更前)

{{incex2(data-transfer3.cpp)}}

(変更後)

{{incex2(data-transfer4.cpp)}}

3. 4. 3. 8 付加回路の削除

(変更前)

{{incex2(removing1.cpp)}}

(変更後)

{{incex2(removing3.cpp)}}

3. 4. 3. 9 データ型の変更

(変更前)

{{incex2(removing1.cpp)}}

(変更後)

{{incex2(removing3.cpp)}}

  3. 4. 3 RTLモデルを高速化するための抽象化の方法を知りたいのですが  
TOP > 3 高速協調検証システム > 3. 4 ハードウェアのモデル > 3. 4. 3 RTLモデルを高速化するための抽象化の方法を知りたいのですが