ファイルI/Oを利用したテストベンチ / ハッシュ生成器 / リニアテストベンチ

stimulus、stimuliはテストベンチからDUVへ与える信号、値のこと。

pp.556-557
↓ 左がDUVに与えるメッセージ。右がDUVから出力されるであろう期待値。

hartj09sq7shh60gxrupgwy2jus9mizc 11100001001001011001100011100101
e6aifwgcyf42f8yucde5j4xdh1a3byu6 01110000010011011000001101110101
qpreydipz0u9g8q6xgj6l5e8otuybxru 10010010100100100001000111111010
otqnk1oj0csdpxlar49uaim0o48e3m5y 00110111001011101101100011110110
azi7ucov41g0nhtve2x50sx88i8eeymb 10010100101100111110000110111010
y0birz6zjhvib9rsd4uuqavpcd7p8mkw 01001101011000001101101010011111
3l80y48tfpsm5jq5jmnj8t27erd8onnv 10100111000111101111010101010101
fdu4daduvujr6ttrf1ecyavq02gmi5ey 01110011100111000110000100111011
oxaf7665xunyd36b2jb6fe0cck2kmy5c 01101001101101111001100100000011
bjwvsqt1x9aot0orrt4eckp5srg61zhh 11100001000111110000000000101111

↓ これがテストベンチ。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;

entity hash_calculator_tb is
end;

architecture testbench of hash_calculator_tb is
    constant DUV_DELAY: time := 10 ns;
    signal hash: std_logic_vector(31 downto 0);
    signal message: string(1 to 32);
begin
    duv: entity work.hash_calculator port map (
        message => message,
        hash => hash
    );

    test_controller: process
       -- golden_dataというファイルオブジェクトとして、目的の.txtファイルを読み取り専用モードで開く。
        file golden_data: text open read_mode is "golden.txt";
        
        variable current_line: line;
        variable message_golden: string(1 to 32);
        variable hash_golden: std_logic_vector(31 downto 0);
    begin
        while not endfile(golden_data) loop
           -- Read input vector and expected respose
           -- golden_dataオブジェクトから1行読んでcurrent_line変数に代入し、
            readline(golden_data, current_line);
           -- 1つ目のデータをmessage_golden変数に代入し、
            read(current_line, message_golden);
           -- 2つ目のデータをhash_golden変数に代入する。
            read(current_line, hash_golden);

           -- Apply stimuli
           -- 変換元のメッセージをDUVに与える。
            message <= message_golden;
            wait for DUV_DELAY;

           -- Check DUV response
           -- DUVの出力hashと期待値hash_goldenとを照合する。
            assert hash = hash_golden
                report "hash for message " & message_golden & " UNMATCHES golden output"
                severity failure;
            assert hash /= hash_golden
                report "hash for message " & message_golden & " MATCHES golden output"
                severity note;
        end loop;

        report "End of testbench. All tests passed.";
        std.env.finish;
    end process;
end;