論理回路デザイン
ArchiTek home page
テストの考え方と流れ

masterモジュールサンプル(RTL)

/* **************************** MODULE PREAMBLE ********************************

        Copyright (c) 2012, ArchiTek
        This document constitutes confidential and proprietary information
        of ArchiTek. All rights reserved.
*/

// ***************************** MODULE HEADER *********************************

module master (
        req, gnt, rxw, addr,
        wrStrb, wrAck, wrFlush, wrData, wrMask,
        rdStrb, rdAck, rdFlush, rdData,
        omit, exec, error,
        reset, clk
        );

// ************************ PARAMETER DECLARATIONS *****************************

        // topモジュールで再設定可能
        parameter               PAM     = 32'hffffffff;

        // バスの語長とバースト長、topモジュールで再設定可能
        parameter               NLR     = 2;            // Word Length Radix
        parameter               BLR     = 2;            // Burst Length Radix

        parameter               NL      = 1<<NLR;
        parameter               NBL     = 8<<NLR;

// ***************************** I/O DECLARATIONS ******************************

        // Requestパス
        output                  req;
        input                   gnt;
        output                  rxw;
        output  [31:0]          addr;

        // Write Dataパス
        output                  wrStrb;
        input                   wrAck;
        input                   wrFlush;
        output  [NBL-1:0]       wrData;
        output  [NL-1:0]        wrMask;

        // Read Dataパス
        output                  rdStrb;
        input                   rdAck;
        input                   rdFlush;
        input   [NBL-1:0]       rdData;

        input                   omit;

        input                   reset;
        input                   clk;

        // 実行動作中およびエラーを表示するLED出力
        output  [5:0]           exec;                   // execution LED
        output                  error;                  // diff error LED

// ************************** LOCAL DECLARATIONS *******************************

        reg                     req;
        reg                     rxw;
        reg     [31:0]          addr;

        // データマスクなし
        reg     [NBL-1:0]       wrData;
        wire    [NL-1:0]        wrMask          = {NL{1'b0}};

        // ライトストローブは常時有効
        wire                    wrStrb          = 1'b1;
        wire                    wrAlloc         = wrStrb & wrAck;

        // リードストローブも常時有効
        wire                    rdStrb          = 1'b1;
        wire                    rdAlloc         = rdStrb & rdAck;

        wire                    alloc           = req & gnt;

        reg     [NBL-1:0]       rdExp;
        wire                    diff;
        reg     [16:0]          rdCount;
        reg     [5:0]           exec;
        reg                     error;

// ******************************** MODULE BODY ********************************

// -----------------------------------------------------------------------------
// Req
always @(posedge clk)
        if (reset)
                req             <= #1 1'b0;
        else    req             <= #1 !omit & (addr <= PAM);

// アドレスインクリメント
always @(posedge clk)
        if (reset)
                addr            <= #1 32'd0;
        else if (alloc)
                addr            <= #1 (addr + (1<<BLR+NLR)) & PAM;

// アドレス上限までのライト/リード繰り返し
always @(posedge clk)
        if (reset)
                rxw             <= #1 1'b0;
        else if (gnt & (addr[31:BLR+NLR] == PAM[31:BLR+NLR]))
                rxw             <= #1 !rxw;

// -----------------------------------------------------------------------------
// Write Data Generate
// デバイスのデータバス幅に応じたライトインクリメントデータ作成
always @(posedge clk)
        if (reset)
                wrData          <= #1 {NBL{1'b0}};
        else if (wrAlloc)
                wrData          <= #1 wrData + {{NBL-1{1'b0}},1'b1};

// データマスクなし
/*
// Write Mask Generate
always @(posedge clk)
        if (reset)
                wrMask          <= #1 {NL{1'b0}};
        else if (wrAlloc)
                wrMask          <= #1 wrMask + {{NL-1{1'b0}},1'b1};
*/
// -----------------------------------------------------------------------------
// Read Expect Data Generate
// デバイスのデータバス幅に応じた期待値インクリメントデータ作成
always @(posedge clk)
        if (reset)
                rdExp           <= #1 {NBL{1'b0}};
        else if (rdAlloc)
                rdExp           <= #1 rdExp + {{NBL-1{1'b0}},1'b1};

// -----------------------------------------------------------------------------
// Read Check
// リードデータと期待値データの相違時error LED出力点灯
always @(posedge clk)
        if (!reset)
                error           <= #1 1'b0;
        else if (diff)
                error           <= #1 1'b1;                   // diff error

// Read Count (1Gbit DDR3 device)
always @(posedge clk)
        if (reset)
                rdCount         <= #1 17'd0;
        else if (rdData[7:0] == 8'hfe)
                rdCount         <= #1 rdCount + {16'b0,1'b1};

// 実行動作中、LED出力ローテーション点灯
// Execution Check
always @(posedge clk)
        if (reset)
                exec            <= #1 6'd0;
        else begin
        casex (rdCount[16:15])
                2'b00: exec     <= #1 6'b000010;
                2'b01: exec     <= #1 6'b000100;
                2'b10: exec     <= #1 6'b001000;
                2'b11: exec     <= #1 6'b010000;
        endcase
        end

// リードデータと期待値データを比較
assign diff             = rdAlloc & !omit & (rdData != rdExp);

endmodule

// *****************************************************************************
        

DDRの初期化とリフレッシュ

Initial flow

テストの開始と検証手順

テスト結果と測定波形

回路デザイン > 設計例 [DDR制御(実装)] > 動作検証1    次のページ(動作検証2)   このページのTOP ▲

[1]
メモリテストには、データに0x55、0xaaを使用する方法、ウォーキングテスト、ギャロッピングテストなどがありますが、今回は工数削減のためマーチングテストのみと簡略化しています。
[2]
ISE設計ツールのHierarchyウインドウでクロックIPコアのアイコンをダブルクリックするとウィザード画面が起動して再設定が可能になります。
[3]
xxx.cdcファイルとして作成しプロジェクトに追加します。詳細はChipScope Proユーザーガイドの第3章「ISE Project NavigatorでのCore Inserterの使用」を参照して下さい。
[4]
DDR制御(論理)編ではDDRデバイスにVerilogモデルファイルを使用して一体型で構成していたのでリードサイクルも通常通り波形確認できましたが、今回実機モデルでメモリデバイスは外部に分離されているので、デバイスからのDDR I/F入力信号に依存するリードアクセスに関しては実動作のみで確認を行います。