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
|