FC2カウンター FPGAの部屋 Verilogでのシミュレーションの疑問(解決編)
fc2ブログ

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

FPGAの部屋

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

Verilogでのシミュレーションの疑問(解決編)

親切な方に教えていただいたおかげで、VerilogファイルをModelSimでシミュレーションする際にステートマシンのステート名をwaveウインドウで表示する方法がわかった。教えていただいてありがとうございます。
それは下のようにステートを判別してアスキー文字で表示する方法だ。信号をwaveウインドウに入れて右クリックからRadixをASCIIにするそうだ。

    parameter idle_init=10'b0000000001, pall1_init=10'b0000000010, emrs_dllena_init=10'b0000000100,
    mrs_dllrst_init=10'b0000001000, pall2_init=10'b0000010000, ref1_init=10'b0000100000, ref2_init=10'b0001000000,
    mrs_init=10'b0010000000, wait_init_end=10'b0100000000, init_end=10'b1000000000;
    parameter NOP=8'b00000001, ACT=8'b00000010, READ=8'b00000100, WRIT=8'b00001000, PALL=8'b00010000,
    MRS=8'b00100000, EMRS=8'b01000000, REF=8'b10000000;
    reg [9:0] n_init, c_init; // idle_init, etc...
    reg [7:0] n_state, c_state, b_state; // NOP, etc...
    
    parameter idle_dets=3'b001, write_dets=3'b010, wait_write1=3'b100;
    reg [2:0] ns_dets, cs_dets; // idle_dets



// synthesis translate_off

    reg [20*8:1] MAIN_STATE, INIT_STATE, STATE_DETS; 
    
    always @(c_state) begin
        case (c_state)
            NOP:        MAIN_STATE <= "NOP";
            ACT:        MAIN_STATE <= "ACT";
            READ:       MAIN_STATE <= "READ";
            WRIT:       MAIN_STATE <= "WRIT";
            PALL:       MAIN_STATE <= "PALL";
            MRS:        MAIN_STATE <= "MRS";
            EMRS:       MAIN_STATE <= "EMRS";
            default:    MAIN_STATE <= "REF"; 
        endcase
    end
    
    always @(c_init) begin
        case (c_init)
            idle_init:          INIT_STATE <= "IDLE_INIT";
            pall1_init:         INIT_STATE <= "PALL1_INIT";
            emrs_dllena_init:   INIT_STATE <= "EMRS_DLLENA_INIT";
            mrs_dllrst_init:    INIT_STATE <= "MRS_DLLRST_INIT";
            pall2_init:         INIT_STATE <= "PALL2_INIT";
            ref1_init:          INIT_STATE <= "REF1_INIT";
            ref2_init:          INIT_STATE <= "REF2_INIT";
            mrs_init:           INIT_STATE <= "MRS_INIT";
            wait_init_end:      INIT_STATE <= "WAIT_INIT_END";
            default:            INIT_STATE <= "INIT_END";
        endcase;
    end
    
    always @(cs_dets) begin
        case(cs_dets)
            idle_dets:  STATE_DETS <= "IDLE_DETS";
            write_dets: STATE_DETS <= "WRITE_DETS";
            default:    STATE_DETS <= "WAIT_WRITE1";
        endcase
    end

// synthesis translate_on


ModelSim_Verilog_060123.png


VHDLではステートをtype宣言していて値を直接指定しないのでModelSimでもステート名を表示するのだろう。たとえばこう定義してステートマシンを書く。

type initial_ddr_sdram is (idle_init, pall1_init, emrs_dllena_init, mrs_dllrst_init, pall2_init, ref1_init, ref2_init, mrs_init, wait_init_end, init_end);
type ddr_sdram_state is (NOP, ACT, READ, WRIT, PALL, MRS, EMRS, REF);
signal n_init, c_init : initial_ddr_sdram;
signal n_state, c_state, b_state : ddr_sdram_state;
type dqs_enable_timing_state is (idle_dets, write_dets, wait_write1);
signal ns_dets, cs_dets : dqs_enable_timing_state;


ModelSimでシミュレーションすると定義したステート名でwaveウインドウに表示される。
ModelSim_VHDL_060123.png


ステートマシンのステート名を表示することに慣れていると、表示できないとステートがわかりにくい。VHDLはステートマシンを書けばそのままステート名でModelSimのWaveウインドウに表示されるが、Verilogではわざわざ書かなくてはだめだ。この辺はVerilogは面倒だ。最終的にVHDL,Verilogどっちがメインで書くか迷ってきた。それぞれに良いところがあるし悪いところもある。
  1. 2007年01月23日 18:37 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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