aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_fpga/mem_fsm_tb.v
blob: 5c5029cb3e78ea534b5ae0b4c3980d91ed8c2963 (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
`default_nettype none
`define DUMPSTR(x) `"x.vcd`"
`timescale 10 ns / 100 ps

module mem_fsm_tb();

    reg clk, rst, start_read, start_write;
    reg [15:0] addr, data_in;
    wire done;
    wire [15:0] data_out;

    mem_fsm dut(
        .clk(clk),
        .addr(addr),
        .data_in(data_in),
        .start_read(start_read),
        .start_write(start_write),
        .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, mem_fsm_tb);

        clk = 0;
        rst = 0;
        start_read = 0;
        start_write = 0;
        #10

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

        #40
        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

        start_read = 0;
        start_write = 0;
        #10

        // test write
        addr = 16'd1;
        data_in = 16'hffff;
        start_read = 0;
        start_write = 1;

        #40
        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

        start_read = 0;
        start_write = 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