帰らざるMOS回路(29) Icarus Verilog、検証用テキストファイル出力

Joseph Halfmoon

前回はモジュールをパラメータ化して再利用しやすくしてみました。今回は、シミュレーション結果をテキストファイルに落として機械的な照合や回帰テストをしやすくしたいと思います。作成した回路を最初観察するときは波形ビューワー使っても、シミュレーションは何度も行うものなので結果確認は自動化しておかないと後が大変。

※フリーのVerilogの定番、Icarus Verilogの以下のバージョンで動作確認を行っております。

Icarus Verilog version 11.0 (devel) ()

ホームページが以下に。

Icarus Verilog

今回の被テストモジュール

今回は信号線のどこかに1が立っていたらそれをエンコードする回路を被テストモジュールとして使いたいと思います。ぶっちゃけ『お手軽ツールで今更学ぶアナログ第110回』で「フラッシュ型」ADコンバータの出力をエンコードするのに使っている回路をちょいとグレードアップ?したもの。

/** @file
    4to2 encoder
*/

`ifndef ENC4TO2_V_
`define ENC4TO2_V_

/** The 4to2 endocer module
    @param[in] IN [3:0] signal to be encoded.
    @param[out] OUT [1:0] encoded output
*/
module enc4to2(
    IN,
    OUT
);

input  [3:0] IN;
output [1:0] OUT;
reg    [1:0] OUT;

always @( IN )
begin
    case( IN )
        4'b0001: OUT <= 2'b00;
        4'b0010: OUT <= 2'b01;
        4'b0100: OUT <= 2'b10;
        4'b1000: OUT <= 2'b11;
        default: OUT <= 2'bxx;
    endcase
end

endmodule
`endif // ENC4TO2_V_
Verilogのファイル出力

さて今回の本題はテストベンチ側にあります。前回と似た(コピペで持ってきているので似ているのは当然かと)テストベンチのファイルですが、あちこち細かいところに「手を入れて」おります。

今回の目玉は末尾付近の initial 文のところです。被テスト回路(DUT)の入力と出力を「しかるべき」タイミングでファイルへダンプする部分です。なお「いつもの」、$monitorシステムタスクによる画面出力と波形ビューワー用のVCDファイルへの出力は以前と同様です。

/** @file
    enc4to2 Test bench
*/

`timescale 1 ns / 100 ps

module encoder_tb;

parameter CYCLE = 100;
parameter HALF_CYCLE = 50;
parameter DELAY1 = 10;
parameter DELAY2 = 90;
parameter MAXCYC = 6;

wire [1:0] BOUT;
reg CLK;
reg [3:0] BIN;
integer i;
integer fd;

enc4to2 dut(
    .IN(BIN), .OUT(BOUT)
);

initial begin
    $dumpfile("encoder_tb.vcd");
    $dumpvars(-1, dut);
    $monitor("%d IN=%b, OUT=%b", $stime, BIN, BOUT);
end

always begin
                CLK = 1'b1;
    #HALF_CYCLE CLK = 1'b0;
    #HALF_CYCLE;
end

// testbench actions
initial begin
    #DELAY1	BIN = 4'b0001;
    #CYCLE  BIN = 4'b0010;
    #CYCLE  BIN = 4'b0100;
    #CYCLE  BIN = 4'b1000;
    #CYCLE  BIN = 4'b1001;
    #CYCLE
    $finish;
end

// file output
initial begin
    fd = $fopen("encoder_tb.txt");
    #DELAY2;
    for (i=0; i<MAXCYC; i=i+1) begin
        $fdisplay( fd, "%b %b", BIN, BOUT);
        #CYCLE;
    end
    $fclose(fd);
end

endmodule //encoder_tb
実行結果

Icarus verilogのコマンドラインは以下です。

iverilog -o encoder_tb.out -yF:\pgm2\iverilog\vlib encoder_tb.v

vvpでシミュレーションしたときの画面出力($monitor)結果が以下に。

Monitor

今回追加したテキストファイル出力の内容が以下に。

TXTOUT

シミュレーション結果のテキストファイルを貯めておいて、ファイルコンペアかければ、差異があれば分かるので結果確認はらくちんと。

ううむ、すると初回の検証も完全人手ではなくある程度の自動化はしたいところですな。だんだんやること増えてる。。。

帰らざるMOS回路(28) Icarus Verilog、ライブラリのパラメータ化 へ戻る

帰らざるMOS回路(30) Icarus VerilogでCD4007をモデリング へ進む