aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_fpga/bram_fsm_tb.v
blob: 1ec5a88790d37e5d9aafb71f45e0bf21022c70fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
`default_nettype none
`define DUMPSTR(x) `"x.vcd`"
`timescale 10 ns / 100 ps

module bram_fsm_tb();

    reg clk, rst, read_en, write_en;
    reg [15:0] addr, data_in;
    wire done;
    wire [15:0] data_out;

    bram_fsm dut(
        .clk(clk),
        .addr(addr),
        .data_in(data_in),
        .read_en(read_en),
        .write_en(write_en),
        .data_out(data_out),
        .done(done)
    );

    // Clock generation
    always #5 clk = ~clk;  // 100 MHz clock

    reg failed;
    initial begin
        failed = 0;
        $dumpfile(`DUMPSTR(`VCD_OUTPUT));
        $dumpvars(0, bram_fsm_tb);

        clk = 0;
        rst = 0;
        read_en = 0;
        write_en = 0;
        #10

        // test read
        dut.bram_inst.mem[0] = 16'hffff;
        addr = 16'd0;
        read_en = 1;
        write_en = 0;

        while (!done) #10;

        if (data_out == 16'hffff && done == 1) begin
            $display("\033[0;32m[PASS]\033[0m Read: data is available and done is 1 as expected");
        end else begin
            $display("\033[0;31m[FAIL]\033[0m Read: done is %d (expected 1), data is %04h (expected ffff)", done, data_out);
            failed = 1;
        end

        read_en = 0;
        write_en = 0;
        #10

        // test write
        addr = 16'd1;
        data_in = 16'hffff;
        read_en = 0;
        write_en = 1;

        while (!done) #10;

        if (dut.bram_inst.mem[1] == 16'hffff && done == 1) begin
            $display("\033[0;32m[PASS]\033[0m Write: data is available and done is 1 as expected");
        end else begin
            $display("\033[0;31m[FAIL]\033[0m Write: done is %d (expected 0), data is %04h (expected FFFF)", done, data_out);
            failed = 1;
        end

        read_en = 0;
        write_en = 0;

        #5
        if (failed) begin
            $display("🛑 \033[0;31mTest suite failed\033[0m");
            $fatal(1);
        end else
            $display("✅ \033[0;32mTest suite passed\033[0m");

        $finish;
    end

endmodule