無償ツールで実践する「ハード・ソフト協調検証」(6) ―― 協調シミュレーションを実行する

Verification Enginnerの戯言

tag: 半導体

技術解説 2010年1月15日

15.シミュレーションを行う

 ModelSim AE 6.5bを起動し,プロジェクト・ファイル(avalon_bfm_sim.mpf)をロードし,set_dpi_sim.doマクロを実行します.set_dpi_sim.doマクロの実行が終了したら,シミュレーション・コマンド_vsim(set_dpi_sim.doマクロでaliasにて定義している)を実行し,シミュレーションが起動してロードされます.ここで,波形コマンド(wave.do)を実行します.wave.doファイルはAvalon_BFM_DPI_C.zipの中にあります.  

do wave.do

 

 波形コマンド(wave.do)を実行したあと,シミュレーションを開始します.

 シミュレーションは,tb_progモジュール(tb_prog.sv)のinitial文を実行し, 

dpi_main();
 => C言語のdpi_main関数(test_32,test_16,test_8)
#100; (100nsウエイト)
$finish(2);

 

で$finishシステム・タスクが実行されると,シミュレーション終了のダイアログが表示されます.ここで[No]ボタンをクリックします([Yes]ボタンをクリックするとModelSim AE 6.5bが終了してしまうので要注意).

 [No]ボタンをクリックしてシミュレータが停止したあと,波形を見ると,ライト/リードのサイクルが3回繰り返されています.

 

16.Nios CPUを使ったときとの比較

 Avalonインターフェースを持つ回路を検証する方法としては,ここで紹介したAvalon BFM + DPI-Cによる方法のほかに,Nios CPUによる方法があります.どちらもC言語によるプログラムにて,Avalonインターフェースを持つ回路を検証できます.しかし,Nios CPUによる方法では,Nios CPUがRTL記述であるため,Nios CPUを実行するためにシミュレーションに時間がかかります.また,テスト・プログラムのすべてがNios CPU上で実行されるので,バス・アクセスに関係ない部分のコードもNios CPUで実行せざるをえません.例えばデータの比較やエラー・メッセージ部分などをNios CPUで実行すると非常に時間がかかり,本来確かめたい部分であるAvalonインターフェース部分へのアクセスのコードに到達するまでに多くのシミュレーション時間が必要になります.

 連載第5回の「10.テスト・プログラムを書いてみる」で説明したテスト・プログラム(test_8関数)を見てみましょう.この関数をDPI-Cで実行すると,バス・サイクルとして,bfm_write8,bfm_read8,bfm_nopの三つの関数だけでシミュレーション時間を進める部分になり,それ以外の部分はC言語のプログラム,つまりシミュレータの一部として実行されます.一方,Nios CPUを用いた場合は,test_8関数のすべてがNios CPU上で実行されます.特にprintf文をNios CPUで実行すると,非常に長いシミュレーション時間が必要になります.

int test_8( void ){
    unsigned int addr;
    unsigned char data, exp;

    addr = 0x00000053;
    data = 0x5a;   
    bfm_write8( addr, data );
    bfm_nop(10);   
    bfm_read8 ( addr, &exp );
   
    if( data != exp ){
        printf("compare error : 0x%x != 0x%x\n", data, exp );
        return 1;
    }
    return 0;
}

 

17.ライブラリ化する

 今回作成したtb_prog.svを,SOPC Builderのライブラリとして使えるように変更していきます.ライブラリ名はavalon_cpuです.tb_prog.svファイルをavalon_cpu.svファイルにコピーします.

 変更する点は次の二つです. 

  • モジュール名をtb_progからavalon_cpuに変更する
  • BFMマクロを変更する

リスト9 変更前の記述(tb_prog)

module tb_prog;

timeunit 1ns;
timeprecision 1ns;

`define BFM test_bench.DUT.the_mm_master_bfm_0.mm_master_bfm_0

........

endmodule : tb_prog

 

 

リスト10 変更前の記述(avalon_cpu)

module avalon_cpu;

  timeunit      1ns;
  timeprecision 1ns;

`define BFM cpu

  ........

endmodule : avalon_cpu

 

 次にavalon_cpuモジュールにインターフェース信号を追加し,Avalon Memory Mapped Master BFMをインスタンスします.

リスト11 インターフェース信号とインスタンス

module avalon_cpu (

        input  wire        clk,
        input  wire        reset,
        output wire [31:0] avm_address,
        output wire [2:0]  avm_burstcount,
        input  wire [31:0] avm_readdata,
        output wire [31:0] avm_writedata,
        input  wire        avm_waitrequest,
        output wire        avm_write,
        output wire        avm_read,
        output wire [3:0]  avm_byteenable,
        input  wire        avm_readdatavalid        

        );

        altera_avalon_mm_master_bfm #(

  .AV_ADDRESS_W             (32),
  .AV_SYMBOL_W              (8),
  .AV_NUMSYMBOLS            (4),
                .AV_BURSTCOUNT_W          (3),
                .USE_READ                 (1),
                .USE_WRITE                (1),
                .USE_ADDRESS              (1),
  .USE_BYTE_ENABLE          (1),
  .USE_BURSTCOUNT           (1),
  .USE_READ_DATA            (1),
  .USE_READ_DATA_VALID      (1),
  .USE_WRITE_DATA           (1),
  .USE_BEGIN_TRANSFER       (0),
         .USE_BEGIN_BURST_TRANSFER (0),
  .USE_WAIT_REQUEST         (1),
         .AV_BURST_LINEWRAP        (1),
  .AV_BURST_BNDR_ONLY       (1),
  .AV_MAX_PENDING_READS     (1),
         .AV_FIX_READ_LATENCY      (1)

            )
            cpu (
  .clk                    (clk),
                .reset                  (reset),
                .address                (avm_address),
  .avm_burstcount         (avm_burstcount),
  .avm_readdata           (avm_readdata),
  .avm_writedata          (avm_writedata),
  .avm_waitrequest        (avm_waitrequest),
  .avm_write              (avm_write),
  .avm_read               (avm_read),
  .avm_byteenable         (avm_byteenable),
  .avm_readdatavalid      (avm_readdatavalid),
  .avm_begintransfer      (),
  .avm_beginbursttransfer ()
 );

`define BFM cpu

endmodule : avalon_cpu 

 

 この時点で,avalon_cpuモジュールはDPI-C経由でC言語のテスト・プログラムが利用できるAvalon BFMになりました.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日