37日目 ~半加算器のテストベンチ~
こんにちは!今日はデジタル回路の話題で更新します!
今回は、ついにこれまで作ってきた回路の検証に入っていきます。
まずは、小手調べに半加算器の検証を行ってみます。
↓半加算器の回
in-reality.hatenablog.com
確か、半加算器は足し算の基本回路の一つでしたね。
作りたい回路の真理値表は
となっていたはずです。なので、上の表をそのまま拝借して、
0_0_0_0
0_1_1_0
1_0_1_0
1_1_0_1
を入力と、その期待値として与えることにしました。ちなみに、名前はHalfAdder.dataにしています。
これを、下記のようにテストベンチに読み込ませて、回路シミュレータのmodelsimでコンパイル、実行させます。
`timescale 1ns/1ps `default_nettype none module HalfAdder_tb; reg a; reg b; wire Sum; wire Carry; reg sum_expected; reg carry_expected; HalfAdder U0 (.Sum(Sum), .Carry(Carry), .a(a), .b(b)); reg [3:0] testdata[0:3]; integer idx; //step数のカウント integer flag = 0; initial begin // ここでモジュールの出力を保存する $dumpfile("HalfAdder.vcd"); $dumpvars(0, U0); $readmemb("HalfAdder.data", testdata); for (idx = 0; idx < 4; idx = idx + 1) begin {a, b, sum_expected, carry_expected} = testdata[idx]; #10 if (Sum !== sum_expected || Carry !== carry_expected) begin $display("FAILED for test data #%d: %b\n", idx, testdata[idx]); flag = 1; end end if(!flag) begin $display("Succeeded!"); end $finish; end endmodule
回路の出力が期待値と一致していなかった場合、その部分が出力されるように記述しました。
また、すべて正しかった場合のみ、Succeeded!と表示し、達成感を与えてくれるようにしています。(ホントか?)
半加算器の回路はこれで検証できたので、.dataのフォーマットに従って様々な検証を行っていこうと思います。