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

テストモジュールの概要

テストの仕方

ツール(入力データ作成)[6]

ツール(期待値データ作成)[6]

ツール(データ比較)[6]

テストモジュールサンプル(RTL)

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

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

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

`timescale 1ps / 1ps

module test;

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

        parameter       D       = 1;
        parameter       DCLK    = 5000;
        parameter       DCLK2   = DCLK/2;

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

        reg             clk;

        reg             reset_n;

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

// -----------------------------------------------------------------------------
initial begin clk=0; forever begin #(DCLK2) clk=~clk; end end

// -----------------------------------------------------------------------------
initial begin reset_n=0; #D reset_n=0; #(DCLK*3.5) reset_n=1; end

// -----------------------------------------------------------------------------
top top_0 (
        clk, reset_n
        );

// ************************** FUNCTIONS and TASKS ******************************

endmodule

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

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

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

module top (
        clk,
        reset_n
        );

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

        input           clk;
        input           reset_n;

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

        parameter               N       = 1;            // Number of starting
        parameter               R       = 10;           // Radix of FFT

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

        reg                     iVld;
        wire                    iStall;
        reg     [7:0]           iCnt;
        wire    [7:0]           iCntD;

        wire                    oVld;
        reg                     oStall;
        reg     [7:0]           oCnt;

        wire                    mRdStrb;
        wire    [127:0]         mRdData;
        wire                    mWrStrb;
        wire    [127:0]         mWrData;

        reg     [1:0]           rst;
        reg                     reset;

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

// -----------------------------------------------------------------------------
// Drive
always @(posedge clk)
        if (reset)
                iVld    <= #1 1'b0;
        else if (!iVld | !iStall)
                iVld    <= #1 iCntD < N;

always @(posedge clk)
        if (reset)
                iCnt    <= #1 8'd0;
        else
                iCnt    <= #1 iCntD;

always @(posedge clk)
        if (reset)
                oStall  <= #1 1'b0;
        else
                oStall  <= #1 $random;

always @(posedge clk)
        if (reset)
                oCnt    <= #1 8'd0;
        else
                oCnt    <= #1 oCnt + (oVld & !oStall);

always @(posedge clk)
        if (oCnt >= N)
                $finish;

assign iCntD    = iCnt + (iVld & !iStall);

// -----------------------------------------------------------------------------
// Clock & Reset
always @(posedge clk or negedge reset_n)
        if (!reset_n)
                rst     <= #1 2'b11;
        else
                rst     <= #1 {rst[0], 1'b0};

always @(posedge clk or negedge reset_n)
        if (!reset_n)
                reset   <= #1 1'b1;
        else
                reset   <= #1 rst[1];

// -----------------------------------------------------------------------------
// FFT
fft #(10, R) fft_0 (
        .iVld                   (iVld),
        .iStall                 (iStall),
        .oVld                   (oVld),
        .oStall                 (oStall),
        .mRdStrb                (mRdStrb),
        .mRdAck                 (1'b1),
        .mRdData                (mRdData),
        .mWrStrb                (mWrStrb),
        .mWrAck                 (1'b1),
        .mWrData                (mWrData),
        .reset                  (reset),
        .clk                    (clk)
        );

// -----------------------------------------------------------------------------
// Loader
loader loader_0 (
        .strb                   (mRdStrb),
        .data                   (mRdData),
        .reset                  (reset),
        .clk                    (clk)
        );

// -----------------------------------------------------------------------------
// Store
store store_0 (
        .strb                   (mWrStrb),
        .data                   (mWrData),
        .reset                  (reset),
        .clk                    (clk)
        );

// **************************** FUNCTIONS and TASKS ****************************

endmodule

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

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

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

module loader (
        strb,
        data,
        reset,
        clk
        );

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

        input                   strb;
        output  [127:0]         data;
        input                   reset;
        input                   clk;

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

        reg     [9:0]           cnt;
        reg     [15:0]          rom[0:8191];

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

always @(posedge clk)
        if (reset)
                cnt             <= #1 10'd0;
        else
                cnt             <= #1 cnt + strb;

assign data             = {
                                rom[{cnt, 3'h7}],
                                rom[{cnt, 3'h6}],
                                rom[{cnt, 3'h5}],
                                rom[{cnt, 3'h4}],
                                rom[{cnt, 3'h3}],
                                rom[{cnt, 3'h2}],
                                rom[{cnt, 3'h1}],
                                rom[{cnt, 3'h0}]
                                };

// **************************** FUNCTIONS and TASKS ****************************

initial $readmemh("ins.hex", rom);

endmodule

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

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

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

module store (
        strb,
        data,
        reset,
        clk
        );

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

        input                   strb;
        input   [127:0]         data;
        input                   reset;
        input                   clk;

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

        reg     [9:0]           cnt;

        integer                 fp;

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

initial fp      = $fopen("outs.hex");

always @(posedge clk)
        if (reset)
                cnt             <= #1 10'd0;
        else
                cnt             <= #1 cnt + strb;

always @(posedge clk)
        if (strb) begin
                $fdisplay(fp, "%4h %4h", data[15:0], data[31:16]);
                $fdisplay(fp, "%4h %4h", data[47:32], data[63:48]);
                $fdisplay(fp, "%4h %4h", data[79:64], data[95:80]);
                $fdisplay(fp, "%4h %4h", data[111:96], data[127:112]);
        end

// **************************** FUNCTIONS and TASKS ****************************

endmodule

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

回路デザイン > 設計例 [FFT] > テスト    このページのTOP ▲

[1]
あまりスマートな方法ではないと思います。復帰検証など自動化したいので、シミュレータとCを呼び出すバッチを組みたいところです。
[2]
浮動小数点をそのままランダムなものにすると指数部もランダムになり、仮数部の計算結果の重みが小さくなります。例えば、100000+0.000001は計算結果に右辺の影響が現れず検証になりません。

ここではは1以下のランダムな固定小数点を作成し、浮動小数点に直して入力値を作ります。
[3]
別々のファイルに落とすか、まとめて落とすかして下さい。verilogシミュレータはfreeのものでもいいので手に入れましょう。
[4]
指数が比較的大きな値と小さな値の変数がある場合、大きな値の丸め誤差分は小さな値に多大な影響を与えます。小さな値に対する大きなSNRをどこまで許容するかは、残念ながら理論立て述べるまでには至っていません。
[5]
波形の目視確認は行いますが、自動的に性能を計測するアサーション等も場合によって使用します。
[6]
筆者らはC言語の基礎的な知識しかないので、かなり稚拙な書き方かもしれません。