|
1 | 1 | `include "svut_h.sv"
|
2 |
| -`include "../../src/vlog/async_fifo.v" |
3 | 2 | `timescale 1 ns / 1 ps
|
4 | 3 |
|
5 | 4 | module async_fifo_unit_test;
|
6 | 5 |
|
7 | 6 | `SVUT_SETUP
|
8 | 7 |
|
9 |
| - parameter WIDTH = 8; |
10 |
| - parameter POINTER = 4; |
| 8 | + integer i; |
11 | 9 |
|
12 |
| - reg wr_clk; |
13 |
| - reg wr_arstn; |
14 |
| - reg wr_en; |
15 |
| - reg [WIDTH-1:0] wr_data; |
16 |
| - wire wr_full; |
17 |
| - reg rd_clk; |
18 |
| - reg rd_arstn; |
19 |
| - reg rd_en; |
20 |
| - wire [WIDTH-1:0] rd_data; |
21 |
| - wire rd_empty; |
| 10 | + parameter DSIZE = 32; |
| 11 | + parameter ASIZE = 4; |
| 12 | + |
| 13 | + reg wclk; |
| 14 | + reg wrst_n; |
| 15 | + reg winc; |
| 16 | + reg [DSIZE-1:0] wdata; |
| 17 | + wire wfull; |
| 18 | + reg rclk; |
| 19 | + reg rrst_n; |
| 20 | + reg rinc; |
| 21 | + wire [DSIZE-1:0] rdata; |
| 22 | + wire rempty; |
22 | 23 |
|
23 | 24 | async_fifo
|
24 | 25 | #(
|
25 |
| - .WIDTH (WIDTH), |
26 |
| - .POINTER (POINTER) |
| 26 | + DSIZE, |
| 27 | + ASIZE |
27 | 28 | )
|
28 | 29 | dut
|
29 | 30 | (
|
30 |
| - wr_clk, |
31 |
| - wr_arstn, |
32 |
| - wr_en, |
33 |
| - wr_data, |
34 |
| - wr_full, |
35 |
| - rd_clk, |
36 |
| - rd_arstn, |
37 |
| - rd_en, |
38 |
| - rd_data, |
39 |
| - rd_empty |
| 31 | + wclk, |
| 32 | + wrst_n, |
| 33 | + winc, |
| 34 | + wdata, |
| 35 | + wfull, |
| 36 | + rclk, |
| 37 | + rrst_n, |
| 38 | + rinc, |
| 39 | + rdata, |
| 40 | + rempty |
40 | 41 | );
|
41 | 42 |
|
42 | 43 | // An example to create a clock
|
43 |
| - initial wr_clk = 0; |
44 |
| - initial rd_clk = 0; |
45 |
| - always #2 wr_clk = ~wr_clk; |
46 |
| - always #2 rd_clk = ~rd_clk; |
| 44 | + initial wclk = 1'b0; |
| 45 | + always #2 wclk <= ~wclk; |
| 46 | + initial rclk = 1'b0; |
| 47 | + always #3 rclk <= ~rclk; |
47 | 48 |
|
48 | 49 | // An example to dump data for visualization
|
49 | 50 | initial $dumpvars(0,async_fifo_unit_test);
|
50 | 51 |
|
51 | 52 | task setup();
|
52 | 53 | begin
|
53 |
| - #0; |
54 |
| - wr_arstn = 1; |
55 |
| - rd_arstn = 1; |
56 |
| - init_write(); |
57 |
| - init_read(); |
58 |
| - #50; |
59 |
| - wr_arstn = 1; |
60 |
| - rd_arstn = 1; |
| 54 | + wrst_n = 1'b0; |
| 55 | + winc = 1'b0; |
| 56 | + wdata = 0; |
| 57 | + rrst_n = 1'b0; |
| 58 | + rinc = 1'b0; |
| 59 | + #100; |
61 | 60 | end
|
62 | 61 | endtask
|
63 | 62 |
|
64 | 63 | task teardown();
|
65 | 64 | begin
|
66 |
| - #100; |
67 |
| - @(posedge wr_clk); |
68 |
| - @(posedge rd_clk); |
| 65 | + // teardown() runs when a test ends |
69 | 66 | end
|
70 | 67 | endtask
|
71 | 68 |
|
72 |
| - task init_write(); |
73 |
| - begin |
74 |
| - wr_arstn = 0; |
75 |
| - wr_en = 1'b0; |
76 |
| - wr_data = 0; |
77 |
| - end |
78 |
| - endtask |
| 69 | + `UNIT_TESTS |
79 | 70 |
|
80 |
| - task init_read(); |
81 |
| - begin |
82 |
| - rd_arstn = 0; |
83 |
| - rd_en = 1'b0; |
84 |
| - end |
85 |
| - endtask |
| 71 | + `UNIT_TEST(IDLE) |
| 72 | + `INFO("Start IDLE test"); |
| 73 | + wrst_n = 1; |
| 74 | + rrst_n = 1; |
| 75 | + #200; |
| 76 | + `FAIL_IF(wfull); |
| 77 | + `FAIL_IF(!rempty); |
| 78 | + `UNIT_TEST_END |
86 | 79 |
|
87 |
| - `UNIT_TESTS |
| 80 | + `UNIT_TEST(SIMPLE_WRITE_AND_READ) |
| 81 | + `INFO("Simple write then read"); |
| 82 | + wrst_n = 1; |
| 83 | + rrst_n = 1; |
| 84 | + #200; |
| 85 | + @(posedge wclk) |
| 86 | + winc = 1; |
| 87 | + wdata = 32'hA; |
| 88 | + @(posedge wclk) |
| 89 | + winc = 0; |
| 90 | + |
| 91 | + @(posedge rclk) |
| 92 | + wait (rempty == 0); |
| 93 | + `FAIL_IF_NOT_EQUAL(rdata, 32'hA); |
| 94 | + |
| 95 | + `UNIT_TEST_END |
88 | 96 |
|
89 |
| - `UNIT_TEST(INIT_FIFO) |
90 |
| - wait (wr_full == 1'b0); |
91 |
| - wait (rd_empty == 1'b0); |
| 97 | + `UNIT_TEST(MULTIPLE_WRITE_AND_READ) |
| 98 | + `INFO("Multiple write then read"); |
| 99 | + wrst_n = 1; |
| 100 | + rrst_n = 1; |
| 101 | + #200; |
| 102 | + for (i=0; i<20; i = i+1) begin |
| 103 | + @(posedge wclk) |
| 104 | + winc = 1; |
| 105 | + wdata = i; |
| 106 | + @(posedge wclk) |
| 107 | + winc = 0; |
| 108 | + |
| 109 | + @(posedge rclk) |
| 110 | + wait (rempty == 0); |
| 111 | + `FAIL_IF_NOT_EQUAL(rdata, i); |
| 112 | + end |
92 | 113 | `UNIT_TEST_END
|
93 | 114 |
|
| 115 | + `UNIT_TEST(TEST_FULL_FLAG) |
| 116 | + `INFO("Test full flag test"); |
| 117 | + wrst_n = 1; |
| 118 | + rrst_n = 1; |
| 119 | + #200; |
| 120 | + @(posedge wclk) |
| 121 | + for (i=0; i<2**ASIZE; i = i+1) begin |
| 122 | + @(posedge wclk) |
| 123 | + winc = 1; |
| 124 | + wdata = i; |
| 125 | + `FAIL_IF_NOT_EQUAL(wfull, 1); |
| 126 | + end |
| 127 | + @(posedge wclk) |
| 128 | + #50; |
| 129 | + `UNIT_TEST_END |
| 130 | + |
| 131 | + `UNIT_TEST(TEST_EMPTY_FLAG) |
| 132 | + `INFO("Test empty flag test"); |
| 133 | + wrst_n = 1; |
| 134 | + rrst_n = 1; |
| 135 | + #200; |
| 136 | + @(posedge wclk) |
| 137 | + for (i=0; i<2**ASIZE; i = i+1) begin |
| 138 | + @(posedge wclk) |
| 139 | + winc = 1; |
| 140 | + wdata = i; |
| 141 | + `FAIL_IF_NOT_EQUAL(wfull, 1); |
| 142 | + end |
| 143 | + @(posedge wclk) |
| 144 | + #50; |
| 145 | + `UNIT_TEST_END |
94 | 146 | `UNIT_TESTS_END
|
95 | 147 |
|
96 | 148 | endmodule
|
|
0 commit comments