FC2カウンター FPGAの部屋 Verilatorを試してみる7(SystemCモード3:dice_topプロジェクト)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Verilatorを試してみる7(SystemCモード3:dice_topプロジェクト)

Verilatorを試してみる6(SystemCモード2:dice_state_machine.v のテストベンチ)”の続き。

今度は、”Verilatorを試してみる4(C++モード4:diceプロジェクト)”のSystemCテストベンチ版だ。
dice_topプロジェクトはそのままに、SystemCのテストベンチだけを下に示す。これは、simx_sc.vcdに波形を入れてVeritakで表示しようとしている。

// dice_top_tb_sc.cpp

#include "Vdice_top.h"
#include "verilated_vcd_sc.h"

int sc_main(int argc, char **argv) {

    Verilated::commandArgs(argc, argv);   // Remember args

    sc_clock clk ("clk"10, SC_NS);
    sc_signal<bool> reset_sw, roll;
    sc_signal<uint32_t> an_n;
    sc_signal<bool> a_n, b_n, c_n, d_n, e_n, f_n, g_n, dp_n;
    int clk_count;
    
    Vdice_top *top;
    
    top = new Vdice_top("top");
    
    top->clk(clk);
    top->reset_sw(reset_sw);
    top->roll(roll);
    top->an_n(an_n);
    top->a_n(a_n);
    top->b_n(b_n);
    top->c_n(c_n);
    top->d_n(d_n);
    top->e_n(e_n);
    top->f_n(f_n);
    top->g_n(g_n);
    top->dp_n(dp_n);
    
    Verilated::traceEverOn(true);
    VerilatedVcdC* tfp = new VerilatedVcdC;
    top->trace (tfp, 99);
    tfp->open ("simx_sc.vcd");
    
    reset_sw = 1;        // Set some inputs
    roll = 0;
    
    sc_start(11, SC_NS);    // 1nsずらす
    reset_sw = 0;
    
    sc_start(10, SC_NS);
    roll = 1;

    for (clk_count=0; clk_count<98; clk_count++){
        sc_start(10, SC_NS);
    }

    // sc_start(980, SC_NS);
    roll = 0;

    sc_start(20, SC_NS);
    roll = 1;

    tfp->close();
    delete top;
    
    exit(0);        // シミュレーション終了
}


コンパイル、make、実行するための入力コマンドを下に示す。

$ verilator -Wno-lint -sc --trace dice_top.v --exe dice_top_tb_sc.cpp
$ cd obj_dir/
$ make -j -f Vdice_top.mk Vdice_top
$ ./Vdice_top.exe


結果を下に示す。
Verilator_19_110531.png

これは正常終了しているのだが、Veritakでsimx_sc.vcd を表示すると波形がない。。。
Verilator_20_110531.png

どうやっても波形が記録されない。SystemCコードのバグか?どなたか気がついたことがあったら教えてください。

さて、上のSystemCコードはVerilatorの機能を使ってVCDファイルを作っているが、今度はSystemCの機能を使用して、VCDファイルを作ってみようと思う。
これを作るにあったっては、”Versys EDA Verilator”、”SystemC シミュレーション制御構文”、”SystemC波形出力”を参考にさせていただいた。
下にSystemCのテストベンチを示す。内部モジュールの信号はVdice_top.h を見て、top-> で指定すればtraceできるようだ。

// dice_top_tb_sc2.cpp

#include <systemc.h>
#include "Vdice_top.h"

int sc_main(int argc, char **argv) {

    Verilated::commandArgs(argc, argv);   // Remember args

    sc_clock clk ("clk"10, SC_NS);
    sc_signal<bool> reset_sw, roll;
    sc_signal<uint32_t> an_n;
    sc_signal<bool> a_n, b_n, c_n, d_n, e_n, f_n, g_n, dp_n;
    int clk_count;
    
    Vdice_top *top;
    
    top = new Vdice_top("top");
    
    top->clk(clk);
    top->reset_sw(reset_sw);
    top->roll(roll);
    top->an_n(an_n);
    top->a_n(a_n);
    top->b_n(b_n);
    top->c_n(c_n);
    top->d_n(d_n);
    top->e_n(e_n);
    top->f_n(f_n);
    top->g_n(g_n);
    top->dp_n(dp_n);
    
    sc_trace_file    *trace_f;
    trace_f = sc_create_vcd_trace_file("simx_sc2");
    trace_f->set_time_unit(1.0, SC_NS);
    
    sc_trace(trace_f, clk, "clk");
    sc_trace(trace_f, reset_sw, "reset_sw");
    sc_trace(trace_f, roll, "roll");
    sc_trace(trace_f, an_n, "an_n");
    sc_trace(trace_f, a_n, "a_n");
    sc_trace(trace_f, b_n, "b_n");
    sc_trace(trace_f, c_n, "c_n");
    sc_trace(trace_f, d_n, "d_n");
    sc_trace(trace_f, e_n, "e_n");
    sc_trace(trace_f, f_n, "f_n");
    sc_trace(trace_f, g_n, "g_n");
    sc_trace(trace_f, dp_n, "dp_n");
    sc_trace(trace_f, top->v__DOT__roll_ena, "roll_ena");
    sc_trace(trace_f, top->v__DOT__inst_dice_sm__DOT__spots_node, "spots");
    sc_trace(trace_f, top->v__DOT__inst_dice_sm__DOT__DICE_STATE, "DICE_STATE");

    reset_sw = 1;        // Set some inputs
    roll = 0;
    
    sc_start(11, SC_NS);    // 1nsずらす
    reset_sw = 0;
    
    sc_start(10, SC_NS);
    roll = 1;

    for (clk_count=0; clk_count<98; clk_count++){
        sc_start(10, SC_NS);
    }

    // sc_start(980, SC_NS);
    roll = 0;

    sc_start(20, SC_NS);
    roll = 1;

    sc_close_vcd_trace_file( trace_f );
    delete top;
    
    exit(0);        // シミュレーション終了
}


このテストベンチでコンパイル、make、実行を行った。
Verilator_21_110531.png

simx_sc2.vcd ができたので、Veritakで表示してみた。内部モジュールの信号も表示することができた。
Verilator_22_110531.png

(2011/06/01:追加)
最初のVCDファイルのsimx_sc.vcdのファイルの大きさは1.87KBで、信号の定義のみで波形の記述はありませんでした。Notepad++で見てみましたが、波形情報が空です。ですから、波形フォーマットがおかしくて、Veritakで表示されない状態ではないです。次のsimx_sc2.vcdのファイルの大きさは3.48KBで、Notepad++で見ると波形情報が記述されていました。
  1. 2011年05月31日 21:56 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1816-317400f1
この記事にトラックバックする(FC2ブログユーザー)