FC2カウンター FPGAの部屋 2011年05月

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

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

Verilatorを試してみる5(SystemCモード1:SystemCのインストール)”の続き。

今度は、自分で作ったVerilogファイルのdice_state_machine.v のSystemCテストベンチを自分で書きなおしてみた。

武内さんの”電気回路/HDL/SystemC によるテストベンチ”がとても参考になった。書いてあるSystemCのテストベンチの実装の仕方のうちの”new で作成してポインタ変数に代入する”方法でSystemCテストベンチを書いてみた。そのdsm_sc.cppを下に示す。dice_state_machine.v のコードはここを参照

#include "Vdice_state_machine.h"

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

    Verilated::commandArgs(argc, argv);

    sc_clock clk ("clk"10, SC_NS);
    sc_signal<bool> reset_sw, roll, roll_ena;
    sc_signal<uint32_t> spots;
    Vdice_state_machine *top;
    int clk_count;
    
    top = new Vdice_state_machine("top");
    
    top->clk(clk);
    top->reset_sw(reset_sw);
    top->roll(roll);
    top->roll_ena(roll_ena);
    top->spots(spots);
    
    reset_sw = 1;
    roll = 0;
    roll_ena = 0;
    
    sc_start(11, SC_NS);    // 1nsずらす
    reset_sw = 0;
    
    sc_start(10, SC_NS);
    roll = 1;
    
    for (clk_count=0; clk_count<20; clk_count++){
        sc_start(10, SC_NS);
        roll_ena = !roll_ena;
        cout << "roll_ena = " << roll_ena << " spots = " << spots << endl;
    }
    
    delete top;
    
    exit(0);        // シミュレーション終了
}


実行したコマンドは下の通り。

$ verlator -Wno-lint -sc dice_sta_machine.v --exe dsm_sc.cpp
$ cd obj_dir
$ make -j -f Vdice_state_machine.mk Vdice_state_machine
$ ./Vdice_state_machine.exe


上のコマンドを実行すると、下の様な結果を得られた。
Verilator_17_110529.png


次に、VCDファイルを出力するdsm_sc_vcd.cpp を下に示す。

#include "Vdice_state_machine.h"
#include "verilated_vcd_sc.h"

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

    Verilated::commandArgs(argc, argv);

    sc_clock clk ("clk"10, SC_NS);
    sc_signal<bool> reset_sw, roll, roll_ena;
    sc_signal<uint32_t> spots;
    Vdice_state_machine *top;
    int clk_count;
    
    top = new Vdice_state_machine("top");
    
    top->clk(clk);
    top->reset_sw(reset_sw);
    top->roll(roll);
    top->roll_ena(roll_ena);
    top->spots(spots);

    Verilated::traceEverOn(true);
    VerilatedVcdSc* tfp = new VerilatedVcdSc;
    top->trace (tfp, 99);
    tfp->open ("simx.vcd");
    
    reset_sw = 1;
    roll = 0;
    roll_ena = 0;
    
    sc_start(11, SC_NS);    // 1nsずらす
    reset_sw = 0;
    
    sc_start(10, SC_NS);
    roll = 1;
    
    for (clk_count=0; clk_count<20; clk_count++){
        sc_start(10, SC_NS);
        roll_ena = !roll_ena;
        cout << "roll_ena = " << roll_ena << " spots = " << spots << endl;
    }
    
    tfp->close();
    delete top;
    
    exit(0);        // シミュレーション終了
}


これをコンパイル、make、実行するのに使用したコマンドを下に示す。

$ verlator -Wno-lint --trace -sc dice_sta_machine.v --exe dsm_sc_vcd.cpp
$ cd obj_dir
$ make -j -f Vdice_state_machine.mk Vdice_state_machine
$ ./Vdice_state_machine.exe


実行まで行うと、simx.vcd ファイルが生成される。それをVeritakで表示すると下のようになる。
Verilator_18_110529.png
  1. 2011年05月29日 20:44 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

プリンセストヨトミ(映画)を見てきた

今日は奥さんとプリンセストヨトミを見てきた。大阪の映画だった。キャストは豪華でいい味出していたと思うが、ストーリーはハチャメチャの様な?それが良いのかもしれない?
ブッダ(手塚治虫)も見てみたい。
  1. 2011年05月29日 14:56 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Verilatorを試してみる5(SystemCモード1:SystemCのインストール)

前回は、VerilatorでC++のテストベンチでシミュレーションしたが、今度はSystemCをインストールしてテストベンチをSystemCで書いてみようと思う。

C++モードと同様に、武内さんの”電気回路/HDL/SystemC の導入”に従ってインストールしたが、途中でbambooflow Noteの”インストールメモ”の”SystemC-2.2インストール(Cygwin)”を参考にしてインストールした。

最初にCygwinの自分のホームの下にsystemcディレクトリを作成して、SystemCのファイルを”Download Standards”からダウンロードした。(ダウンロードの際に簡単な登録が必要。参照Webページ
ブラウザで、Cygwinのホームの下のsystemcの下にダウンロードした。

次に、tarで解凍しようとしたが、エラーが出てしまった。
Verilator_13_110528.png

これは、Windows上でLhaplusで解凍した。
Verilator_14_110528.png

~/systemc/systemc-2.2.0/src/sysc/utils/sc_utils_ids.cpp のインクルード文の前に

#include "string.h"
#include "cstdlib"


を追加した。
~/systemc/systemc-2.2.0/src/sysc/kernel/sc_constants.h の57行目を

const int SC_DEFAULT_STACK_SIZE = 0x50000;


に変更した。

次のコマンドを入力して、SystemCのインストールを行った。

$ mkdir objdir
$ cd objdir/
$ export CXX=g++
$ ../configure
$ make pthreads
$ make install
$ make check
$ make pthreads_check


でインストールが完了した。SystemCライブラリが~/systemc/systemc-2.2.0/にインストールされたそうだ。

電気回路/HDL/SystemC の導入”に載っているサンプルをコンパイル、make、実行してみた。結果を下に示す。
Verilator_15_110528.png

うまく行ったようだ。

次に、bin2bcd_sc.cpp の35,36行目を下のように変更してやってみた。

    while(busy){
        sc_start(10, SC_NS);
        cout << "bcd = ";
        cout << hex << showbase << bcd << endl;
    }


うまく表示してくれた。
Verilator_16_110528.png

  1. 2011年05月28日 13:09 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Verilatorを試してみる4(C++モード4:diceプロジェクト)

Verilatorを試してみる3(C++モード3:VCDファイルを出力)”の続き。

今度は、ISE11.1iのチュートリアルで使用しているdiceをVerilogで書いたものをシミュレーションしてみた。つまり、今までは単一のVerilogファイルをVerilatorでシミュレーションしていたが、今回は複数のVerilogファイルから成るプロジェクトをVerilatorでシミュレーションしてみた。
まずは、dice_top.vから下に示す。

`default_nettype none

`timescale 1ns / 1ps


// 電子サイコロ Verilog2001


module dice_top(
    input wire reset_sw,
    input wire clk,
    input wire roll,
    output wire [3:0] an_n,
    output wire a_n,
    output wire b_n,
    output wire c_n,
    output wire d_n,
    output wire e_n,
    output wire f_n,
    output wire g_n,
    output wire dp_n

);
    
    wire roll_sig;
    wire roll_ena;
    wire [2:0] binary;
    
    assign an_n = 4'b1110; // AN0のみ点灯
    assign dp_n = 1'b1; // ドットの消灯
    
    reject_chatter inst_reject_chatter(
        .reset_sw(reset_sw),
        .clk(clk),
        .roll(roll),
        .roll_sig(roll_sig),
        .roll_ena(roll_ena)
    );
        
    dice_state_machine inst_dice_sm(
        .reset_sw(reset_sw),
        .clk(clk),
        .roll(roll_sig),
        .roll_ena(roll_ena),
        .spots(binary)
    );

    seven_seg_dec inst_seven_seg_dec(
        .binary(binary),
        .a_n(a_n),
        .b_n(b_n),
        .c_n(c_n),
        .d_n(d_n),
        .e_n(e_n),
        .f_n(f_n),
        .g_n(g_n)
    );
    
endmodule

`default_nettype wire


dice_state_machine.v は、ここに示したので、seven_seg_dec.v を下に示す。

`default_nettype none
`timescale 1ns / 1ps

// 7セグメントLEDデコーダ、0で点灯します。

(* bram_map="yes" *)
module seven_seg_dec(
    input wire [2:0] binary,
    output reg a_n,
    output reg b_n,
    output reg c_n,
    output reg d_n,
    output reg e_n,
    output reg f_n,
    output reg g_n
);

    always @* begin
        case (binary)
            3'd1 : begin
                a_n=1'b1; b_n=1'b0; c_n=1'b0; d_n=1'b1; e_n=1'b1; f_n=1'b1; g_n=1'b1;
            end
            3'd2 : begin
                a_n=1'b0; b_n=1'b0; c_n=1'b1; d_n=1'b0; e_n=1'b0; f_n=1'b1; g_n=1'b0;
            end
            3'd3 : begin
                a_n=1'b0; b_n=1'b0; c_n=1'b0; d_n=1'b0; e_n=1'b1; f_n=1'b1; g_n=1'b0;
            end
            3'd4 : begin
                a_n=1'b1; b_n=1'b0; c_n=1'b0; d_n=1'b1; e_n=1'b1; f_n=1'b0; g_n=1'b0;
            end
            3'd5 : begin
                a_n=1'b0; b_n=1'b1; c_n=1'b0; d_n=1'b0; e_n=1'b1; f_n=1'b0; g_n=1'b0;
            end
            3'd6 : begin
                a_n=1'b0; b_n=1'b1; c_n=1'b0; d_n=1'b0; e_n=1'b0; f_n=1'b0; g_n=1'b0;
            end
            default : begin
                a_n=1'b1; b_n=1'b0; c_n=1'b0; d_n=1'b1; e_n=1'b1; f_n=1'b1; g_n=1'b1;
            end
        endcase
    end
endmodule
`default_nettype wire


最後にreject_chatter.v を下に示す。

`default_nettype none
`timescale 1ns / 1ps

// スイッチのチャタリング除去とサイコロの表示変更タイミング20msをカウントする
// Verilog2001

module reject_chatter(
    input wire reset_sw,
    input wire clk,
    input wire roll,
    output wire roll_sig,
    output reg roll_ena
);
    reg [17:0] sw_cnt;
    reg [1:0] roll_cnt;
    reg roll_node;
    
    parameter frequency_KHz = 1; // KHz単位でのクロック周波数(シミュレーション用に値を変更)
    // parameter frequency_KHz = 50000; // KHz単位でのクロック周波数
    parameter divided_200Hz = frequency_KHz * 5; // 200Hzに分周するための分周比
    
    // 200Hz, 5ms
    always @(posedge clk) begin
        if (reset_sw)
            sw_cnt <= 18'd0;
        else begin
            if (sw_cnt == (divided_200Hz-1))
                sw_cnt <= 18'd0;
            else
                sw_cnt <= sw_cnt + 18'd1;
        end
    end
    
    always @(posedge clk) begin
        if (reset_sw)
            roll_node <= 1'b0;
        else
            if (sw_cnt == (divided_200Hz-1))
                roll_node <= roll;
    end
    assign roll_sig = roll_node;
    
    // 50Hz, 20ms
    always @(posedge clk) begin
        if (reset_sw) begin
            roll_cnt <= 2'd0;
            roll_ena <= 1'b0;
        end else begin
            if (sw_cnt==(divided_200Hz-1)) begin
                if (roll_cnt==2'b11) begin
                    roll_cnt <= 2'd0;
                    roll_ena <= 1'b1;
                end else begin
                    roll_cnt <= roll_cnt + 2'd1;
                    roll_ena <= 1'b0;
                end
            end else
                roll_ena <= 1'b0;
        end
    end
endmodule    
`default_nettype wire


parameter の frequency_KHz はシミュレーション用に1に設定してある。
次に、dice_top.v 用のテストベンチ、dice_top_tb.cpp を下に示す。

// dice_top_tb.cpp

#include <iostream>
#include <verilated.h>    // Defines common routines
#include "verilated_vcd_c.h"
#include "Vdice_top.h"

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
    
    Vdice_top *top = new Vdice_top();
    
    Verilated::traceEverOn(true);
    VerilatedVcdC* tfp = new VerilatedVcdC;
    top->trace (tfp, 99);
    tfp->open ("simx.vcd");
    
    top->reset_sw = 1;        // Set some inputs
    top->clk = 0;
    top->roll = 0;
    
    while (!Verilated::gotFinish()) {
        if (main_time > 10
            top->reset_sw = 0;    // リセットを解除する
        
        if ((main_time % 5) == 0)    // クロックを生成する
            top->clk = !top->clk;
            
        if (main_time > 20 && main_time < 980)    // roll を1にする
            top->roll = 1;
        else
            top->roll = 0;
            
        top->eval();    // 評価
        
        printf("Time %d : clk = %d spots = %d\n", main_time, top->clk, top->v__DOT__inst_dice_sm__DOT__spots_node);

        tfp->dump(main_time);
        
        if (main_time>1000)
            break;         // 終了
        
        main_time++;
    }
    
    tfp->close();
    
    top->final();        // シミュレーション終了
}


printf文を見るとわかると思うが、上の階層とは”__DOT__”で区切られているようだ。

これですべてのソースは示したので、ここからはVerilatorのコマンドを入れて、コンパイル、make、実行ファイルの実行と続く。まずは、Cygwin上でコンパイルをする。指定するVerilogファイルはトップのファイルだけで大丈夫みたいだ。下のVerilogファイルを指定しなくても良いようだ。

verilator --cc --trace -Wno-lint dice_top.v --exe dice_top_tb.cpp


obj_dirディレクトリに入る。

cd obj_dir/


makeコマンドでmakeする。

make -j -f Vdice_top.mk Vdice_top


実行形式のファイルを実行する。

./Vdice_top.exe


下に実行した後のCygwinウインドウを示す。
Verilator_11_110527.png

simx.vcdファイルが出来ている。これをVeritakで読み込むと下のようなシミュレーション波形を得ることができた。
Verilator_12_110527.png

これで複数ファイルのシミュレーションも行うことができた。コンパイルの時にトップモジュールだけをコマンドラインに書けば下もコンパイルしてくれた。
  1. 2011年05月27日 05:01 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

DesignSpark PCBではFindの代わりにGotoを使用する

DesignSpark PCBでFindが無くて、部品を捜すのに苦労していたが、部品の検索に仕方がわかったので、書いておく。
DesignSpark PCBでは検索の代わりに、Gotoがあった。
F9キーを押すか、ViewメニューからInteraction Barを選択してチェックを入れると、右側にIneraction Barが出てくる。
DesignSpark_PCB_139_110525.png

Ineraction Barで真ん中のGotoタブを選択すれば、部品のIDが表示されるので、そのIDをクリックすると部品が見つかる。
見つけるときの設定は右クリックメニューから設定できる。私の設定は、Flash Found Item(クリックしたIDの部品がフラシュする)、Center View On Found Item(クリックした部品が画面の中心に来る)をチェックしている。
DesignSpark_PCB_140_110525.png

これで部品を見つけやすくなった。
  1. 2011年05月26日 00:03 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋が200万アクセス達成

”FPGAの部屋”のアクセス数が200万アクセスを超えました。皆さん、見ていただいて、ありがとうございます。
思えば、”今までのこのブログのアクセス数”にあるように、2005年の8月10日に始まった”FPGAの部屋”の最初の月のアクセス数は454アクセスでした。
2006年3月には10,233アクセスに増え、その後も順調にアクセス数が伸びてきました。最近は頭打ち傾向ですが、こんなマニアックな内容のブログが月に4万数千アクセスもあることがびっくりです。
200万アクセス超えの記念に2006年からの年間アクセス数を貼ってみます。

・2006年
FPGA_room_200_1_110525.png

・2007年
FPGA_room_200_2_110525.png

・2008年
FPGA_room_200_3_110525.png

・2009年
FPGA_room_200_4_110525.png

・2010年
FPGA_room_200_5_110525.png

・2011年
FPGA_room_200_6_110525.png

  1. 2011年05月25日 05:00 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Verilatorを試してみる3(C++モード3:VCDファイルを出力)

Verilatorを試してみる2(C++モード2:モジュール内部信号の観測)”の続き。

今度はVCDファイルを出力する。”Verilator Manual”の”How do I generate waveforms (traces) in C++?”を参考に、dsm_test.cppを修正した。そのソースを下に示す。

#include <iostream>
#include <verilated.h>    // Defines common routines
#include "verilated_vcd_c.h"
#include "Vdice_state_machine.h"

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
    
    Vdice_state_machine *top = new Vdice_state_machine();
    
    Verilated::traceEverOn(true);
    VerilatedVcdC* tfp = new VerilatedVcdC;
    top->trace (tfp, 99);
    tfp->open ("simx.vcd");
    
    top->reset_sw = 1;        // Set some inputs
    top->clk = 0;
    top->roll = 0;
    top->roll_ena = 0;
    
    while (!Verilated::gotFinish()) {
        if (main_time > 10
            top->reset_sw = 0;    // リセットを解除する
        
        if ((main_time % 5) == 0)    // クロックを生成する
            top->clk = !top->clk;
            
        if (main_time > 20)    // roll を1にする
            top->roll = 1;
            
        if (!top->reset_sw) {    // リセットが解除された後で
            if ((main_time % 10) == 1// クロックが立ち上がった1デルタ時間後
                top->roll_ena = !top->roll_ena;
        }
        
        top->eval();    // 評価
        
        printf("Time %d : clk = %d roll_ena = %d spots = %d current_state = %.2x\n", main_time, top->clk, top->roll_ena, top->spots, top->v__DOT__current_state);

        tfp->dump(main_time);
        
        if (main_time>200)
            break;         // 終了
        
        main_time++;
    }
    
    tfp->close();
    
    top->final();        // シミュレーション終了
}


更に、コンパイルコマンドに--traceを追加した。

verilator --cc --trace -Wno-lint dice_state_machine.v --exe dsm_test.cpp


これで前回同様にmake, 実行ファイルを実行すると、simx.vcdができた。simx.vcdをveritakで表示するとDICE_STATEも表示することができた。
Verilator_10_110524.png
  1. 2011年05月24日 04:57 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Verilatorを試してみる2(C++モード2:モジュール内部信号の観測)

Verilatorを試してみる1(C++モード1)”でC++のテストベンチでのVerilogファイルのシミュレーションができたが、モジュールの入力、出力信号を見ただけである。今回は、モジュール内部信号を見てみる。

verilator --cc -Wno-lint dice_state_machine.v --exe dsm_test.cpp


上のコマンドで作られたobj_dirフォルダのファイルを見てみる。
Verilator_8_110523.png

このファイルの意味は、Verilator ManualのFILESに書いてある。
そのうちのVdice_state_machine.h に注目してみよう。一部を引用する。

VL_MODULE(Vdice_state_machine) {
  public:
    // CELLS

    // Public to allow access to /*verilator_public*/ items;
    // otherwise the application code can consider these internals.
    
    // PORTS

    // The application code writes and reads these signals to

    // propagate new values into/out from the Verilated model.
    VL_IN8(clk,0,0);
    VL_IN8(reset_sw,0,0);
    VL_IN8(roll,0,0);
    VL_IN8(roll_ena,0,0);
    VL_OUT8(spots,2,0);
    //char    __VpadToAlign5[3];
    
    // LOCAL SIGNALS

    // Internals; generally not touched by application code

    VL_SIG8(v__DOT__current_state,5,0);
    VL_SIG8(v__DOT__spots_node,2,0);
    //char    __VpadToAlign14[2];


VL_IN8()やVL_OUT8()には入力信号、出力信号が定義されている。
VL_SIG8(v__DOT__current_state,5,0);で内部信号のcurrent_state が定義されているようだ。これならば、テストベンチにtop->v__DOT__current_state で参照すれば、現在のステートのコードを表示することができるのではないだろうか?
そこで、dsm_test.cppのprintfを下のように書きなおした。つまり、ステートマシンのステート値の表示を追加した。

printf("Time %d : clk = %d roll_ena = %d spots = %d current_state = %.2x\n", main_time, top->clk, top->roll_ena, top->spots, top->v__DOT__current_state);


これで、”Verilatorを試してみる1(C++モード1)”と同様にコンパイル、make、実行ファイルの実行をした。その結果、current_stateの値を表示することができた。
Verilator_9_110523.png

シミュレーション結果のprintfの出力を下に示す。

Time 0 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 1 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 2 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 3 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 4 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 5 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 6 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 7 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 8 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 9 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 10 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 11 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 12 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 13 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 14 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 15 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 16 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 17 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 18 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 19 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 20 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 21 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 22 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 23 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 24 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 25 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 26 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 27 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 28 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 29 : clk = 0 roll_ena = 0 spots = 1 current_state = 01
Time 30 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 31 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 32 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 33 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 34 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 35 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 36 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 37 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 38 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 39 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 40 : clk = 1 roll_ena = 1 spots = 1 current_state = 02
Time 41 : clk = 1 roll_ena = 0 spots = 1 current_state = 02
Time 42 : clk = 1 roll_ena = 0 spots = 1 current_state = 02
Time 43 : clk = 1 roll_ena = 0 spots = 1 current_state = 02
Time 44 : clk = 1 roll_ena = 0 spots = 1 current_state = 02
Time 45 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 46 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 47 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 48 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 49 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 50 : clk = 1 roll_ena = 0 spots = 2 current_state = 02
Time 51 : clk = 1 roll_ena = 1 spots = 2 current_state = 02
Time 52 : clk = 1 roll_ena = 1 spots = 2 current_state = 02
Time 53 : clk = 1 roll_ena = 1 spots = 2 current_state = 02
Time 54 : clk = 1 roll_ena = 1 spots = 2 current_state = 02
Time 55 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 56 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 57 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 58 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 59 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 60 : clk = 1 roll_ena = 1 spots = 2 current_state = 04
Time 61 : clk = 1 roll_ena = 0 spots = 2 current_state = 04
Time 62 : clk = 1 roll_ena = 0 spots = 2 current_state = 04
Time 63 : clk = 1 roll_ena = 0 spots = 2 current_state = 04
Time 64 : clk = 1 roll_ena = 0 spots = 2 current_state = 04
Time 65 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 66 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 67 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 68 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 69 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 70 : clk = 1 roll_ena = 0 spots = 3 current_state = 04
Time 71 : clk = 1 roll_ena = 1 spots = 3 current_state = 04
Time 72 : clk = 1 roll_ena = 1 spots = 3 current_state = 04
Time 73 : clk = 1 roll_ena = 1 spots = 3 current_state = 04
Time 74 : clk = 1 roll_ena = 1 spots = 3 current_state = 04
Time 75 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 76 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 77 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 78 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 79 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 80 : clk = 1 roll_ena = 1 spots = 3 current_state = 08
Time 81 : clk = 1 roll_ena = 0 spots = 3 current_state = 08
Time 82 : clk = 1 roll_ena = 0 spots = 3 current_state = 08
Time 83 : clk = 1 roll_ena = 0 spots = 3 current_state = 08
Time 84 : clk = 1 roll_ena = 0 spots = 3 current_state = 08
Time 85 : clk = 0 roll_ena = 0 spots = 3 current_state = 08
Time 86 : clk = 0 roll_ena = 0 spots = 3 current_state = 08
Time 87 : clk = 0 roll_ena = 0 spots = 3 current_state = 08
Time 88 : clk = 0 roll_ena = 0 spots = 3 current_state = 08
Time 89 : clk = 0 roll_ena = 0 spots = 3 current_state = 08
Time 90 : clk = 1 roll_ena = 0 spots = 4 current_state = 08
Time 91 : clk = 1 roll_ena = 1 spots = 4 current_state = 08
Time 92 : clk = 1 roll_ena = 1 spots = 4 current_state = 08
Time 93 : clk = 1 roll_ena = 1 spots = 4 current_state = 08
Time 94 : clk = 1 roll_ena = 1 spots = 4 current_state = 08
Time 95 : clk = 0 roll_ena = 1 spots = 4 current_state = 08
Time 96 : clk = 0 roll_ena = 1 spots = 4 current_state = 08
Time 97 : clk = 0 roll_ena = 1 spots = 4 current_state = 08
Time 98 : clk = 0 roll_ena = 1 spots = 4 current_state = 08
Time 99 : clk = 0 roll_ena = 1 spots = 4 current_state = 08
Time 100 : clk = 1 roll_ena = 1 spots = 4 current_state = 10
Time 101 : clk = 1 roll_ena = 0 spots = 4 current_state = 10
Time 102 : clk = 1 roll_ena = 0 spots = 4 current_state = 10
Time 103 : clk = 1 roll_ena = 0 spots = 4 current_state = 10
Time 104 : clk = 1 roll_ena = 0 spots = 4 current_state = 10
Time 105 : clk = 0 roll_ena = 0 spots = 4 current_state = 10
Time 106 : clk = 0 roll_ena = 0 spots = 4 current_state = 10
Time 107 : clk = 0 roll_ena = 0 spots = 4 current_state = 10
Time 108 : clk = 0 roll_ena = 0 spots = 4 current_state = 10
Time 109 : clk = 0 roll_ena = 0 spots = 4 current_state = 10
Time 110 : clk = 1 roll_ena = 0 spots = 5 current_state = 10
Time 111 : clk = 1 roll_ena = 1 spots = 5 current_state = 10
Time 112 : clk = 1 roll_ena = 1 spots = 5 current_state = 10
Time 113 : clk = 1 roll_ena = 1 spots = 5 current_state = 10
Time 114 : clk = 1 roll_ena = 1 spots = 5 current_state = 10
Time 115 : clk = 0 roll_ena = 1 spots = 5 current_state = 10
Time 116 : clk = 0 roll_ena = 1 spots = 5 current_state = 10
Time 117 : clk = 0 roll_ena = 1 spots = 5 current_state = 10
Time 118 : clk = 0 roll_ena = 1 spots = 5 current_state = 10
Time 119 : clk = 0 roll_ena = 1 spots = 5 current_state = 10
Time 120 : clk = 1 roll_ena = 1 spots = 5 current_state = 20
Time 121 : clk = 1 roll_ena = 0 spots = 5 current_state = 20
Time 122 : clk = 1 roll_ena = 0 spots = 5 current_state = 20
Time 123 : clk = 1 roll_ena = 0 spots = 5 current_state = 20
Time 124 : clk = 1 roll_ena = 0 spots = 5 current_state = 20
Time 125 : clk = 0 roll_ena = 0 spots = 5 current_state = 20
Time 126 : clk = 0 roll_ena = 0 spots = 5 current_state = 20
Time 127 : clk = 0 roll_ena = 0 spots = 5 current_state = 20
Time 128 : clk = 0 roll_ena = 0 spots = 5 current_state = 20
Time 129 : clk = 0 roll_ena = 0 spots = 5 current_state = 20
Time 130 : clk = 1 roll_ena = 0 spots = 6 current_state = 20
Time 131 : clk = 1 roll_ena = 1 spots = 6 current_state = 20
Time 132 : clk = 1 roll_ena = 1 spots = 6 current_state = 20
Time 133 : clk = 1 roll_ena = 1 spots = 6 current_state = 20
Time 134 : clk = 1 roll_ena = 1 spots = 6 current_state = 20
Time 135 : clk = 0 roll_ena = 1 spots = 6 current_state = 20
Time 136 : clk = 0 roll_ena = 1 spots = 6 current_state = 20
Time 137 : clk = 0 roll_ena = 1 spots = 6 current_state = 20
Time 138 : clk = 0 roll_ena = 1 spots = 6 current_state = 20
Time 139 : clk = 0 roll_ena = 1 spots = 6 current_state = 20
Time 140 : clk = 1 roll_ena = 1 spots = 6 current_state = 01
Time 141 : clk = 1 roll_ena = 0 spots = 6 current_state = 01
Time 142 : clk = 1 roll_ena = 0 spots = 6 current_state = 01
Time 143 : clk = 1 roll_ena = 0 spots = 6 current_state = 01
Time 144 : clk = 1 roll_ena = 0 spots = 6 current_state = 01
Time 145 : clk = 0 roll_ena = 0 spots = 6 current_state = 01
Time 146 : clk = 0 roll_ena = 0 spots = 6 current_state = 01
Time 147 : clk = 0 roll_ena = 0 spots = 6 current_state = 01
Time 148 : clk = 0 roll_ena = 0 spots = 6 current_state = 01
Time 149 : clk = 0 roll_ena = 0 spots = 6 current_state = 01
Time 150 : clk = 1 roll_ena = 0 spots = 1 current_state = 01
Time 151 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 152 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 153 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 154 : clk = 1 roll_ena = 1 spots = 1 current_state = 01
Time 155 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 156 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 157 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 158 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 159 : clk = 0 roll_ena = 1 spots = 1 current_state = 01
Time 160 : clk = 1 roll_ena = 1 spots = 1 current_state = 02
Time 161 : clk = 1 roll_ena = 0 spots = 1 current_state = 02
Time 162 : clk = 1 roll_ena = 0 spots = 1 current_state = 02
Time 163 : clk = 1 roll_ena = 0 spots = 1 current_state = 02
Time 164 : clk = 1 roll_ena = 0 spots = 1 current_state = 02
Time 165 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 166 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 167 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 168 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 169 : clk = 0 roll_ena = 0 spots = 1 current_state = 02
Time 170 : clk = 1 roll_ena = 0 spots = 2 current_state = 02
Time 171 : clk = 1 roll_ena = 1 spots = 2 current_state = 02
Time 172 : clk = 1 roll_ena = 1 spots = 2 current_state = 02
Time 173 : clk = 1 roll_ena = 1 spots = 2 current_state = 02
Time 174 : clk = 1 roll_ena = 1 spots = 2 current_state = 02
Time 175 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 176 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 177 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 178 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 179 : clk = 0 roll_ena = 1 spots = 2 current_state = 02
Time 180 : clk = 1 roll_ena = 1 spots = 2 current_state = 04
Time 181 : clk = 1 roll_ena = 0 spots = 2 current_state = 04
Time 182 : clk = 1 roll_ena = 0 spots = 2 current_state = 04
Time 183 : clk = 1 roll_ena = 0 spots = 2 current_state = 04
Time 184 : clk = 1 roll_ena = 0 spots = 2 current_state = 04
Time 185 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 186 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 187 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 188 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 189 : clk = 0 roll_ena = 0 spots = 2 current_state = 04
Time 190 : clk = 1 roll_ena = 0 spots = 3 current_state = 04
Time 191 : clk = 1 roll_ena = 1 spots = 3 current_state = 04
Time 192 : clk = 1 roll_ena = 1 spots = 3 current_state = 04
Time 193 : clk = 1 roll_ena = 1 spots = 3 current_state = 04
Time 194 : clk = 1 roll_ena = 1 spots = 3 current_state = 04
Time 195 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 196 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 197 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 198 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 199 : clk = 0 roll_ena = 1 spots = 3 current_state = 04
Time 200 : clk = 1 roll_ena = 1 spots = 3 current_state = 08
Time 201 : clk = 1 roll_ena = 0 spots = 3 current_state = 08


これで、モジュール内部の信号も表示することができた。

Verilatorを試してみる3(C++モード3:VCDファイルを出力)”に続く。
  1. 2011年05月23日 21:59 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

Verilatorを試してみる1(C++モード1)

前回、”VerilatorでLint”でバージョン3.810のVerilatorをインストールして、Lintをここ見たがOVLがうまくコンパイル出来なかった。

今回は、バージョン3.812のVerilatorをインストールして、シミュレーションしてみた。環境としてはCygwinを使用した。
なぜVerilatorでシミュレーションしてみたかったか?というと
1.VerilogやSystemVerilogをコンパイルしてC++に落としてシミュレーションするということで、C++やSystemCのテストベンチが簡単に使用できるという利点がある。
2.値としては1と0のみで、ZやUやHやLなどの値を持たないが、その代わり高速にシミュレーションできるという結果が出ている。
3.VerilogやSystemVerilogがシミュレーションできるフリーのシミュレータである。
以上のような理由である。
SystemVerilog DPI-Cも魅力的だが、フリーのModelSimでやるには大きい規模のDUT(Device under test)をシミュレーションする予定なのだ。

武内さんの”電気回路/HDL/Verilator の導入(C++モード)”を全面的に参照させてもらいながら、Verilatorの試用をしていくことにする。武内さん、参照させていただきます。ありがとうございます。

・モジュールの入力信号、出力信号を見る
今回は自分で以前、電子サイコロをチュートリアル用に作ったときのdice_stat_machine.v単体をシミュレーションしてみる。下にdice_stat_machine.vを示す。

`default_nettype none
`timescale 1ns / 1ps

// 1から6までのサイコロの目を表すステートマシン,Direct Verilog2001

module dice_state_machine(
    input wire reset_sw,
    input wire clk,
    input wire roll,
    input wire roll_ena,
    output wire [2:0] spots
);

    parameter        st_one        = 6'b000001,
                    st_two        = 6'b000010,
                    st_three    = 6'b000100,
                    st_four        = 6'b001000,
                    st_five        = 6'b010000,
                    st_six        = 6'b100000;
    reg [5:0] current_state;
    reg [2:0]    spots_node;
    
    always @(posedge clk) begin
        if (reset_sw) begin
            spots_node <= 3'd1;
            current_state <= st_one;
        end else begin
            case (current_state)
                st_one : begin
                    spots_node <= 3'd1;
                    if (roll && roll_ena)
                        current_state <= st_two;
                end
                st_two : begin
                    spots_node <= 3'd2;
                    if (roll && roll_ena)
                        current_state <= st_three;
                end
                st_three : begin
                    spots_node <= 3'd3;
                    if (roll && roll_ena)
                        current_state <= st_four;
                end
                st_four : begin
                    spots_node <= 3'd4;
                    if (roll && roll_ena)
                        current_state <= st_five;
                end
                st_five : begin
                    spots_node <= 3'd5;
                    if (roll && roll_ena)
                        current_state <= st_six;
                end
                st_six : begin
                    spots_node <= 3'd6;
                    if (roll && roll_ena)
                        current_state <= st_one;
                end
            endcase
        end
    end
    assign spots = spots_node;
    
// synthesis translate_off
    reg [20*8:1] DICE_STATE; 
    
    always @(current_state) begin
        case (current_state)
            st_one    : DICE_STATE = "ST_ONE";
            st_two    : DICE_STATE = "ST_TWO";
            st_three: DICE_STATE = "ST_THREE";
            st_four    : DICE_STATE = "ST_FOUR";
            st_five    : DICE_STATE = "ST_FIVE";
            st_six    : DICE_STATE = "ST_SIX";
            default    : DICE_STATE = "ST_ONE";
        endcase
    end
// synthesis translate_on
endmodule
`default_nettype wire 


(2010/05/23 dice_state_machine.vを修正しました)

次に、武内さんの”電気回路/HDL/Verilator の導入(C++モード)”のbin2bcd_test.cppを参照させていただいて作ったC++のテストベンチのdsm_test.cppを下に示す。

#include <iostream>
#include <verilated.h>    // Defines common routines
#include "Vdice_state_machine.h"

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
    
    Vdice_state_machine *top = new Vdice_state_machine();
    
    top->reset_sw = 1;        // Set some inputs
    top->clk = 0;
    top->roll = 0;
    top->roll_ena = 0;
    
    while (!Verilated::gotFinish()) {
        if (main_time > 10) 
            top->reset_sw = 0;    // リセットを解除する
        
        if ((main_time % 5) == 0)    // クロックを生成する
            top->clk = !top->clk;
            
        if (main_time > 20)    // roll を1にする
            top->roll = 1;
            
        if (!top->reset_sw) {    // リセットが解除された後で
            if ((main_time % 10) == 1) // クロックが立ち上がった1デルタ時間後
                top->roll_ena = !top->roll_ena;
        }
        
        top->eval();    // 評価
        
        printf("Time %d : clk = %d roll_ena = %d spots = %d\n", main_time, top->clk, top->roll_ena, top->spots);
            
        if (main_time>200)
            break;         // 終了
        
        main_time++;
    }
    
    top->final();        // シミュレーション終了
}


この2つのファイルをフォルダに置いて、Verilatorでコンパイルを行った。その時のコマンドを下に示す。

verilator --cc -Wno-lint dice_state_machine.v --exe dsm_test.cpp


現在のフォルダ上にobj_dirフォルダができる。cdコマンドを使用して、obj_dirフォルダに移る。

cd obj_dir/


makeを行って、実行ファイルを作成する。

make -j -f Vdice_state_machine.mk Vdice_state_machine


実行ファイルを実行する。

./Vdice_state_machine.exe


下に、実行ファイルを実行する前のCygwinの画面を示す。
Verilator_6_110523.png

実行後のCygwinの画面を下に示す。
Verilator_7_110523.png

シミュレーション結果のprintfの出力を下に示す。

Time 0 : clk = 1 roll_ena = 0 spots = 1
Time 1 : clk = 1 roll_ena = 0 spots = 1
Time 2 : clk = 1 roll_ena = 0 spots = 1
Time 3 : clk = 1 roll_ena = 0 spots = 1
Time 4 : clk = 1 roll_ena = 0 spots = 1
Time 5 : clk = 0 roll_ena = 0 spots = 1
Time 6 : clk = 0 roll_ena = 0 spots = 1
Time 7 : clk = 0 roll_ena = 0 spots = 1
Time 8 : clk = 0 roll_ena = 0 spots = 1
Time 9 : clk = 0 roll_ena = 0 spots = 1
Time 10 : clk = 1 roll_ena = 0 spots = 1
Time 11 : clk = 1 roll_ena = 1 spots = 1
Time 12 : clk = 1 roll_ena = 1 spots = 1
Time 13 : clk = 1 roll_ena = 1 spots = 1
Time 14 : clk = 1 roll_ena = 1 spots = 1
Time 15 : clk = 0 roll_ena = 1 spots = 1
Time 16 : clk = 0 roll_ena = 1 spots = 1
Time 17 : clk = 0 roll_ena = 1 spots = 1
Time 18 : clk = 0 roll_ena = 1 spots = 1
Time 19 : clk = 0 roll_ena = 1 spots = 1
Time 20 : clk = 1 roll_ena = 1 spots = 1
Time 21 : clk = 1 roll_ena = 0 spots = 1
Time 22 : clk = 1 roll_ena = 0 spots = 1
Time 23 : clk = 1 roll_ena = 0 spots = 1
Time 24 : clk = 1 roll_ena = 0 spots = 1
Time 25 : clk = 0 roll_ena = 0 spots = 1
Time 26 : clk = 0 roll_ena = 0 spots = 1
Time 27 : clk = 0 roll_ena = 0 spots = 1
Time 28 : clk = 0 roll_ena = 0 spots = 1
Time 29 : clk = 0 roll_ena = 0 spots = 1
Time 30 : clk = 1 roll_ena = 0 spots = 1
Time 31 : clk = 1 roll_ena = 1 spots = 1
Time 32 : clk = 1 roll_ena = 1 spots = 1
Time 33 : clk = 1 roll_ena = 1 spots = 1
Time 34 : clk = 1 roll_ena = 1 spots = 1
Time 35 : clk = 0 roll_ena = 1 spots = 1
Time 36 : clk = 0 roll_ena = 1 spots = 1
Time 37 : clk = 0 roll_ena = 1 spots = 1
Time 38 : clk = 0 roll_ena = 1 spots = 1
Time 39 : clk = 0 roll_ena = 1 spots = 1
Time 40 : clk = 1 roll_ena = 1 spots = 1
Time 41 : clk = 1 roll_ena = 0 spots = 1
Time 42 : clk = 1 roll_ena = 0 spots = 1
Time 43 : clk = 1 roll_ena = 0 spots = 1
Time 44 : clk = 1 roll_ena = 0 spots = 1
Time 45 : clk = 0 roll_ena = 0 spots = 1
Time 46 : clk = 0 roll_ena = 0 spots = 1
Time 47 : clk = 0 roll_ena = 0 spots = 1
Time 48 : clk = 0 roll_ena = 0 spots = 1
Time 49 : clk = 0 roll_ena = 0 spots = 1
Time 50 : clk = 1 roll_ena = 0 spots = 2
Time 51 : clk = 1 roll_ena = 1 spots = 2
Time 52 : clk = 1 roll_ena = 1 spots = 2
Time 53 : clk = 1 roll_ena = 1 spots = 2
Time 54 : clk = 1 roll_ena = 1 spots = 2
Time 55 : clk = 0 roll_ena = 1 spots = 2
Time 56 : clk = 0 roll_ena = 1 spots = 2
Time 57 : clk = 0 roll_ena = 1 spots = 2
Time 58 : clk = 0 roll_ena = 1 spots = 2
Time 59 : clk = 0 roll_ena = 1 spots = 2
Time 60 : clk = 1 roll_ena = 1 spots = 2
Time 61 : clk = 1 roll_ena = 0 spots = 2
Time 62 : clk = 1 roll_ena = 0 spots = 2
Time 63 : clk = 1 roll_ena = 0 spots = 2
Time 64 : clk = 1 roll_ena = 0 spots = 2
Time 65 : clk = 0 roll_ena = 0 spots = 2
Time 66 : clk = 0 roll_ena = 0 spots = 2
Time 67 : clk = 0 roll_ena = 0 spots = 2
Time 68 : clk = 0 roll_ena = 0 spots = 2
Time 69 : clk = 0 roll_ena = 0 spots = 2
Time 70 : clk = 1 roll_ena = 0 spots = 3
Time 71 : clk = 1 roll_ena = 1 spots = 3
Time 72 : clk = 1 roll_ena = 1 spots = 3
Time 73 : clk = 1 roll_ena = 1 spots = 3
Time 74 : clk = 1 roll_ena = 1 spots = 3
Time 75 : clk = 0 roll_ena = 1 spots = 3
Time 76 : clk = 0 roll_ena = 1 spots = 3
Time 77 : clk = 0 roll_ena = 1 spots = 3
Time 78 : clk = 0 roll_ena = 1 spots = 3
Time 79 : clk = 0 roll_ena = 1 spots = 3
Time 80 : clk = 1 roll_ena = 1 spots = 3
Time 81 : clk = 1 roll_ena = 0 spots = 3
Time 82 : clk = 1 roll_ena = 0 spots = 3
Time 83 : clk = 1 roll_ena = 0 spots = 3
Time 84 : clk = 1 roll_ena = 0 spots = 3
Time 85 : clk = 0 roll_ena = 0 spots = 3
Time 86 : clk = 0 roll_ena = 0 spots = 3
Time 87 : clk = 0 roll_ena = 0 spots = 3
Time 88 : clk = 0 roll_ena = 0 spots = 3
Time 89 : clk = 0 roll_ena = 0 spots = 3
Time 90 : clk = 1 roll_ena = 0 spots = 4
Time 91 : clk = 1 roll_ena = 1 spots = 4
Time 92 : clk = 1 roll_ena = 1 spots = 4
Time 93 : clk = 1 roll_ena = 1 spots = 4
Time 94 : clk = 1 roll_ena = 1 spots = 4
Time 95 : clk = 0 roll_ena = 1 spots = 4
Time 96 : clk = 0 roll_ena = 1 spots = 4
Time 97 : clk = 0 roll_ena = 1 spots = 4
Time 98 : clk = 0 roll_ena = 1 spots = 4
Time 99 : clk = 0 roll_ena = 1 spots = 4
Time 100 : clk = 1 roll_ena = 1 spots = 4
Time 101 : clk = 1 roll_ena = 0 spots = 4
Time 102 : clk = 1 roll_ena = 0 spots = 4
Time 103 : clk = 1 roll_ena = 0 spots = 4
Time 104 : clk = 1 roll_ena = 0 spots = 4
Time 105 : clk = 0 roll_ena = 0 spots = 4
Time 106 : clk = 0 roll_ena = 0 spots = 4
Time 107 : clk = 0 roll_ena = 0 spots = 4
Time 108 : clk = 0 roll_ena = 0 spots = 4
Time 109 : clk = 0 roll_ena = 0 spots = 4
Time 110 : clk = 1 roll_ena = 0 spots = 5
Time 111 : clk = 1 roll_ena = 1 spots = 5
Time 112 : clk = 1 roll_ena = 1 spots = 5
Time 113 : clk = 1 roll_ena = 1 spots = 5
Time 114 : clk = 1 roll_ena = 1 spots = 5
Time 115 : clk = 0 roll_ena = 1 spots = 5
Time 116 : clk = 0 roll_ena = 1 spots = 5
Time 117 : clk = 0 roll_ena = 1 spots = 5
Time 118 : clk = 0 roll_ena = 1 spots = 5
Time 119 : clk = 0 roll_ena = 1 spots = 5
Time 120 : clk = 1 roll_ena = 1 spots = 5
Time 121 : clk = 1 roll_ena = 0 spots = 5
Time 122 : clk = 1 roll_ena = 0 spots = 5
Time 123 : clk = 1 roll_ena = 0 spots = 5
Time 124 : clk = 1 roll_ena = 0 spots = 5
Time 125 : clk = 0 roll_ena = 0 spots = 5
Time 126 : clk = 0 roll_ena = 0 spots = 5
Time 127 : clk = 0 roll_ena = 0 spots = 5
Time 128 : clk = 0 roll_ena = 0 spots = 5
Time 129 : clk = 0 roll_ena = 0 spots = 5
Time 130 : clk = 1 roll_ena = 0 spots = 6
Time 131 : clk = 1 roll_ena = 1 spots = 6
Time 132 : clk = 1 roll_ena = 1 spots = 6
Time 133 : clk = 1 roll_ena = 1 spots = 6
Time 134 : clk = 1 roll_ena = 1 spots = 6
Time 135 : clk = 0 roll_ena = 1 spots = 6
Time 136 : clk = 0 roll_ena = 1 spots = 6
Time 137 : clk = 0 roll_ena = 1 spots = 6
Time 138 : clk = 0 roll_ena = 1 spots = 6
Time 139 : clk = 0 roll_ena = 1 spots = 6
Time 140 : clk = 1 roll_ena = 1 spots = 6
Time 141 : clk = 1 roll_ena = 0 spots = 6
Time 142 : clk = 1 roll_ena = 0 spots = 6
Time 143 : clk = 1 roll_ena = 0 spots = 6
Time 144 : clk = 1 roll_ena = 0 spots = 6
Time 145 : clk = 0 roll_ena = 0 spots = 6
Time 146 : clk = 0 roll_ena = 0 spots = 6
Time 147 : clk = 0 roll_ena = 0 spots = 6
Time 148 : clk = 0 roll_ena = 0 spots = 6
Time 149 : clk = 0 roll_ena = 0 spots = 6
Time 150 : clk = 1 roll_ena = 0 spots = 1
Time 151 : clk = 1 roll_ena = 1 spots = 1
Time 152 : clk = 1 roll_ena = 1 spots = 1
Time 153 : clk = 1 roll_ena = 1 spots = 1
Time 154 : clk = 1 roll_ena = 1 spots = 1
Time 155 : clk = 0 roll_ena = 1 spots = 1
Time 156 : clk = 0 roll_ena = 1 spots = 1
Time 157 : clk = 0 roll_ena = 1 spots = 1
Time 158 : clk = 0 roll_ena = 1 spots = 1
Time 159 : clk = 0 roll_ena = 1 spots = 1
Time 160 : clk = 1 roll_ena = 1 spots = 1
Time 161 : clk = 1 roll_ena = 0 spots = 1
Time 162 : clk = 1 roll_ena = 0 spots = 1
Time 163 : clk = 1 roll_ena = 0 spots = 1
Time 164 : clk = 1 roll_ena = 0 spots = 1
Time 165 : clk = 0 roll_ena = 0 spots = 1
Time 166 : clk = 0 roll_ena = 0 spots = 1
Time 167 : clk = 0 roll_ena = 0 spots = 1
Time 168 : clk = 0 roll_ena = 0 spots = 1
Time 169 : clk = 0 roll_ena = 0 spots = 1
Time 170 : clk = 1 roll_ena = 0 spots = 2
Time 171 : clk = 1 roll_ena = 1 spots = 2
Time 172 : clk = 1 roll_ena = 1 spots = 2
Time 173 : clk = 1 roll_ena = 1 spots = 2
Time 174 : clk = 1 roll_ena = 1 spots = 2
Time 175 : clk = 0 roll_ena = 1 spots = 2
Time 176 : clk = 0 roll_ena = 1 spots = 2
Time 177 : clk = 0 roll_ena = 1 spots = 2
Time 178 : clk = 0 roll_ena = 1 spots = 2
Time 179 : clk = 0 roll_ena = 1 spots = 2
Time 180 : clk = 1 roll_ena = 1 spots = 2
Time 181 : clk = 1 roll_ena = 0 spots = 2
Time 182 : clk = 1 roll_ena = 0 spots = 2
Time 183 : clk = 1 roll_ena = 0 spots = 2
Time 184 : clk = 1 roll_ena = 0 spots = 2
Time 185 : clk = 0 roll_ena = 0 spots = 2
Time 186 : clk = 0 roll_ena = 0 spots = 2
Time 187 : clk = 0 roll_ena = 0 spots = 2
Time 188 : clk = 0 roll_ena = 0 spots = 2
Time 189 : clk = 0 roll_ena = 0 spots = 2
Time 190 : clk = 1 roll_ena = 0 spots = 3
Time 191 : clk = 1 roll_ena = 1 spots = 3
Time 192 : clk = 1 roll_ena = 1 spots = 3
Time 193 : clk = 1 roll_ena = 1 spots = 3
Time 194 : clk = 1 roll_ena = 1 spots = 3
Time 195 : clk = 0 roll_ena = 1 spots = 3
Time 196 : clk = 0 roll_ena = 1 spots = 3
Time 197 : clk = 0 roll_ena = 1 spots = 3
Time 198 : clk = 0 roll_ena = 1 spots = 3
Time 199 : clk = 0 roll_ena = 1 spots = 3
Time 200 : clk = 1 roll_ena = 1 spots = 3
Time 201 : clk = 1 roll_ena = 0 spots = 3


(2011/05/23 dice_state_machine.v を修正したので、シミュレーション結果も修正しました)

シミュレーションができた。次は、obj_dirのファイルとモジュール内部の信号を見る方法を書いておこうと思う。

#C言語で勉強したので、coutよりもprintfの方が使いやすいので使用した。

Verilatorを試してみる2(C++モード2:モジュール内部信号の観測)”に続く。
  1. 2011年05月23日 05:15 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:0

ウッドデッキの色を塗り替えました

ウッドデッキの色をキシラデコールのタンネングリーンからワイス(白)に塗り替えました。
タンネングリーンだと、夏の日光で裸足で乗れないほど温度が上がります。白だと、実験結果から20度くらい低いようなので、塗り替えました。下地処理してないので、灰色ぽくなってしまいましたが、何度か塗っているうちに白になるでしょう。でも、今度は眩しくなってしまいました。どっちがいいかですね?
タンネングリーンをウッドデッキに塗ると、養生しないと下のウッドテラスに垂れてしまうという理由もあります。

以前のウッドデッキ。
wood_deck_4_091121.jpg

今回の塗装後。
wood_deck_110523.jpg

下地の色が見えてしまっている。
  1. 2011年05月21日 18:48 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan-3AとVirtex-5のMIG (Memory Interface Generator)

Spartan-3AのMIGのユーザー・インターフェースは、FIFOが入っていないような感じで、タイミングを満たすように作るのが面倒だ。対して、Virtex-5のMIGのユーザー・インターフェースは、FIFOを使用していてインターフェースするのが簡単になっている。
自作DDR2 SDRAMコントローラのユーザー・インターフェースは、Virtex-5のMIGのように、FIFOを使用していて、ほとんど同じプロトコルになっている。Spartan-3AのMIGも同様のプロトコルだったら、CMOSカメラ・ディスプレイ回路で自作IPと置き換えて確かめてみようと思ったが、IOパッドを固定するところで、エラーが出てしまった。更に、プロトコルも違ってるので、ラッパー回路を作る必要があるので、諦めることにした。
現在動作している自作DDR2 SDRAMのIPがあるので良しとした。一応、MIGの使い方はひと通りやってみることができた。Virtex-5のMIGは使おうと思っている。

これで、MIGの勉強はとりあえず終了とする。

  1. 2011年05月20日 21:50 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110T Development SystemでMIGを試す4(Virtex-5のMIGの動作)

XUPV5-LX110T Development SystemでMIGを試す3(ISimでシミュレーション)”の続き。
前回、DDR2 SDRAMのテストベンチにdefineして、ISimでのシミュレーションがうまくいった。今回は、Virtex-5のユーザー回路とのインターフェースについて探ってみたい。

XUPV5-LX110Tの使用しているDDR2 SDRAMだが、SO-DIMMを使用している。Micron社製でMT4HTF3264HY-256MB(PDF)だ。DDR2 SDRAMチップはMT47H32M16(PDF)が使われているようだ。このDDR2 SDRAMチップは16ビット幅なので、Rowアドレス13ビット、Columnアドレス10ビット、Bankアドレス2ビットの計25ビットのアドレスを持っている。
Memory Interface Solutions UserGuideの380ページのTable 9-8: DDR2 SDRAM Controller User Interface Signalsのapp_af_adr[30:0]に説明があるが、Virtex-5のMIGのユーザー回路から与えるアドレスの割り当ては、Bank + Row + Column addressとなっている。至極まっとうな割り当てだと思うが、マルチバンク対応のコントローラをCPUで使用する場合には、データの局所性という観点からRow + Bank + Column の方が良いかもしれない。add_af_addrは31ビット幅あるが、今回のアドレス幅は25ビットである。

Memory Interface Solutions UserGuideの372ページのFigure 9-7: DDR2 Memory Controller Block Diagram を下に引用する。
ML509_MIG_6_110519.png

DDR2 SDRAMコントローラの入出力信号はSystem Clocks and Reset, User Application, Memory Deviceの信号に分けられる。そのうちのUser Applicationの信号について見ていこう。

Virtex-5用MIGで生成されたDDR2 SDRAMコントローラのユーザー・インターフェース信号について下に記す。()内はそれぞれDDR2 SDRAMコントローラに対しての入力、出力を表す。

app_af_cmd[2:0]:(入力) 3ビットのコマンド。000がWriteコマンド、001がReadコマンド。それ以外は不正値。
app_af_addr[30:0]:(入力) 31ビットのアドレス。今回は25ビット幅、26ビット目はChip Select。アドレスの割当はBank + Row + Column address。
app_af_wren:(入力) User Address FIFOへのWrite enable。これが1の時は、app_af_cmdとapp_af_addrが有効。
aff_wdf_data[2*DQ_WIDTH-1:0]:(入力) User Input Data。DDR2 SDRAMのデータ幅の2倍のデータ幅がある。クロックの立ち上がりのデータが下位、クロックの立ち下がりのデータが上位。128ビット幅。
app_wdf_mask_data[2*DM_WIDTH–1:0]:(入力) User Data Mask。DDR2 SDRAMのマスク幅の2倍の幅がある。 クロックの立ち上がりのマスクが下位、クロックの立ち下がりのマスクが上位。16ビット幅。
app_wdf_wren:(入力) User Write FIFOのWrite enable。これが1の時は、aff_wdf_dataとapp_wdf_mask_dataが有効。
app_af_afull:(出力) Address FIFOのAlmost Full。残り12以下の時に1になる。
app_wdf_afull:(出力) User Write FIFOのAlmost Full。残り12以下の時に1になる。
rd_data_valid:(出力) rd_data_fifo_outのデータが有効であることを示す。
rd_data_fifo_out[2*DQ_WIDTH–1:0]:(出力) メモリからReadしたデータ。128ビット幅。
phy_init_done:(出力) DDR2 SDRAMコントローラの初期化とキャリブレーションが終了した。
clk0_tb:(出力) ユーザー回路へのclk0出力


Write, Read両方とも、前のトランザクションとRow + Bankアドレスが違っていたら自動的にプリチャージして、Activateコマンドを発行してくれるようだ。

・Write
Memory Interface Solutions UserGuideの384ページのFigure 9-12: DDR2 SDRAM Write Burst for Four Bursts (BL = 4)を下に引用する。
ML509_MIG_7_110519.png

Address FIFOは1024深度、User Write FIFOは512深度あるようだ。
Writeはアドレス(app_af_addr) とコマンド(app_af_cmd)を決めて、app_af_wrenを1にしてAddress FIFOに書きこむと同時に、app_wdf_wrenを1にして、D1,D0をデータ(app_wdf_data)、M1,M0をマスク(app_mask_data) に書きこむ。次のクロックでは、app_af_wrenは0に戻して、データのみを書き込む。これで4バーストモードの1つのWriteができるようになる。コマンドはWrirte(000)。

実際にシミュレーションでデータをWirteしている部分を下に示す。
ML509_MIG_9_110519.png

データをUser Write FIFOに書き始めてから、実際にDDR2 SDRAMのWriteアクセスが実行されるまでに116.25ns/3.75ns = 31クロックかかっている。4バーストWrite8個分のトランザクションが始まって、DDR2 SDRAMにWriteし終わる間のクロックは約71クロック。なお、最初の4バーストWrite4個分のバーストできたが、後の4バーストWrite4個分のバーストと2つに分けられている。これは、Rowアドレスが異なるからである。

・Read
Memory Interface Solutions UserGuideの386ページのFigure 9-14: DDR2 SDRAM Read Burst (BL = 4) for Four Bursts を下に引用する。
ML509_MIG_8_110519.png

Readの場合は、app_af_wrenを1にして、アドレス(app_af_addr) とコマンド(app_af_cmd)を決めてAddress FIFOに必要な分だけ書きこむ。DDR2 SDRAMコントローラがDDR2 SDRAMからReadしたデータは、rd_data_fifo_outにrd_data_validが1の時に出力される。

実際にシミュレーションでReadしている例を下に示す。
ML509_MIG_10_110519.png

これは、ユーザー回路からReadコマンドが発行されてから、実際にDDR2 SDRAMにReadコマンドが発行されるまでは、255.1ns / 3.75ns ≒ 68クロックである。これは、Writeの実行を待っているために遅くなってしまった。FIFOの深度が大きいと最大のレイテンシが大きくなるので注意が必要だと思う。
ユーザー回路からReadコマンドが発行されてから、最後のReadデータが到着するまでのクロック数は85クロックだった。

あまりFIFOに入れすぎると、後で入れたコマンド処理のレイテンシが増大してしまうかもしれないので、もし、それが懸念される用途に使用する場合は注意が必要だと思う。
  1. 2011年05月19日 17:37 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋が199万アクセス達成

FPGAの部屋もいつの間にか199万アクセス達成しました。自分で何気なく見たら、199万アクセスピッタリだったので、貼っておきます。
FPGAs_Room_199_110518.png

皆さん、見ていただいてありがとうございます。今後とも宜しくお願いいたします。
  1. 2011年05月19日 05:48 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

Spartan-3A Starter KitでMIGを使用する8(論理シミュレーション2)

”Spartan-3A Starter KitでMIGを使用する7(論理シミュレーション1)”でMIGのuser desginのシミュレーションができた。今回はユーザー回路からどのようにMIGが制御されているかを見ていく。Memory Interface Solutions UserGuide参照。

DDR2 SDRAMの初期化のシミュレーション波形を下に示す。
MIG_74_110516.png

200us 待ってから、Burst Length=4, CAS Latncy=3, ODT Rtt = Disabled, DQS_N Enable = Enabledに設定している。シミュレーション時の初期化時のログを下に示す。

268252100.0 ps INFO: Precharge All
268372100.0 ps INFO: Load Mode 2
268372100.0 ps INFO: Load Mode 2 High Temperature Self Refresh rate = 1X (0C-85C)
268492100.0 ps INFO: Load Mode 3
268612100.0 ps INFO: Load Mode 1
268612100.0 ps INFO: Load Mode 1 DLL Enable = Enabled
268612100.0 ps INFO: Load Mode 1 Output Drive Strength = Full
268612100.0 ps INFO: Load Mode 1 ODT Rtt = Disabled
268612100.0 ps INFO: Load Mode 1 Additive Latency = 0
268612100.0 ps INFO: Load Mode 1 OCD Program = OCD Exit
268612100.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
268612100.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
268612100.0 ps INFO: Load Mode 1 Output Enable = Enabled
268732100.0 ps INFO: Load Mode 0
268732100.0 ps INFO: Load Mode 0 Burst Length = 4
268732100.0 ps INFO: Load Mode 0 Burst Order = Sequential
268732100.0 ps INFO: Load Mode 0 CAS Latency = 3
268732100.0 ps INFO: Load Mode 0 Test Mode = Normal
268732100.0 ps INFO: Load Mode 0 DLL Reset = Reset DLL
268732100.0 ps INFO: Load Mode 0 Write Recovery = 3
268732100.0 ps INFO: Load Mode 0 Power Down Mode = Fast Exit
268852100.0 ps INFO: Precharge All
268972100.0 ps INFO: Refresh
269092100.0 ps INFO: Refresh
269212100.0 ps INFO: Load Mode 0
269212100.0 ps INFO: Load Mode 0 Burst Length = 4
269212100.0 ps INFO: Load Mode 0 Burst Order = Sequential
269212100.0 ps INFO: Load Mode 0 CAS Latency = 3
269212100.0 ps INFO: Load Mode 0 Test Mode = Normal
269212100.0 ps INFO: Load Mode 0 DLL Reset = Normal
269212100.0 ps INFO: Load Mode 0 Write Recovery = 3
269212100.0 ps INFO: Load Mode 0 Power Down Mode = Fast Exit
269332100.0 ps INFO: Load Mode 1
269332100.0 ps INFO: Load Mode 1 DLL Enable = Enabled
269332100.0 ps INFO: Load Mode 1 Output Drive Strength = Full
269332100.0 ps INFO: Load Mode 1 ODT Rtt = Disabled
269332100.0 ps INFO: Load Mode 1 Additive Latency = 0
269332100.0 ps INFO: Load Mode 1 OCD Program = OCD Default
269332100.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
269332100.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
269332100.0 ps INFO: Load Mode 1 Output Enable = Enabled
269452100.0 ps INFO: Load Mode 1
269452100.0 ps INFO: Load Mode 1 DLL Enable = Enabled
269452100.0 ps INFO: Load Mode 1 Output Drive Strength = Full
269452100.0 ps INFO: Load Mode 1 ODT Rtt = Disabled
269452100.0 ps INFO: Load Mode 1 Additive Latency = 0
269452100.0 ps INFO: Load Mode 1 OCD Program = OCD Exit
269452100.0 ps INFO: Load Mode 1 DQS_N Enable = Enabled
269452100.0 ps INFO: Load Mode 1 RDQS Enable = Disabled
269452100.0 ps INFO: Load Mode 1 Output Enable = Enabled
269452100.0 ps INFO: Initialization Sequence is complete


次にユーザー回路とのインターフェース信号を見ていく。
Spartan-3A用のMIGのデータ入力(user_input_data) は90度位相のずれたクロック(clk90_int) に同期している必要がある。その他の信号は、0度のクロック(clk_int) の立ち下がりに同期させる必要がある。また、DDR2 SDRAMからReadしたデータ(usr_output_data) や有効信号(usr_data_valid) は0度のクロック(clk_int) の立ち上がりに同期している。
Virtex-5のMIGよりユーザーインターフェースを作るのが面倒だ。コマンド入力用FIFOが付いていない感じだ。MIGのユーザーインターフェースの上にFIFOを使ったラッパーを作ったほうが良いかもしれない。

Spartan-3A用のMIGのユーザー・インターフェース信号について簡単に説明する。

clk0:位相0度のクロック
clk90:位相90度のクロック
user_command_register:Write Request(100) やRead Request(110)、NOP(000) などのコマンド。Initialize memory(010)。(clk0の立ち下がりに同期)
user_cmd_ack:MIGからコマンドをうけとれるという返事。リフレッシュなどの用事があってコマンドを受け取れない場合はアサートされない。(clk0の立ち下がりに同期)
user_input_address:アドレス入力。使いにくいことにROW+COLUMN+BANKの順番になっているので、まともに使用するためには、COLUMNとBANKのアドレスを入れ替える必要がありそう。(clk0の立ち下がりに同期)
burst_done:バーストの終了時に4バーストモードは2クロック間、8バーストモードは4クロック間アサートする。(clk0の立ち下がりに同期)
user_input_data:clk90に同期してデータを出力する(Writeのみ)。(clk90の立ち上がりに同期)
user_data_valid:user_output_dataが有効。(Readのみ)(clk90の立ち上がりに同期)
user_output_data:Readしたデータ。(Readのみ)(clk90の立ち上がりに同期)


Memory Interface Solutions UserGuideの332ページのFigure 8-10: DDR2 SDRAM Write Burst, Burst Lengths of Four and Two Burstsを下に引用する。
MIG_75_110519.png

上の図はSpartan-3A用MIGのWriteの例だ。

1.clk0の立ち下がりに同期して、ユーザー回路はWriteコマンドを発行し始める。
2.最低1クロック後にMIGは、clk0の立ち下がりに同期してuser_cmd_ackをアサートし、Writeコマンドを受け付けたことをユーザー回路に知らせる。ただし、リフレッシュ動作中でuser_cmd_ackのアサートが遅れることもある。
3.user_cmd_ackがアサートされた後のclk90の立ち上がりに同期して、ユーザー回路はuser_input_dataにWriteするデータを入力する。user_input_dataはDDR2 SDRAMのデータ幅の2倍幅となっている。4バーストモードならば、2つのデータを入力する必要がある。
4.ユーザー回路が入力するアドレス(row+column+bank address)は、user_cmd_ackがアサートされた後の3クロック間維持する。その後のバーストアドレスは2クロック維持する。(clk0の立ち下がりに同期)
5.write burstを終了させるときに、ユーザー回路はburst_doneをアサートしてMIGに知らせる。4バーストモードの時は2クロック間アサートする。
6.burst_doneのアサート後にWriteコマンドをデアサートする。(NOPコマンドに変更)
7.プリチャージをした後に、MIGはuser_cmd_ackをデアサートする。user_cmd_ackをデアサートされたら、ユーザー回路は次のコマンドを入力することができる。


実際にシミュレーションでデータをWirteしている部分を下に示す。
MIG_77_110519.png

4バーストモードで2組のデータをWriteすると、25クロックほどかかる。


次に、Memory Interface Solutions UserGuideの333ページのFigure 8-11: DDR2 SDRAM Read, Burst Lengths of Four and Two Burstsを下に引用する。
MIG_76_110519.png

上の図はSpartan-3A用MIGのReadの例だ。

1.clk0の立ち下がりに同期して、ユーザー回路はReadコマンドを発行し始める。
2.最低1クロック後にMIGは、clk0の立ち下がりに同期してuser_cmd_ackをアサートし、Readコマンドを受け付けたことをユーザー回路に知らせる。ただし、リフレッシュ動作中でuser_cmd_ackのアサートが遅れることもある。
3.ユーザー回路が入力するアドレス(row+column+bank address)は、user_cmd_ackがアサートされた後の3クロック間維持する。その後のバーストアドレスは2クロック維持する。(clk0の立ち下がりに同期)
4.user_output_dataが有効なのは、user_data_validがアサートされた時である。
5.DDR2 SDRAMのReadしたデータがuser_output_dataに出力される。user_output_dataはDDR2 SDRAMのバス幅の2倍の幅がある。DDR2 SDRAMは1クロックで2つのデータを読み書きするが、その2つのデータがuser_output_dataにSDR1クロックで出力される。4バーストモードでは、2つのデータがclk90の立ち上がりに同期して出力される。
6.read burstを終了させるときに、ユーザー回路はburst_doneをアサートしてMIGに知らせる。4バーストモードの時は2クロック間アサートする。
7.burst_doneのアサート後にReadコマンドをデアサートする。(NOPコマンドに変更)
8.プリチャージをした後に、MIGはuser_cmd_ackをデアサートする。user_cmd_ackをデアサートされたら、ユーザー回路は次のコマンドを入力することができる。大体、Readコマンドを発行してからデータが来るまで17クロックかかるようだ。


実際にシミュレーションでReadしている例を下に示す。
MIG_78_110519.png

4バーストモードで2組のデータをReadすると、データが到着し終わるまでに26.75クロックかかる。

Spartan-3AのMIGで困ったことは、user_input_addressのアドレス割り当てがrow+column+bank addressなことだ。COLUMNアドレスとBANKアドレスを入れ替えないと使いにくい。
  1. 2011年05月18日 05:50 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでMIGを使用する7(論理シミュレーション1)

Spartan-3A Starter KitでMIGを使用する6(MIGのインプリメント状況)”でMIGをインプリメントの状況を見た。
今回は論理シミュレーションを行う。

右のProject Managerをクリックして、Behavioral Simulationを表示させる。下の図は表示させた状態。
MIG_59_110516.png

FileメニューからAdd Sources...を選択すると、Add Sourcesダイアログが開く。Add or Simulation Sourcesラジオボタンをクリックする。
MIG_60_110516.png

Add or Simulation Sourcesダイアログが開く。Add Files...ボタンをクリックする。
MIG_61_110516.png

example_design\simに移動して、そこのVerilogファイルをすべて選択して、OKボタンをクリックする。
MIG_62_110516.png

Add or Simulation Sourcesダイアログに選択したVerilogファイルがリストされる。Next>ボタンをクリックする。
MIG_63_110516.png

Add Sources Summaryダイアログが表示された。Finishボタンをクリックする。
MIG_64_110516.png

PlanAheadのProject ManagerのSourcesウインドウにSimulation-Only Sourcesが追加されている。
MIG_65_110516.png

Project Managerの中のBehavioral Simulationをクリックする。
MIG_66_110516.png

Launch Behavioral Simulation ダイアログが開く。Simulation Top Module Nameを入力する。Simulation Top Module Nameの脇の…ボタンをクリックする。
MIG_67_110516.png

するとトップモジュールを検索して、候補が出てくる。sim_tb_topを選択して、OKボタンをクリックする。
MIG_68_110516.png

Launch Behavioral SimulationダイアログのSimulation Top Module Nameにsim_tb_topが表示された。Launchボタンをクリックするとシミュレーションが始まるが、Options...ボタンをクリックして、オプション設定を見てみよう。
MIG_69_110516.png

Simulation Optionsダイアログが開く。Launch OptionsとLanguage Optionsがある。Language Optionsは”PlanAhead13.1を試してみた1(インプリメント、シミュレーション)”でdefine値を指定するのに使用したので、Launch Optionsを見てみよう。Project Navigatorのシミュレーションのプロバティと同様な設定項目がある。このままだと1000ns シミュレーションを行う。今回はデフォルトとするので、OKボタンをクリックする。
MIG_70_110516.png

Launch Behavioral Simulationダイアログに戻る。Launchボタンをクリックするとコンパイルが始まり、ISimが起動する。
MIG_71_110516.png

300us間シミュレーションを行うと、270380100.0 psで、ERROR: Activate Failure. Initialization sequence is not complete.で止まってしまった。これは、”XUPV5-LX110T Development SystemでMIGを試す3(ISimでシミュレーション)”で遭遇したのと同じエラーだ。DDR2 SDRAMモデルにdefine値を与える必要がある。
MIG_72_110516.png

example_design\simフォルダのddr2_model_parameters.vhの最初に下の記述を追加した。

`define x512Mb
`define sg3
`define x16


修正後にISimのRe-Launchボタンをクリックする。コンパイルが始まって終了する。
Consoleウインドウで、

restart; run 300us


とコマンドを入力して、300us 間シミュレーションを行う。
MIG_73_110516.png

今度は、エラー無く300us 間のシミュレーションが完了した。下の図はDDR2 SDRAMの初期化部分を拡大した。
MIG_74_110516.png
  1. 2011年05月17日 05:41 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでMIGを使用する6(MIGのインプリメント状況)

Spartan-3A Starter KitでMIGを使用する5(インプリメント)”でMIGをインプリメントしてみた。

MIGのインプリメント状況を見てみようと思った。PlanAheadの配置図を下に示す。
MIG_54_110516.png

cal_ctlというPblockが真ん中の上にある。他のスライスはIOに沿ってまばらに配置されているようだ。DCMもDCMを外したので、実装されていない。
FPGA Editorをクロスプローブ用に立ち上げて、見てみた。この時にうまくクロスプローブ出来なかった。やり方がおかしいのだろうか?
cntrl0_ddr2_dq[0]を見てみよう。
MIG_55_110516.png
(MIGのcntrl0_ddr2_dq[0]のIOB)

IOBの出力用FFは使用されている。DDRなので、IOBのDDRレジスタを使用する必要がある。IOのトライステート制御用のFFは片側だけ使用されている。これは4つ単位でデータを出力するので、そうなるのだと思う。入力FFはスルーされている。
下に、私の自作DDR2 SDRAMコントローラのIOBを示す。
MIG_56_110516.png
(自作DDR2 SDRAMコントローラのddr2_dq[0]のIOB)

IOのトライステート制御用のFFを2つ使用している。これは、ODDR2プリミティブをインスタンスしているからだ。(自作DDR2 SDRAMコントローラのVeilog HDLコードの一部)

    ODDR2 #(
        .DDR_ALIGNMENT("NONE"),
        .SRTYPE("ASYNC")
    ) ODDR2_TRI(
        .Q(tri_out),
        .C0(clk270),
        .C1(clk90),
        .CE(tri_ddr_ce_to_io),
        .D0(tri_ddr_d0_to_io),
        .D1(tri_ddr_d1_to_io),
        .R(1'b0),
        .S(reset)
    );
    
    ODDR2 #(
        .DDR_ALIGNMENT("NONE"),
        .SRTYPE("SYNC")
    ) ODDR2_DATA(
        .Q(to_io_pad),
        .C0(clk270),
        .C1(clk90),
        .CE(data_ddr_ce_to_io),
        .D0(data_ddr_d0_to_io),
        .D1(data_ddr_d1_to_io),
        .R(1'b0),
        .S(reset)
    );
    
    IOBUF IOBUF_DQ(
        .O(dq_data_from_io),
        .IO(io_pad),
        .I(to_io_pad),
        .T(tri_out)
    );



もう一度MIGの実装に戻る。
cntrl0_ddr2_dq[0]の出力(IOパッドの入力)は、fifo_0_data_out[0]とfifo_1_data_out[0]スライスに入力されている。2つのスライスを見てみるとSLICE MでデュアルポートのRAMとして設定されていた。どちらかがクロックの立ち上がりのデータをキャプチャして、どちらかは立ち下がりのデータをキャプチャするのだと思う。これは、自作DDR2 SDRAMコントローラと同じ構成のようだ。
MIG_57_110516.png
(MIGのcntrl0_ddr2_dq[0]と次段回路の接続状況)

FPGA Editorでこの配線の遅延値を測定してみた。

driver - comp.pin "cntrl0_ddr2_dq[0].I", site.pin "AA1.I"
0.464ns - comp.pin "main_00/top0/data_path0/data_read0/fifo_1_data_out[0].BY", site.pin "SLICE_X0Y3.BY"
0.464ns - comp.pin "main_00/top0/data_path0/data_read0/fifo_0_data_out[0].BY", site.pin "SLICE_X0Y2.BY"


0.464nsの低遅延配線を使用しているようだ。
自作DDR2 SDRAMコントローラでも、低遅延の配線を試行錯誤して見つけて使用している。下に接続状況を示す。なお、配線が多いので、他の配線は消してある
MIG_58_110516.png
(自作DDR2 SDRAMコントローラのddr_dq[0]と次段の接続状況)

ddr2_dq[0]からの出力は、MIGと同様にRAMに指定された2つのSLICE Mに接続されている。立ち下がりのデータキャプチャ用と立ち下がりのデータキャプチャ用だ。
FPGA Editorでこの配線の遅延値を測定した結果を下に示す。

driver - comp.pin "ddr2_dq<0>.I", site.pin "H1.I"
0.411ns - comp.pin "ddr2_sdram_cont_inst/read_write_io_inst/dout<16>.BY", site.pin "SLICE_X2Y63.BY"
0.411ns - comp.pin "ddr2_sdram_cont_inst/read_write_io_inst/dout<0>.BY", site.pin "SLICE_X2Y62.BY"


MIGも自作DDR2 SDRAMコントローラもDDR2 SDRAMのデータの受け方は同じ方法を取っているのがわかった。ただし、Readのタイミングをどのように判断しているかの解析はしていない。

MIGのインプリメントを見るのはこの辺で終了とする。次はシミュレーションしてみたい。

  1. 2011年05月16日 05:41 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

岳(映画)を見てきました

昨日は、岳(リンクをクリックすると音がでます。注意)を見てきました。小栗旬と長澤まさみの共演で山岳救助の物語です。
山は綺麗ですし、なかなか良かったんですが、物語は多少安易かな?と思うところもありました。あそこから助かるのか?と思いました。
映画の後のクレジットで八方尾根スキー場もあったのですが、以前は八方尾根スキー場に行っていました。その時に、八方展望ペアリフトから見た景色が忘れられません。晴れる日は殆ど無くて、その1回だけどと思うのですが、晴れ渡ったときの景色は日本とは思えませんでした。あの辺りは森林限界をこえているのでしょうか?どこまでも滑っていけそうな?感じでした。実際に滑っていったら返ってこれないと思いますが。。。その辺の景色が岳に使われているような気がします。最後はもしかして第一ケルンですか?
若い頃ですが、北米のスキー場はウィスラー、ブラッコムレイクルイーズサンシャインビレッジに行ったことがありますが、すべて上の方は森林限界を越えて岩だらけでしたね。ウィスラーの一番上の急斜面を滑りながら、ところどころ出ている岩山にこけてぶつかったら大怪我、もしくは死んでしまうかも?と思って滑っていました。自己責任なんでしょうね?
カナダのカナディアン・ロッキーはとても素晴らしかったです。
スキー場でも吹雪の時は厳しいのですから、登山で天候が悪い場合は、本当に厳しいでしょうね。そういう事を思い出しました。
  1. 2011年05月15日 05:21 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでMIGを使用する5(インプリメント)

Spartan-3A Starter KitでMIGを使用する4(UCFを変更してロード)”の続き。

Spartan-3A Starter KitでMIGを使用する4(UCFを変更してロード)”で、UCFをSpartan-3A Starter Kitに合わせて変更し、MIGでロードしてみたが、IOパッドの位置がだめなようでエラーが出てしまった。やはり、Spartan-3A Starter KitのDDR2 SDRAMコントローラは、自分で作るかリファレンス・デザインを使うしか方法がないようだ。
今回は、MIGで生成したDDR2 SDRAMコントローラのexample desginをインプリメントしてみようと思う。

IPとして生成したMIGはそのままではインプリメント出来ないので、一旦削除した。
FileメニューからAdd Source...を選択すると、Add Sourcesダイアログが現れた。Add or Create Design Sourcesのラジオボタンをクリックして(デフォルト)、Next >ボタンをクリックする。
MIG_37_110514.png

Add or Create Design SourcesダイアログでAdd Filesボタンをクリックする。
MIG_38_110514.png

MIG_test_131\Spa3AKit_MIG_test\Spa3AKit_MIG_test.srcs\sources_1\ip\mig_v3_61_4\mig_v3_61_4\example_design\rtlのexample designのVerilogソースファイルをすべて選択してOKボタンをクリックする。
MIG_39_110514.png

Add or Create Design SourcesダイアログにVerilogソースファイルが入った。Next>ボタンをクリックする。
MIG_40_110514.png

Add Sources Summaryダイアログが出るので、Finishボタンをクリックする。
MIG_41_110514.png

MIGのexample designのVerilogファイルがプロジェクトに入った。
MIG_42_110514.png

FileメニューからAdd Source...を選択すると、Add Sourcesダイアログが現れた。Add or Create Constraintsのラジオボタンを選択する。
MIG_45_110514.png

Add or Create Constraintsダイアログが開く。Add Files...をクリックする。
MIG_46_110514.png

以前と同様に、parの下のmig_v3_61_4.ucfを指定する。
MIG_47_110514.png

mig_v3_61_4.ucfが入った。Next>ボタンをクリックする。
MIG_48_110514.png

Summaryが表示される。Finishボタンをクリックする。
MIG_49_110514.png

これで、UCFファイルがプロジェクトに追加された。
次に、インプリメントするためにトップモジュールを指定する。
mig_v3_61_4.vを選択して右クリックする。右クリックメニューからSpecify Top Module...を選択する。
MIG_43_110514.png

Specify Top Moduleダイアログが表示さる。Top Module Nameをmig_v3_61_4に修正して、Scan and Add RTL Include Files とAuto Re-order Source Files にチェックを入れて、OKボタンをクリックする。
MIG_44_110514.png

ここでRTL DesignのSynthesize ボタンをクリックする。
MIG_50_110514.png

Synthesis Completedダイアログが出る。続けてImplementを行う。Implementラジオボタンを選択して(デフォルト)、OKボタンをクリックする。
MIG_51_110514.png

Implementation Completedのダイアログが開く。今回はSpartan-3A Starter Kitにピン配置が合っていないので、ビットファイルを作っても使えない。デフォルトのままOKボタンをクリックした。
MIG_52_110514.png

インプリメント結果が表示された。
MIG_53_110514.png

なお、ISE13.1のPlanAheadを使用したビットファイルの生成、実機へのダウンロードは、”PlanAhead13.1を試してみた2(実機にダウンロード)”を参照のこと。
  1. 2011年05月14日 22:45 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでMIGを使用する4(UCFを変更してロード)

Spartan-3A Starter KitでMIGを使用する3(ボードの信号では生成できなかった)”の続き。

twitterで@osamu_takeuchiさんからMIGのピン配置変更についてのやり方を教えていただいたので、もう一度やってみることにした。参照サイト、”電気回路/HDL/Xilinx Memory Interface Generator (MIG) による DDR2 SDRAM のアクセス

それによると、MIGで一度生成したIPのUCFを希望のピン配置に書き換えて、MIG Output OptionダイアログでVerify UCF and Update Design and UCFのラジオボタンを選択するそうだ。
MIG_17_110509.png

早速やってみることにした。mig_3_61_4.ucfのLOC制約をSpartan-3A Starter Kitのピン配置に合わせて書き換えた。変更した部分を下に示す。

NET "cntrl0_ddr2_ck[0]" LOC = "M1" ; #bank 3
NET "cntrl0_ddr2_ck_n[0]" LOC = "M2" ; #bank 3
NET "cntrl0_ddr2_dm[0]" LOC = "J3" ; #bank 3
NET "cntrl0_ddr2_dm[1]" LOC = "E3" ; #bank 3
NET "cntrl0_ddr2_a[12]" LOC = "Y2" ; #bank 3
NET "cntrl0_ddr2_a[11]" LOC = "V1" ; #bank 3
NET "cntrl0_ddr2_a[10]" LOC = "T3" ; #bank 3
NET "cntrl0_ddr2_a[9]" LOC = "W2" ; #bank 3
NET "cntrl0_ddr2_a[8]" LOC = "W1" ; #bank 3
NET "cntrl0_ddr2_a[7]" LOC = "Y1" ; #bank 3
NET "cntrl0_ddr2_a[6]" LOC = "U1" ; #bank 3
NET "cntrl0_ddr2_a[5]" LOC = "U4" ; #bank 3
NET "cntrl0_ddr2_a[4]" LOC = "U2" ; #bank 3
NET "cntrl0_ddr2_a[3]" LOC = "U3" ; #bank 3
NET "cntrl0_ddr2_a[2]" LOC = "R1" ; #bank 3
NET "cntrl0_ddr2_a[1]" LOC = "T4" ; #bank 3
NET "cntrl0_ddr2_a[0]" LOC = "R2" ; #bank 3
NET "cntrl0_ddr2_ba[1]" LOC = "R3" ; #bank 3
NET "cntrl0_ddr2_ba[0]" LOC = "P3" ; #bank 3
NET "cntrl0_ddr2_cke" LOC = "N3" ; #bank 3
NET "cntrl0_ddr2_cs_n" LOC = "M5" ; #bank 3
NET "cntrl0_ddr2_ras_n" LOC = "M3" ; #bank 3
NET "cntrl0_ddr2_cas_n" LOC = "M4" ; #bank 3
NET "cntrl0_ddr2_we_n" LOC = "N4" ; #bank 3
NET "cntrl0_ddr2_odt" LOC = "P1" ; #bank 3
NET "cntrl0_ddr2_dq[15]" LOC = "F3"; #bank 3
NET "cntrl0_ddr2_dq[14]" LOC = "G3"; #bank 3
NET "cntrl0_ddr2_dq[13]" LOC = "F1"; #bank 3
NET "cntrl0_ddr2_dq[12]" LOC = "H5"; #bank 3
NET "cntrl0_ddr2_dq[11]" LOC = "H6"; #bank 3
NET "cntrl0_ddr2_dq[10]" LOC = "G1"; #bank 3
NET "cntrl0_ddr2_dq[9]" LOC = "G4"; #bank 3
NET "cntrl0_ddr2_dq[8]" LOC = "F2"; #bank 3
NET "cntrl0_ddr2_dq[7]" LOC = "H2"; #bank 3
NET "cntrl0_ddr2_dq[6]" LOC = "K4"; #bank 3
NET "cntrl0_ddr2_dq[5]" LOC = "L1"; #bank 3
NET "cntrl0_ddr2_dq[4]" LOC = "L5"; #bank 3
NET "cntrl0_ddr2_dq[3]" LOC = "L3"; #bank 3
NET "cntrl0_ddr2_dq[2]" LOC = "K1"; #bank 3
NET "cntrl0_ddr2_dq[1]" LOC = "K5"; #bank 3
NET "cntrl0_ddr2_dq[0]" LOC = "H1"; #bank 3
NET "cntrl0_ddr2_dqs[1]" LOC = "K6"; #bank 3
NET "cntrl0_ddr2_dqs_n[1]" LOC = "J5"; #bank 3
NET "cntrl0_ddr2_dqs[0]" LOC = "K3"; #bank 3
NET "cntrl0_ddr2_dqs_n[0]" LOC = "K2"; #bank 3
NET "cntrl0_rst_dqs_div_in" LOC = "H4"; #bank 3
NET "cntrl0_rst_dqs_div_out" LOC = "H3"; #bank 3
NET "reset_in_n" LOC = "T15" ; #bank 3


Project ManagerのIPのmig_3_61_4をダブルクリックして、MIGのダイアログを出す。
MIG Output OptionダイアログでVerify UCF and Update Design and UCFのラジオボタンを選択する。
MIG_33_110512.png

Load mig prj and UCF FileでLoad UCF Fileに書き換えたUCFファイを指定する。
MIG_34_110512.png

Summaryが出た。
MIG_35_110512.png

次に進んだら、大量にワーニングやエラーが出てしまった。
MIG_36_110512.png

エラーが出ているのでFinishボタンをクリックすると終了してしまった。

ワーニングやエラーの内容を示す。

Verification Report

Generated by MIG Version 3.6.1 on 金 5 13 05:35:49 2011
Reading design libraries of xc3s700a-fg484... successful !

/*******************************************************/
/* Controller 0
/*******************************************************/
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/five-slice_x3y27" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/four-slice_x2y26" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/one-slice_x2y27" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/six-slice_x3y26" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/three-slice_x2y26" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/two-slice_x2y27" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/five-slice_x1y27" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/four-slice_x0y26" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/one-slice_x0y27" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/six-slice_x1y26" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/three-slice_x0y26" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/two-slice_x0y27" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/five-g" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/four-f" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/one-f" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/six-g" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/three-g" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col0/two-g" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/five-g" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/four-f" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/one-f" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/six-g" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/three-g" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[1].dqs_delay_col1/two-g" for dqs_delayed column of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[1].fifo_0_wr_addr_inst/bit0-slice_x1y22" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[1].fifo_0_wr_addr_inst/bit1-slice_x1y22" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[1].fifo_0_wr_addr_inst/bit2-slice_x1y23" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[1].fifo_0_wr_addr_inst/bit3-slice_x1y23" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[1].fifo_1_wr_addr_inst/bit0-slice_x3y22" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[1].fifo_1_wr_addr_inst/bit1-slice_x3y22" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[1].fifo_1_wr_addr_inst/bit2-slice_x3y23" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[1].fifo_1_wr_addr_inst/bit3-slice_x3y23" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_en[1].fifo_0_wr_en_inst-slice_x1y25" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_en[1].fifo_1_wr_en_inst-slice_x3y25" for Fifo write address or write enable of dqs[1] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe/fifo_bit7-slice_x2y30" allocated for dq[15] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe_n/fifo_bit7-slice_x2y31" allocated for dq[15] is invalid.
ERROR: Trying to allocate dq[15] to a wrong PAD in an IO tile in the bank 3. All the even dq
signals (e.g. dq[0],dq[2]) should be allocated to the top pad and odd dq signals to
the bottom pad in an IO tile in the bank 3 for the selected Spartan device. Use FPGA
editor to know the PAD info of any pin.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe/fifo_bit6-slice_x0y30" allocated for dq[14] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe_n/fifo_bit6-slice_x0y31" allocated for dq[14] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe/fifo_bit5-slice_x2y28" allocated for dq[13] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe_n/fifo_bit5-slice_x2y29" allocated for dq[13] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe/fifo_bit4-slice_x0y28" allocated for dq[12] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe_n/fifo_bit4-slice_x0y29" allocated for dq[12] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe/fifo_bit3-slice_x2y22" allocated for dq[11] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe_n/fifo_bit3-slice_x2y23" allocated for dq[11] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe/fifo_bit2-slice_x0y20" allocated for dq[10] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe_n/fifo_bit2-slice_x0y21" allocated for dq[10] is invalid.
ERROR: Trying to allocate dq[10] to a wrong PAD in an IO tile in the bank 3. All the even dq
signals (e.g. dq[0],dq[2]) should be allocated to the top pad and odd dq signals to
the bottom pad in an IO tile in the bank 3 for the selected Spartan device. Use FPGA
editor to know the PAD info of any pin.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe/fifo_bit1-slice_x2y20" allocated for dq[9] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe_n/fifo_bit1-slice_x2y21" allocated for dq[9] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe/fifo_bit0-slice_x0y18" allocated for dq[8] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[1].strobe_n/fifo_bit0-slice_x0y19" allocated for dq[8] is invalid.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/five-slice_x3y7" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/four-slice_x2y6" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/one-slice_x2y7" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/six-slice_x3y6" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/three-slice_x2y6" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/two-slice_x2y7" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/five-slice_x1y7" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/four-slice_x0y6" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/one-slice_x0y7" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/six-slice_x1y6" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/three-slice_x0y6" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay location constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/two-slice_x0y7" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/five-g" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/four-f" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/one-f" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/six-g" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/three-g" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/two-g" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/five-g" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/four-f" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/one-f" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/six-g" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/three-g" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
LUT delay BEL constraint "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col1/two-g" for dqs_delayed column of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[0].fifo_0_wr_addr_inst/bit0-slice_x1y2" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[0].fifo_0_wr_addr_inst/bit1-slice_x1y2" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[0].fifo_0_wr_addr_inst/bit2-slice_x1y3" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[0].fifo_0_wr_addr_inst/bit3-slice_x1y3" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[0].fifo_1_wr_addr_inst/bit0-slice_x3y2" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[0].fifo_1_wr_addr_inst/bit1-slice_x3y2" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[0].fifo_1_wr_addr_inst/bit2-slice_x3y3" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_addr[0].fifo_1_wr_addr_inst/bit3-slice_x3y3" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_en[0].fifo_0_wr_en_inst-slice_x1y5" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/gen_wr_en[0].fifo_1_wr_en_inst-slice_x3y5" for Fifo write address or write enable of dqs[0] is invalid or missing.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe/fifo_bit7-slice_x2y12" allocated for dq[7] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe_n/fifo_bit7-slice_x2y13" allocated for dq[7] is invalid.
ERROR: Trying to allocate dq[7] to a wrong PAD in an IO tile in the bank 3. All the even dq
signals (e.g. dq[0],dq[2]) should be allocated to the top pad and odd dq signals to
the bottom pad in an IO tile in the bank 3 for the selected Spartan device. Use FPGA
editor to know the PAD info of any pin.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe/fifo_bit6-slice_x0y12" allocated for dq[6] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe_n/fifo_bit6-slice_x0y13" allocated for dq[6] is invalid.
ERROR: Trying to allocate dq[6] to a wrong PAD in an IO tile in the bank 3. All the even dq
signals (e.g. dq[0],dq[2]) should be allocated to the top pad and odd dq signals to
the bottom pad in an IO tile in the bank 3 for the selected Spartan device. Use FPGA
editor to know the PAD info of any pin.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe/fifo_bit5-slice_x2y10" allocated for dq[5] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe_n/fifo_bit5-slice_x2y11" allocated for dq[5] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe/fifo_bit4-slice_x0y10" allocated for dq[4] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe_n/fifo_bit4-slice_x0y11" allocated for dq[4] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe/fifo_bit3-slice_x2y4" allocated for dq[3] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe_n/fifo_bit3-slice_x2y5" allocated for dq[3] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe/fifo_bit2-slice_x0y4" allocated for dq[2] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe_n/fifo_bit2-slice_x0y5" allocated for dq[2] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe/fifo_bit1-slice_x2y2" allocated for dq[1] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe_n/fifo_bit1-slice_x2y3" allocated for dq[1] is invalid.
ERROR: Trying to allocate dq[1] to a wrong PAD in an IO tile in the bank 3. All the even dq
signals (e.g. dq[0],dq[2]) should be allocated to the top pad and odd dq signals to
the bottom pad in an IO tile in the bank 3 for the selected Spartan device. Use FPGA
editor to know the PAD info of any pin.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe/fifo_bit0-slice_x0y2" allocated for dq[0] is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read0/gen_strobe[0].strobe_n/fifo_bit0-slice_x0y3" allocated for dq[0] is invalid.
ERROR: Trying to allocate dq[0] to a wrong PAD in an IO tile in the bank 3. All the even dq
signals (e.g. dq[0],dq[2]) should be allocated to the top pad and odd dq signals to
the bottom pad in an IO tile in the bank 3 for the selected Spartan device. Use FPGA
editor to know the PAD info of any pin.
WARNING: The signal reset_in_n is missing or allocated to invalid I/O.
WARNING:
Slice location constraint for delayed rst_dqs_div_out signal is not correct.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/rst_dqs_div_delayed/five-slice_x1y14" for delayed rst_dqs_div_in signal is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/rst_dqs_div_delayed/four-slice_x1y14" for delayed rst_dqs_div_in signal is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/rst_dqs_div_delayed/one-slice_x0y15" for delayed rst_dqs_div_in signal is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/rst_dqs_div_delayed/six-slice_x1y15" for delayed rst_dqs_div_in signal is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/rst_dqs_div_delayed/three-slice_x0y15" for delayed rst_dqs_div_in signal is invalid.
WARNING:
Slice location constraint "top_00/data_path0/data_read_controller0/rst_dqs_div_delayed/two-slice_x0y14" for delayed rst_dqs_div_in signal is invalid.

Verification completed. Found the following warnings.
Number of warnings in the input UCF = 108.

Verification completed. Found the following errors.
Number of errors in the input UCF = 6.


dqのパッド位置が悪いと言われている気がするが、もう少し、LOCだけのUCFとかでやってみようと思う。
  1. 2011年05月13日 05:48 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

Core i7 2600+H67チップセットとGTX460で3画面表示

職場で購入したCore i7 2600+H67チップセットパソコンには、NVIDIAのGTX460グラフィックボードが付いています。

これでGTX460で2画面+H67チップセットで1画面の3画面で使おうと思っていましたが、GTX460を活かすと、H67チップセットのグラフィックが死んでしまって、3画面になりませんでした。(今までは、PCIeにグラボを付けると内蔵GPUはディスエーブルされていたが、H67チップセットからはできるとの情報があった)

Sandy Bridge向けチップセットの機能を集約した「Intel Z68 Express」”の”CPU内蔵GPUとビデオカードを動的に切り替える「LucidLogix Virtu」”を読んで、もしかしてこれで行けるのかな?と思いやってみました。以前、iGPU Multi-Mobitorをイネーブルにしたことはあったんですが、3画面に出来なかったです。

今回はBIOSをアップデートしてやってみることにしました。マザーボードはASUSのP8H67-M PROです。
まずは、最新のP8H67-M PRO 1002 BIOSをダウンロードして、ユーティリティのASUS UpdateでBIOSを書き込み、リブートしました。
BIOS画面で、Advanced Modeにして、詳細->ノースブリッジから、iGPU Multi-Mobitorを有効にしました。(日本語モード)
H67_1_110512.jpg

これで起動させると、めでたく3画面表示ができるようになりました。良かったです。
1世代前のパソコンでは、グラボを2枚入れてあったのですが、1枚のグラボと内蔵GPUで3画面表示をすることができるようになりました。

なお、ASUSのユーティリティ(AI Suite II)を入れておくと、H67チップセットで出力している壁紙に黒い四角が出てしまいます。ASUSのユーティリティはアンインストールしました。それに、回転数の低い静音CPUファンが付いてると警告が出まくりです。
更にBIOSにもモニタがあって、CPUファンが数百回転だと立ち上がれないので、しきい値を200回転に落としました。
  1. 2011年05月12日 18:31 |
  2. パソコン関連
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110T Development SystemでMIGを試す3(ISimでシミュレーション)

XUPV5-LX110T Development SystemでMIGを試す2”の続きで、シミュレーションを試みた。

ModelSimでシミュレーションを行うらしく、sim.do があったが、ISimでシミュレーションをやってみようということで、example_design\sim フォルダのddr_model.v, ddr2_model_parameters.vh, sim_tb_top.v, wiredly.v をプロジェクトに入れて、Simulationを試みた。
しかし、Activateコマンドを実行したところで止まってしまった。エラーログを下に示す。

sim_tb_top.\gen_cs[0].gen[0].u_mem0 .cmd_task: at time 20718860.0 ps ERROR: Activate Failure. Initialization sequence is not complete.


初期化シーケンスが悪いのか?と思い調べた。調査結果を下に示す。

1.    9129.485 ns     All banks PRECHARGE
2.    10111.985 ns        LOAD MODE        
    BA=2, EMR2 値は0000、1X refresh rate
3.    11094.485 ns    LOAD MODE
    BA=3, EMR3 値は0000
4.    12076.985 ns    LOAD MODE
    BA=1, EMR1 値は0004、Outputs Enable, RDQS Disable, DQS# Enable, OCD exit, Rtt=75Ω, Posted CAS# = 0, Output Drive Strength Full, DLL Enable
5.    13059.485 ns    LOAD MODE
    BA=0, MR 値は0742、Fast exit, Write Recovery = 4, DLL Reast = Yes, CAS Latency = 4, Sequential, Burst Length = 4
6.    14821.985 ns    All banks PRECHARGE
7.    15804.485 ns    REFRESH
8.    16786.985 ns    REFRESH
9.    17769.485 ns    LOAD MODE
    BA=0, MR 値は0642、Fast exit, Write Recovery = 4, DLL Reast = No, CAS Latency = 4, Sequential, Burst Length = 4
10.    18751.985 ns    LOAD MODE
    BA=1, EMR1 値は0384、Outputs Enable, RDQS Disable, DQS# Enable, Enable OCD defaults, Rtt=75Ω, Posted CAS# = 0, Output Drive Strength Full, DLL Enable
11.    19734.485 ns    LOAD MODE
    BA=1, EMR1 値は0004、Outputs Enable, RDQS Disable, DQS# Enable, OCD exit, Rtt=75Ω, Posted CAS# = 0, Output Drive Strength Full, DLL Enable
12.    20716.985 ns    Activate ここでエラーになる。ERROR: Activate Failure. Initialization sequence is not complete.
    BA=0, address=0000
13.    21691.985 ns    Write 当然、ここでもエラー。ERROR: Write Failure. Initialization sequence is not complete.
    BA=0, address=0000、データはFFFFFFFFFFFFFFFFと0000000000000000の繰り返し
14.    21699.485 ns    Write 当然、ここでもエラー。ERROR: Write Failure. Initialization sequence is not complete.
    BA=0, address=0004、データはFFFFFFFFFFFFFFFFと0000000000000000の繰り返し


問題なく初期化シーケンスが実行されている。

原因は何かと探ったら、ddr2_model.vのbaのインスタンスが3ビット、addrのインスタンスが14ビットだった。正しくはbaが2ビット、addrが13ビットで両方共最上位の1ビットの接続がなく、Xとなってしまった。これで、比較演算がうまくいかなくてDDR2 SDRAMモデル(ddr2_model.v)の初期化の認識がうまく行かなかったようだ。

sim.doを見ると、下のようにdefineされていた。

vlog +incdir+. +define+x512Mb +define+sg37E +define+x16 ddr2_model.v



Project NavigatorのDesignのSimulationラジオボタンをクリックして、シミュレーションモードに移行する。Simulation Behavioral Modelを右クリックして、右クリックメニューからProcess Properties...を選択して、ISim Propertiesダイアログを表示する。
-d オプションの欄にx512Mb sg37E x16 を書いてコンパイルし、シミュレーションしてみたが、ba, addrのビット数に変化はなかった。
XPUV5-LX110T_MIG_1_110512.png

次に、ddr2_model_parameters.vh に直接記述した。

`define x512Mb
`define sg37E
`define x16


その結果、ba=2ビット幅、addr=13ビット幅になって正常にシミュレーションが進むようになった。(図を追加)
XPUV5-LX110T_MIG_2_110513.png

Micron社のメモリモデルはdefineする必要があるのを忘れていた。

#ModelSimはdoファイルでwhen を使ってエラーテストも出来るみたいですね?同じようなことをISimでTCLでできないか?と思って、Helpを見てみたところ、isim condition コマンドで、できそうです。そのうちに試してみようと思います。
  1. 2011年05月12日 16:39 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでMIGを使用する3(ボードの信号では生成できなかった)

Spartan-3A Starter KitでMIGを使用する2(MIGの生成)”でとりあえず、MIGを生成していみたが、Spartan-3A Starter Kitとピン配置があっていなかった。これでは使えないので、ピン配置をあわせる努力をしてみた。

ピン配置を合わせるには、FPGAのバンク3のピンのうち、Spartan-3A Starter KitのDDR2 SDRAMで使用していないピンをProhibitしてみようと思った。
まずは、PlanAhead のProject ManagerからIPのmig_v3_61_4を右クリックして、右クリックメニューからRe-customize IP...を選択する。(IPをダブルクリックしても起動しました)
MIG_30_110511.png

すると、MIGのダイアログが開く。
MIG_16_110507.png

設定を進めていって、Reserve Pinsのダイアログまで進めた。ここで、バンク3のSpartan-3A Starter KitのDDR2 SDRAM関連のピンだけをAvailable Pinsに残して、残りはReserved Pinsに設定した。
MIG_31_110511.png

これで設定を進めてみたが、Bank Selection For Controller 0 - DDR2 SDRAMのダイアログでエラーが出てしまった。Available PinsだけではMIGではDDR2 SDRAMコントローラを生成できないようだ。残念。。。
MIG_32_110511.png

さて、ここで手詰まりになってしまったので、どうするかだが、Spartan-3A Starter Kitに関しては、Spartan-3A/3AN FPGA Starter Kit Board Design ExamplesDDR2 MIG Reference Designがあるのでこれを使えば良いと思う。しかし、自分で作ったDDR2 SDRAMコントローラがあって正常動作しているので、わざわざリファレンスデザインを使うこともない。今回はMIGのユーザーデザインとのインタフェースを確認出来れば良い。

MIGでは、example_designとuser_designが生成されるが、Project Managerに入っているmig_v3_61_4.vはuser_designの方だった。example_designであれば、DDR2 SDRAMコントローラを制御するラッパーがかぶっているので、手っ取り早くテストをすることができる。次回からは、Project Managerのプロジェクトをexample designに入れ替えて、シミュレーションとインプリントを試してみようかと思う。
MIGの生成はProject NavigatorやProject Managerから生成するのではなく、CORE Generatorを単体で立ち上げて生成するのが良いと思う。その後、example_designとuser_designのどちらかをプロジェクトに入れて使用したい。やり方は、Virtex-5だが、”XUPV5-LX110T MIG Design Creation”辺りを参照のこと。

なお、ISE13.1で、既存のProject NavigatorのプロジェクトをPlanAheadのProject Managerプロジェクトに変更した記事を以下に示す。まだ、完全ではないようだ。タイミング違反などが出ているが、一応動作した。
PlanAhead13.1を試してみた1(インプリメント、シミュレーション)
PlanAhead13.1を試してみた2(実機にダウンロード)

もう1つ、Project Managerでやっていて不満な点は、Project Navigatorだったら、テストベンチのスケルトンファイルを生成してくれたのだが、Project Managerではその方法が見つからないことだ。便利に使っていたので、Project Managerでも生成出来れば良いと思う。(やり方をご存じの方は教えてください)
  1. 2011年05月12日 05:41 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

MIGで使用されている制約

MIGで生成したDDR2 SDRAMコントローラの制約ファイル(UCFファイル)を見ると知らなかった制約を使ったあったので、勉強してみることにする。制約ガイドを参照。(現在、Xilinx社の制約ガイドへのリンクが切れているようです)

まずは、RLOCとU_SET。MIGが生成したUCFファイルの一部を引用する。

INST "infrastructure_top0/cal_top0/tap_dly0/l0" RLOC=X0Y6;
INST "infrastructure_top0/cal_top0/tap_dly0/l0" U_SET = delay_calibration_chain;


RLOC(相対配置制約、原点に対して相対的に位置を指定する。RLOC_ORIGNで原点を指定する)は知っていたのだが、U_SETは知らなかった。U_SETは制約ガイドによると、

デザイン階層全体に分散されているデザインエレメントに RLOC 制約を設定し、1 つの集合にグループ化できるようにします。


ということなので、delay_calibration_chainというグループにグループ化していることになる。

次に、FROM TO制約の場合のDATAPATHONLY。下にMIGが生成したUCFファイルの一部を引用する。

TIMESPEC "TS_CLK" = FROM "clk0" TO "dqs_clk" 18 ns DATAPATHONLY;


ISE13.1のタイミング制約ユーザーガイドの115,116ページの一部を引用する。

FROM:TO (マルチサ イ ク ル) 制約の解析には、ソースと デステ ィネーション同期エレメント間のクロックスキューが含まれます。クロックスキーは、デスティネーション同期エレメントへのクロックパスからソース同期エレメントへのクロックパスの値を引いて計算されます。クロックスキー解析は、制約の付けられたすべてのクロック に対して自動的に実行されます。 解析には、すべてのデバイスファミリでセットアップ解析、 Virtex-5以降のデバ イ ス の場合はセットアップ とホールド解析の両方が含まれます。FROM:TO制約のクロックスキューを 無視す る 場合は、DATAPATHONLY キーワー ド を使用し ます。
DATAPATHONLY では、解析中にFROM:TO 制約でクロックスキューや位相情報が考慮されないように指定できます。こ のキーワードを使用すると 、データパスのみが解析されます。


DATAPATHONLYを付けると、クロックスキューなどを無視して、データパスのみを解析するそうだ。しかし、Virtex-5以下は新しいバージョンのISEでもホールドの解析はされていないんだったか?確認してみよう。

DIFF_SSTL18_IIという差動のSSTL18の制約があったのか?自分でもこれを指定しておけば良かった。

NET "cntrl0_ddr2_dqs[*]" IOSTANDARD = DIFF_SSTL18_II;
NET "cntrl0_ddr2_dqs_n[*]" IOSTANDARD = DIFF_SSTL18_II;


でも、Spartan-3A Starter Kitのユーザーガイドの117ページでは、DIFF_SSTL18_IIは使っていない。SSTL18_IIを使用している。

BEL、これは知っていたが、書いておく。

INST "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/six" LOC = SLICE_X3Y6;
INST "top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/six" BEL = G;


Spartan-3Aでは、スライスに2つのFFが入っている。これをFとGと呼んでいる。これは、FPGA Editorでスライスをダブルクリックして、F=ボタンをクリックしてみるとよくわかると思う。下にその図を示す。
UCF_1_110511.png

つまり上の制約は、"top_00/data_path0/data_read_controller0/gen_delay[0].dqs_delay_col0/six"というインスタンスがSLICE_X3Y6のスライスの下側のGのFFに割り当てられることを示している。
  1. 2011年05月11日 05:05 |
  2. UCFの書き方
  3. | トラックバック:0
  4. | コメント:0

Spartan-3A Starter KitでMIGを使用する2(MIGの生成)

Spartan-3A Starter KitでMIGを使用する1(PlanAhead新規プロジェクトの作成)”の続き。

Project ManagerからIP Catalogを選択する。
MIG_11_110502.png

IP Catalogのウインドウが右に開く。今回はMIGを使用するので、Memory & Storage Elements -> Memory Interface Generators -> MIGをダブルクリックして起動する。
MIG_12_110502.png

MIGのダイアログが開いたが、Design EntryがVHDLだったので、一旦Cancelした。今回はVerilogを使用する。
MIG_13_110502.png

MIGを右クリックして、右クリックメニューからIP Catalog Setting...を選択する。
MIG_14_110502.png

HDL TypeをAutoからVerilogに変更して、OKボタンをクリックする。
MIG_15_110502.png

同様にMIGを起動すると、Design EntryがVerilogになった。これで、MIGのウィザードを進める。
MIG_16_110507.png

今回はCreate Designのラジオボタンをクリックする。(Spartan-3A Starter Kitなので、Xilinx Reference Boardsのラジオボタンをクリックしたら、Reference Designを使えと言われてしまった)
MIG_17_110509.png

Spartan-3Aを選択する。xc3s700a-fg484 -4 が選択されている。Spartan-3A Starter Kit系のFPGAのみ選択できるようだ。やはり、Spartan-3AでDDR, DDR2 SDRAMのメモリインタフェースを提供するのは難しいと思う。DDR2 SDRAMコントローラを自分で作ったときに実感できた。やはり、トレーニングシーケンスを実行出来るVirtex-4以降のFPGAでないと、どのパッケージでもコンパチに動作できるDDR SDRAMコントローラIPを作るのは難しいのだと思う。
MIG_18_110509.png

DDR2 SDRAMを選択する。
MIG_19_110509.png

動作周波数は125MHzとする。周期で8000psなので、Frequencyのボックスを修正した。
実際にSpartan-3A Starter Kitに搭載されているMicronのDDR2 SDRAMのマーキングがD9GMGだったので、FBGA Part Marking Decoderで調べたところ、型番はMT47H32M16BN-3:Dだということがわかった。よって、Memory Partでその型番を選択した。
Data WithはDDR2 SDRAMに合わせて16を選択した。
MIG_20_110509.png

次に、Burst Lengthはデフォルト値の4とした。Burst Typeもデフォルト値のsequential。その他もデフォルト値とした。
MIG_21_110509.png

次のDCM Optionは外部からクロックを入れたいので、チェックを外した。それに伴って、System Clockも坏土された。その他はデフォルト値とした。
MIG_22_110509.png

次のReserve Pinsだが、使用しないピンをReserved Pinsに指定すれば確実だとは思うが、とりあえず無しで、どのようにピン配置されるかを見てみることにした。
MIG_23_110509.png

次は、System Control、Data、Address/Control の各信号のバンクを選ぶ、Spartan-3A Starter Kitのユーザーガイドを調べると、すべてバンク3にあるようだ。Bank3にチェックをして選択する。
MIG_24_110509.png

Summaryが表示される。
MIG_25_110509.png

Micron社のシミュレーション・モデルのライセンスが表示される。Acceptのラジオボタンをクリックする。
MIG_26_110509.png

プリント基板作成時のガイドラインが表示される。これを見ても、基板を作る前にMIGでIPを生成してみる必要があるようだ。
MIG_27_110509.png

いろいろな注意事項が出てくる。Generateボタンをクリックして、MIGを生成する。
MIG_28_110509.png

生成が終了した。何度かMIGの生成を試しているので、mig_v3_61_4になってしまった。
MIG_29_110510.png

生成は成功したが、Spartan-3A Starter Kitのピン配置とは違っている。下にUCFファイルのピン配置の一部を引用する。

NET "cntrl0_ddr2_ck[0]" LOC = "M5" ; #bank 3
NET "cntrl0_ddr2_ck_n[0]" LOC = "N4" ; #bank 3
NET "cntrl0_ddr2_dm[0]" LOC = "V3" ; #bank 3
NET "cntrl0_ddr2_dm[1]" LOC = "P3" ; #bank 3
NET "cntrl0_ddr2_a[12]" LOC = "P1" ; #bank 3
NET "cntrl0_ddr2_a[11]" LOC = "P2" ; #bank 3
NET "cntrl0_ddr2_a[10]" LOC = "M3" ; #bank 3
NET "cntrl0_ddr2_a[9]" LOC = "M4" ; #bank 3
NET "cntrl0_ddr2_a[8]" LOC = "M1" ; #bank 3
NET "cntrl0_ddr2_a[7]" LOC = "M2" ; #bank 3
NET "cntrl0_ddr2_a[6]" LOC = "K1" ; #bank 3
NET "cntrl0_ddr2_a[5]" LOC = "L1" ; #bank 3
NET "cntrl0_ddr2_a[4]" LOC = "L5" ; #bank 3
NET "cntrl0_ddr2_a[3]" LOC = "L3" ; #bank 3
NET "cntrl0_ddr2_a[2]" LOC = "K3" ; #bank 3
NET "cntrl0_ddr2_a[1]" LOC = "K2" ; #bank 3
NET "cntrl0_ddr2_a[0]" LOC = "K5" ; #bank 3
NET "cntrl0_ddr2_ba[1]" LOC = "K4" ; #bank 3
NET "cntrl0_ddr2_ba[0]" LOC = "H2" ; #bank 3
NET "cntrl0_ddr2_cke" LOC = "H1" ; #bank 3
NET "cntrl0_ddr2_cs_n" LOC = "H4" ; #bank 3
NET "cntrl0_ddr2_ras_n" LOC = "H3" ; #bank 3
NET "cntrl0_ddr2_cas_n" LOC = "G3" ; #bank 3
NET "cntrl0_ddr2_we_n" LOC = "G1" ; #bank 3
NET "cntrl0_ddr2_odt" LOC = "F2" ; #bank 3
NET "reset_in_n" LOC = "K6" ; #bank 3



Spartan-3A Starter KitのUCFの一部を引用すると下のようになるので、上のMIGのUCFとは違っているのがわかる。

NET "SD_CK_P" LOC = "M1" | IOSTANDARD = SSTL18_II ;
NET "SD_CK_N" LOC = "M2" | IOSTANDARD = SSTL18_II ;
NET "SD_UDM" LOC = "E3" | IOSTANDARD = SSTL18_II ;
NET "SD_LDM" LOC = "J3" | IOSTANDARD = SSTL18_II ;
NET "SD_A<12>" LOC = "Y2" | IOSTANDARD = SSTL18_II ;
NET "SD_A<11>" LOC = "V1" | IOSTANDARD = SSTL18_II ;
NET "SD_A<10>" LOC = "T3" | IOSTANDARD = SSTL18_II ;
NET "SD_A<9>" LOC = "W2" | IOSTANDARD = SSTL18_II ;
NET "SD_A<8>" LOC = "W1" | IOSTANDARD = SSTL18_II ;
NET "SD_A<7>" LOC = "Y1" | IOSTANDARD = SSTL18_II ;
NET "SD_A<6>" LOC = "U1" | IOSTANDARD = SSTL18_II ;
NET "SD_A<5>" LOC = "U4" | IOSTANDARD = SSTL18_II ;
NET "SD_A<4>" LOC = "U2" | IOSTANDARD = SSTL18_II ;
NET "SD_A<3>" LOC = "U3" | IOSTANDARD = SSTL18_II ;
NET "SD_A<2>" LOC = "R1" | IOSTANDARD = SSTL18_II ;
NET "SD_A<1>" LOC = "T4" | IOSTANDARD = SSTL18_II ;
NET "SD_A<0>" LOC = "R2" | IOSTANDARD = SSTL18_II ;


  1. 2011年05月09日 05:27 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110T Development SystemでMIGを試す2

XUPV5-LX110T Development SystemでMIGを試す”で、Digilent社のVirtex-5 OpenSPARC Evaluation PlatformでMIGを試してみたが、あくまでも”XUPV5-LX110T Reference Designs ”のMIGデザインをそっくりそのまま、まねただけだった。

MIGのクロック入力の状態を記述する。

・ このMIGデザインは、SMAコネクタのクロック入力J10とJ11から200MHzの差動クロックを入力している。SMAコネクタから入力された差動クロックは、回路図の2ページ右上のH14(SMA_DIFF_CLKIN_P), H15(SMA_DIFF_CLKIN_N)に入力されている。
・ クロックが出力されるのはJ12とJ13で、これは、ICS843001-21から出力された差動クロックだ。回路図9ページ。
・ SW6が設定スイッチとして割り当てられている。SW6が01001010と設定されていると、N0-0, N1-1, N2-0, M0-0, M1-1, M2-0, SEL1-1, SEL0-0 となる。
・ SEL1, SEL0で入力を選択していて、この値の時はTEST_CLK入力となる。TEST_CLKには、25MHzの水晶発振器がつながっている。
・ ICS843001-21は上記の設定だと、25MHz入力、M分周比=24, N分周比=3となって、出力周波数は200MHzとなる。(TABLE 3A. COMMON CONFIGURATIONS TABLE 参照)


結論としては、SMAケーブルでsys_clkを供給しているので、ケーブルを接続している。しかし、ケーブルで接続するのは面倒だ。
fr_476_size580.jpg

SMAケーブルを外したいので、sys_clkとして使える差動200MHzクロックが出ているFPGAのピンを探した。
そうすると回路図の9ページのCLK_BUF_Q1_P, CLK_BUF_Q1_Nに差動200MHzクロックが出ていた。これは、回路図2ページの右上で、FPGAのK18, J19ピンに入力されている。よって下のようにUCFファイルを書き換えた。

NET "sys_clk_p" LOC = "K18" ; #Bank 3
NET "sys_clk_n" LOC = "J19" ; #Bank 3


これで、SMAケーブルを外しても、MIGのデモを行うことができた。
  1. 2011年05月06日 17:20 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

娘の引越し

5月3日、4日に娘の引越しで仙台に行ってきました。
3日の4時30分に車で家を出て、栃木県の矢板インターから東北道へ乗りました。しばらくはスムーズに流れていましたが、国見当たりで渋滞にはまりました。
sendai_hikkoshi_1_110505.jpg

6時間くらいかかって、やっと仙台に着きました。アパートの鍵を貰ってからアパートへ。引越しやさんとか電気屋さんとか次々と来て、忙しかったです。その日はアパートに、下の娘と奥さんと4人で泊まりました。
次の日は、買い物です。車でダイエーに買いに行こうとしたのですが、駐車場が見つかりません。ぐるぐる走りまわって、やっぱり駐車場が見つからないので、歩いて買いに行きました。やはり、都会で車は慣れていないと難しいですね。
仙台駅に行ったら、前回とは違って、足場がかけてあって、ネットがかかっていました。内部は普通だったので、修復が進んでいると思います。
sendai_hikkoshi_2_110505.jpg

帰りは4日の3時30分ころ仙台を出発しましたが、東北道が断続的に渋滞で、家に帰るのに8時間かかってしまいました。ほんとうに疲れました。
今日は疲れからぐたーとしていましたが、夜になって大分回復してきました。
  1. 2011年05月05日 21:05 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:4

Spartan-3A Starter KitでMIGを使用する1(PlanAhead新規プロジェクトの作成)

Spartan-3A Starter KitやXUPV5-LX110T Development SystemでMIG(Memory Interface Generator) を使ってみようと思う。
皆さんはすでに使用されているかもしれないが、私は自分で作ったDDR2 SDRAMコントローラを使っていたので、MIG、は試しにやってみたことしかない。今回は自分で作ったDDR2 SDRAMコントローラの代わりにラッパーをかませて、MIGを使用することにする。

まずはSpartan-3A Starter Kit用のMIGの生成からやってみたい。今回は次期主力のPlanAheadでプロジェクトを作成して、MIGをテストしてみることにする。バージョンは13.1とする。
PlanAheadを起動して、Create New Projectをクリックして、プロジェクトを生成する。
MIG_1_110502.png

New Projectダイアログが開く。Next>ボタンをクリックする。
MIG_2_110502.png

Project NameとProject Locationを入力する。
MIG_3_110502.png

Specify RTL Sourcesを選択する。(1から作る)
MIG_4_110502.png

Add Sourcesでは、何も入れないで、Next>ボタンをクリックする。
MIG_5_110502.png

Add Existing IPでも、生成したIPがないので、Next>ボタンをクリックする。
MIG_6_110502.png

次は、Add Constrainsだ。これも同様に、Next>ボタンをクリックする。
MIG_7_110502.png

FPGAを選択するダイアログが開く。xc3s700afg484-4 (Spartan-3A Starter Kit)を選択する。
MIG_8_110502.png

New Project Summaryが表示される。Finishボタンをクリックする。
MIG_9_110502.png

PlanAheadのプロジェクトが生成された。
MIG_10_110502.png

今日は用事があるので、ここまでとする。

なお、作成中の基板は、かなり難しいので、今回の企画の合間に悩みながら完成させようと思っている。
  1. 2011年05月02日 05:32 |
  2. MIG
  3. | トラックバック:0
  4. | コメント:0

ガリバー旅行記(映画)を見てきました

昨日は久しぶりにイーアスのムービックスでガリバー旅行記を見てきました。奥さんは仕事なので、中学1年生の娘と2人で観に行きました。微妙な映画でしたが、それなりに楽しめました。お気楽な感じです。
  1. 2011年05月01日 05:44 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0