Make/Day

毎日なにか作ります

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のフォーマットに従って様々な検証を行っていこうと思います。