FC2カウンター FPGAの部屋 シミュレーション

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

FPGAの部屋

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

Cygwin で nvc (VHDL compiler and simulator) を試してみた2

Writing a VHDL compiler”を参考にして、counter.vhd と top.vhd を作ってやってみた。
(注)いろいろと試行錯誤しているので、お見苦しい点がありますが、ご了承ください。

counter.vhd を作って、
nvc -a counter.vhd
コマンドを実行すると work ディレクトリが出来て、その下に _index _NVC_LIB WORK.COUNTER WORK.COUNTER-BEHAV ファイルができた。
nvc_12_141222.png

top.vhd を作って、
nvc -a top.vhd
コマンドを実行すると、work ディレクトリに WORK.TOP WORK.TOP-TEST が増えていた。
nvc_13_141222.png

nvc -e top
コマンドを実行すると、work ディレクトリに _WORK.TOP.elab.bc  _WORK.TOP.elab.deps.txt _WORK.TOP.elab.netdb _WORK.TOP.final.bc が生成された。
nvc_14_141222.png

nvc -r --stop-time=50ns top
コマンドを実行すると、コアダンプしました。orz

nvc -r -c top
show signals

でもコアダンプです。
nvc_15_141222.png
  1. 2014年12月22日 21:33 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Cygwin で nvc (VHDL compiler and simulator) を試してみた1

hiyuh さんに教えてもらった nvc (VHDL compiler and simulator) を Cygwin にインストールして、試してみることにした。

・LLVM を Cygwin にインストールした。
nvc_3_141222.png

・GitHub から nvc を clone する。
git clone https://github.com/nickg/nvc.git

nvc というディレクトリができた。
nvc_1_141222.png

・GitHub のReadme.md に書いてあるインストール・コマンドを入力した。
cd nvc
./autogen.sh

nvc_2_141222.png

./tools/fetch-ieee.sh を実行するとエラー。curl をインストールする必要があるようだ。
nvc_4_141222.png

・Cygwin で curl をインストールした。
nvc_5_141222.png

もう一度、./tools/fetch-ieee.sh を実行した。今度は成功。
nvc_6_141222.png

・続けでコマンドを実行した。
mkdir build && cd build
../configure

nvc_7_141222.png

make
nvc_8_141222.png

致命的なエラーが出ちゃいました。

・src/rt/shell.c の 39, 43 行目をコメントアウトした。
nvc_10_141222.png

・もう一度、make を行うと警告はあったが、通った。
nvc_9_141222.png

make install
nvc_11_141222.png

なんとか通ったみたいだけど、大丈夫だろうか?
  1. 2014年12月22日 05:20 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

ISEからのQuestaシミュレーションでMicron社のDDR3モデルを使用する

ISEからQuestaを使ったシミュレーションを行っている。その際に、Micron社のDDR3 Verilog HDL model(モデルのダウンロードが始まるので注意)を使わせて頂いている。その場合の注意点を覚書で残しておく。

ddr3.v を修正した。

・string で宣言してある行をコメントアウト

・int 宣言を integer 宣言に変更

・2048Mb_ddr3_parameters.vh の ceil()を削除


このくらいだったか?後は忘れた。。。

ISEのシミュレーション状態で、Questaのプロパティを下図の様に変更した。
Questa_2_140206.png

vlog のオプションは、vhファイルを2Gbit のDDR3 SDRAMに設定して、sg125グレードを使用し、16ビット・データ幅にセットするためのdefineである。

bank_fileが開けないと言われてfinishしてしまうのを回避するために、1つ上の階層に ddr3 フォルダを作成して、+model_data+../ddr3 を vsim のオプションとして使用する。これは、”MIG DDR3 using MAX_MEM module error: simulation cannot run because file can not open ”の2ページ目を参考にした。

なお、RESETが外れてから、MIGの init_calib_complete が 1 になるまで 110us 程度かかっている。(ビヘイビアー シミュレーションで、MIGへの供給クロックが400MHzの場合、DDR3-800、C_SIM_BYPASS_INIT_CAL = "FAST")
Questa_1_140204.png
  1. 2014年02月06日 10:41 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

ISE14.6からQuestaSim10.1bを使用する

ISE14.6からQuestaSim10.1bを使用するための覚書

1,ISE の Tools の中の Simulation Library Compilation Wizard でModelSim のシミュレーション・ライブラリをコンパイルする。

2.QuestaSim10.1b のフォルダの modelsim.ini に 1.でコンパイルしたシミュレーション・ライブラリのフォルダを指定する。

cpld = D:/HDL/Xilinx/14.6/ISE_DS/ISE/vhdl/questasim/10.1b/nt64/cpld
simprim = D:/HDL/Xilinx/14.6/ISE_DS/ISE/vhdl/questasim/10.1b/nt64/simprim
unimacro = D:/HDL/Xilinx/14.6/ISE_DS/ISE/vhdl/questasim/10.1b/nt64/unimacro
unisim = D:/HDL/Xilinx/14.6/ISE_DS/ISE/vhdl/questasim/10.1b/nt64/unisim
xilinxcorelib = D:/HDL/Xilinx/14.6/ISE_DS/ISE/vhdl/questasim/10.1b/nt64/xilinxcorelib
cpld_ver = D:/HDL/Xilinx/14.6/ISE_DS/ISE/verilog/questasim/10.1b/nt64/cpld_ver
secureip = D:/HDL/Xilinx/14.6/ISE_DS/ISE/verilog/questasim/10.1b/nt64/secureip
simprims_ver = D:/HDL/Xilinx/14.6/ISE_DS/ISE/verilog/questasim/10.1b/nt64/simprims_ver
uni9000_ver = D:/HDL/Xilinx/14.6/ISE_DS/ISE/verilog/questasim/10.1b/nt64/uni9000_ver
unimacro_ver = D:/HDL/Xilinx/14.6/ISE_DS/ISE/verilog/questasim/10.1b/nt64/unimacro_ver
unisims_ver = D:/HDL/Xilinx/14.6/ISE_DS/ISE/verilog/questasim/10.1b/nt64/unisims_ver
xilinxcorelib_ver = D:/HDL/Xilinx/14.6/ISE_DS/ISE/verilog/questasim/10.1b/nt64/xilinxcorelib_ver


3.環境変数のXilinxに、ISE14.6を指定する。”Xilinx"、”D:\HDL\Xilinx\14.6\ISE_DS\ISE”

4.シミュレーションするISEプロジェクトのあるフォルダに、QuestaSim10.1b のフォルダの modelsim.iniをコピーする。

5.Project Navigator の Design Properties の Simulator で Questa を指定する。

6.Simulation モードにした時の、Simulate Behavioral Model を右クリックし、右クリックメニューからProcess Properties... を選択する。

7.Process Propertiesダイアログで、Ignore Pre-Compiled Library Compilation Message にチェックを入れる。
error in modelsim from project navigator”参照。

  1. 2013年08月22日 17:24 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Xilinx Simulation Library Compilation Wizard でQuesta 用のライブラリをコンパイル

Questa をISE14.1 のシミュレータとして使用するには、XilinxのプリミティブやCoregen 用のライブラリをコンパイルする必要がある。そのためにXilinxからSimulation Library Compilation Wizard が提供されている。今回はこの使い方を説明用に書いておく。(Windows7 pro 64ビット版使用)

・Windows のスタートメニューからXilinx Design Tools -> ISE Design Suite 14.1 -> ISE Design Tools -> 64-bit Tools -> Simulation Library Compilation Wizard を起動する。
compxlib_1_120618.png

・Xilinx Simulation Library Compilation Wizard が起動した。Select Simulator でQuesta Simulator を選択する。
compxlib_2_120618.png

・次の画面は、VHDL, Verilog どちらのライブラリを生成するかを選択するが、両方を選択しておく。
compxlib_3_120618.png

・どのデバイス・ファミリのライブラリを生成するかを選択する画面だが、チェックの外し方によっては不正終了してしまったので、そのままとする。
compxlib_4_120618.png

・Launch Compile Process > ボタンをクリックする。
compxlib_6_120618.png

・ライブラリのコンパイルが開始された。
compxlib_7_120618.png

・コンパイルが終了した。
compxlib_8_120618.png

・Summary を表示で終了。
compxlib_9_120618.png

・Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64の下と、Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64の下にQuestaのライブラリができた。
compxlib_10_120618.png
compxlib_11_120618.png

・、Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64にmodelsim.ini があるので、これを開いた。
compxlib_12_120618.png

・[Library] 部分のパスをQuesta のインストールフォルダのmodelsim.ini にコピーして追加する。

これで終了だが、ライブラリパスが多すぎるので、最初は下に示すくらいのライブラリパスを書いておけば良いと思う。ないと言われたら追加すれば?と思う。

unisim = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/unisim
unimacro = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/unimacro
unisims_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/unisims_ver
unimacro_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/unimacro_ver
simprim = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/simprim
simprims_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/simprims_ver
xilinxcorelib = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/xilinxcorelib
xilinxcorelib_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/xilinxcorelib_ver
uni9000_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/uni9000_ver
cpld = D:\HDL\Xilinx\14.1\ISE_DS\ISE\vhdl\questasim\10.1b\nt64/cpld
cpld_ver = D:\HDL\Xilinx\14.1\ISE_DS\ISE\verilog\questasim\10.1b\nt64/cpld_ver


  1. 2012年06月18日 13:10 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Verilatorを試してみる9(DPI-C:SystemVerilogからCの関数を呼び出す)

VerilatorでDPI-Cがうまくいかないとツイッターに書いたら、武内さんからVerilatorでDPI-Cが動いたよとツイッターで教えていただいた。ありがとうございます。いつもお世話になっております。
武内さんの”電気回路/HDL/Verilator で DPI-C”を参考にさせていただいて、やってみた。

私はVerilator ManualのDPI Sample記述をそのままにやっていた。下にそのDPI Sampleを引用する。
まずはVerilogサンプルから。

module test;
import "DPI-C" function integer add (input integer a, input integer b);

   initial begin
      $display("%x + %x = %x", 1, 2, add(1,2));
   end
endmodule


次にC++のサンプルを下に引用する。

    #include "svdpi.h"
    #include "Vour__Dpi.h"
    int add (int a, int b) { return a+b; }


これでコンパイルした。

verilator -cc our.v --exe sc_main.cpp


しかし、Inernal Errorになってしまった。
Verilator_26_110605.png

どうやら、$display("%x + %x = %x", 1, 2, add(1,2));で$displayの中にadd(1,2)を書くのがダメそうだ。そこで、int c;を定義して、$displayの前にadd()をコールしてみた。下に修正後のVerilogソースを示す。ついでに$finish;も追加した。

module test;
import "DPI-C" function integer add (input integer a, input integer b);

   int c;
   initial begin
      c = add(1, 2);
      $display("%x + %x = %x", 1, 2, c);
      $finish;
   end
endmodule


これでコンパイルしたら通った。次にobj_dirにcd して、makeを実行した。

make -j -f Vour.mk Vour


今度は ld がステータス1で終了してしまった。
Verilator_27_110605.png

電気回路/HDL/Verilator で DPI-C”をよく見ながら考えた。そうだC++にmain()が書いていない。。。おマヌケだった。。
他も修正した結果を下に示す。

#include <verilated.h> 
#include "Vour.h"
#include "svdpi.h"
#include "Vour__Dpi.h"

extern "C" int add (int a, int b) { return a+b; }

unsigned int main_time = 0;     // Current simulation time

double sc_time_stamp () {       // Called by $time in Verilog
    return main_time;
}

int main(int argc, char** argv) {
    Verilated::commandArgs(argc, argv);   // Remember args

    Vour *top = new Vour();   // Create instance

    while (!Verilated::gotFinish()) {

        top->eval();    // 評価

        main_time++;
    }

    top->final();        // シミュレーション終了
}


これで、コンパイル、makeして、実行ファイルができたので、実行した。
Verilator_28_110605.png

うまく行きました。良かった。。。

次に、Verilogでadd()をtask としてresultを出力として返すようにVerilogファイルを変更した。

module test;

import "DPI-C" task add (input int a, input int b, output int result);

   integer a, b, result;
   initial begin
      a = 1;
      b = 2;
      add(a, b, result);
      $display("%x + %x = %x", a, b, result);
      $finish;
   end
endmodule


C++の方も示す。

#include <verilated.h> 
#include "Vour2.h"
#include "Vour2__Dpi.h"

extern "C" int add (int a, int b, int *result) { 
    *result = a + b;
    return (0); 
}
    
unsigned int main_time = 0;     // Current simulation time

double sc_time_stamp () {       // Called by $time in Verilog
    return main_time;
}

int main(int argc, char** argv) {
    Verilated::commandArgs(argc, argv);   // Remember args

    Vour2 *top = new Vour2();   // Create instance

    while (!Verilated::gotFinish()) {

        top->eval();    // 評価

        main_time++;
    }

    top->final();        // シミュレーション終了
}


同様にコンパイル、make、実行したら、うまく行った。
Verilator_29_110605.png
  1. 2011年06月05日 07:59 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Verilatorを試してみる8(SystemCモード4:CharDispCtrlerプロジェクト)

今度は、キャラクタ・ディスプレイ・コントローラ(CharDispCtrler.v) をVerilatorでシミュレーションしてみることにした。
"キャラクタ・ディスプレイ・コントローラ"、”キャラクタ・ディスプレイ・コントローラの構成”を参照のこと。

ここでの問題は、char_gen_rom.v でXilinxのプリミティブのRAMB16_S9とframe_buffer.v で同じくRAMB16_S2_S2を使用していることだ。果たしてXilinx社製のプリミティブがVerilatorでシミュレーション出来るかが問題だと思った。
Webで検索してみると、Verilatorのフォーラムの”Simulating Xilinx Projects”を発見して、この通りにやってみることにした。(結論としてはうまくいきませんでした)

まずは、Xilinx社のプリミティブのソースのうちのRAMB16_S9.v, RAMB16_S2_S2.v, glbl.v を現在のフォルダにコピーした。(もうすでにCharDispCtrler_tb_sc.cppを作成してある)
Verilator_24_110602.png

SystemCのテストベンチ、CharDispCtrler_tb_sc.cppを作成した。CharDispCtrler_tb_sc.cppを下に示す。

// CharDispCtrler_tb_sc.cpp

#include "VCharDispCtrler.h"
#include "verilated_vcd_sc.h"

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

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

    sc_clock clk ("clk"40, SC_NS);
    sc_signal<bool> reset;
    sc_signal<uint32_t> processor_addr;
    sc_signal<uint32_t> processor_din;
    sc_signal<bool> processor_we;
    sc_signal<bool> VGA_RED, VGA_GREEN, VGA_BLUE;
    sc_signal<bool> VGA_HSYNC, VGA_VSYNC;
    int clk_count;
    
    VCharDispCtrler *top;
    
    top = new VCharDispCtrler("top");
    
    top->clk(clk);
    top->reset(reset);
    top->processor_addr(processor_addr);
    top->processor_din(processor_din);
    top->processor_we(processor_we);
    top->VGA_RED(VGA_RED);
    top->VGA_GREEN(VGA_GREEN);
    top->VGA_BLUE(VGA_BLUE);
    top->VGA_HSYNC(VGA_HSYNC);
    top->VGA_VSYNC(VGA_VSYNC);
    
    Verilated::traceEverOn(true);
    VerilatedVcdC* tfp = new VerilatedVcdC;
    top->trace (tfp, 99);
    tfp->open ("simx_sc.vcd");
    
    processor_addr = 0;
    processor_din = 0;
    processor_we = 0;
    reset = 1;
    
    sc_start(45, SC_NS);
    reset = 0;
    
    sc_start(160, SC_NS);
    processor_din = 0x3B0;    // RGB=111(最上位), キャラクタ0
    
    sc_start(40, SC_NS);
    processor_we = 1;
    processor_addr = 80;    // 画面の2行1列目のキャラクタのアドレス
    
    sc_start(40, SC_NS);
    processor_we = 0;
    processor_din = 0x3C1;    // RGB=111(最上位), キャラクタA
    
    sc_start(40, SC_NS);
    processor_we = 1;
    processor_addr = 81;    // 画面の2行2列目のキャラクタのアドレス
    
    sc_start(40, SC_NS);
    processor_we = 0;
    
    sc_start(20000000, SC_NS);
    
    tfp->close();
    delete top;
    
    exit(0);        // シミュレーション終了
}    


最初に、とりあえずそのままの状態でコンパイルを試みた。コマンドを下に示す。

verilator -Wno-lint -sc --trace CharDispCtrler.v --exe CharDispCtrler_tb_sc.cpp


そうすると予想通りエラー。
Verilator_23_110601.png

Verilatorのフォーラムの”Simulating Xilinx Projects”に従って、RAMB16_S9.v, RAMB16_S2_S2.v, glbl.vを書き換えてみることにした。

1.glbl.vをWebサイトからダウンロードしたファイルに交換(これでglbl.vは終了)
2.module文の下に、// verilator tracing_offを挿入した
3.tri0 GSRを含むラインを消去した
4.GSRをglbl.GSRに置換した
5.initial文内の<= を= に置換した
6.遅延を表す#100 などを消去した
7.char_gen_rom.v, frame_buffer.v にglbl glbl;文を追加した


上記の対策を取ってみたが、やはりエラーが出る。可能なかぎり対策をとてみたがInternal Errorが出てしまった。
Verilator_25_110602.png

ここで諦めることにする。Verilatorのフォーラムの”Simulating Xilinx Projects”でもBlock RAMの変換は成功していないそうだ。残念。。。

Verilatorは、Verilogの論理合成記述のみが変換可能なのが残念だ。XilinxのIPは自分で書きなおさないと使用することが出来ないようだ。
  1. 2011年06月02日 05:26 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:4
»