Przeglądaj źródła

Initial commit, adds a simple FIFO and a naive and low coverage testbench.

Matt Coles 8 lat temu
commit
28188be241
6 zmienionych plików z 995 dodań i 0 usunięć
  1. 2 0
      build
  2. 104 0
      fifo_tb.v
  3. 372 0
      out/sim
  4. 457 0
      out/waves.vcd
  5. 59 0
      simple_fifo.v
  6. 1 0
      test

+ 2 - 0
build

@@ -0,0 +1,2 @@
1
+mkdir -p out
2
+iverilog -o out/sim simple_fifo.v fifo_tb.v

+ 104 - 0
fifo_tb.v

@@ -0,0 +1,104 @@
1
+module fifo_tb;
2
+
3
+reg reset_n;
4
+reg [15:0] data_in;
5
+wire [15:0] data_out;
6
+wire full, empty;
7
+reg fifo_push, fifo_pop, clk;
8
+
9
+simple_fifo dut (
10
+  .clk(clk),
11
+  .reset_n(reset_n),
12
+  .push(fifo_push),
13
+  .pop(fifo_pop),
14
+
15
+  .data_in(data_in),
16
+  .data_out(data_out),
17
+
18
+  .full(full),
19
+  .empty(empty)
20
+);
21
+
22
+initial begin
23
+  clk = 1'b0;
24
+  reset_n = 1'b1;
25
+  repeat(4) #10 clk = ~clk;
26
+  reset_n = 1'b0;
27
+  forever #10 clk = ~clk; // generate a clock
28
+end
29
+
30
+reg [15:0] tmp;
31
+initial begin
32
+  data_in = 16'h0; // initial value
33
+  @(negedge reset_n); // wait for reset
34
+  data_in = 16'hffff;
35
+  repeat (8) begin
36
+    @(posedge clk);
37
+    fifo_push = 1'b1;
38
+    @(negedge clk);
39
+    fifo_push = 1'b0;
40
+    data_in = ~data_in;
41
+  end
42
+  if (full != 1 && empty != 0) begin
43
+    $display("Test failed!");
44
+  end
45
+  tmp = 16'hffff;
46
+  repeat (8) begin
47
+    @(posedge clk);
48
+    fifo_pop = 1'b1;
49
+    @(negedge clk);
50
+    fifo_pop = 1'b0;
51
+    if (data_out !== tmp) begin
52
+      $display("Test failed!");
53
+    end
54
+    tmp = ~tmp;
55
+  end
56
+  if (full != 0 && empty != 1) begin
57
+    $display("Test failed!");
58
+  end
59
+  repeat(5) @(posedge clk); //if this delay is odd it fails wtf?
60
+  data_in = 16'h1234;
61
+  repeat (8) begin
62
+    @(posedge clk);
63
+    fifo_push = 1'b1;
64
+    @(negedge clk);
65
+    fifo_push = 1'b0;
66
+    data_in = ~data_in;
67
+  end
68
+  if (full != 1 && empty != 0) begin
69
+    $display("Test failed!");
70
+  end
71
+  tmp = 16'h1234;
72
+  repeat (8) begin
73
+    @(posedge clk);
74
+    fifo_pop = 1'b1;
75
+    @(negedge clk);
76
+    fifo_pop = 1'b0;
77
+    if (data_out !== tmp) begin
78
+      $display("Test failed!");
79
+    end
80
+    tmp = ~tmp;
81
+  end
82
+  if (full != 0 && empty != 1) begin
83
+    $display("Test failed!");
84
+  end
85
+  $finish;
86
+end
87
+
88
+initial begin
89
+  if ($test$plusargs("waves=1") != 0) begin
90
+    $dumpfile("out/waves.vcd");
91
+    $dumpvars(0, fifo_tb);
92
+    if ($test$plusargs("dump_fifo=1") != 0) begin
93
+      $dumpvars(0, dut.data[0]);
94
+      $dumpvars(0, dut.data[1]);
95
+      $dumpvars(0, dut.data[2]);
96
+      $dumpvars(0, dut.data[3]);
97
+      $dumpvars(0, dut.data[4]);
98
+      $dumpvars(0, dut.data[5]);
99
+      $dumpvars(0, dut.data[6]);
100
+      $dumpvars(0, dut.data[7]);
101
+    end
102
+  end
103
+end
104
+endmodule

+ 372 - 0
out/sim

@@ -0,0 +1,372 @@
1
+#! /usr/local/Cellar/icarus-verilog/10.1.1/bin/vvp
2
+:ivl_version "10.1 (stable)" "(v10_1_1)";
3
+:ivl_delay_selection "TYPICAL";
4
+:vpi_time_precision + 0;
5
+:vpi_module "system";
6
+:vpi_module "vhdl_sys";
7
+:vpi_module "v2005_math";
8
+:vpi_module "va_math";
9
+S_0x7fa2f94081a0 .scope module, "fifo_tb" "fifo_tb" 2 1;
10
+ .timescale 0 0;
11
+v0x7fa2f942c150_0 .var "clk", 0 0;
12
+v0x7fa2f942c210_0 .var "data_in", 15 0;
13
+v0x7fa2f942c2a0_0 .net "data_out", 15 0, v0x7fa2f942bb50_0;  1 drivers
14
+v0x7fa2f942c350_0 .net "empty", 0 0, v0x7fa2f942bbe0_0;  1 drivers
15
+v0x7fa2f942c400_0 .var "fifo_pop", 0 0;
16
+v0x7fa2f942c4d0_0 .var "fifo_push", 0 0;
17
+v0x7fa2f942c560_0 .net "full", 0 0, v0x7fa2f942bcb0_0;  1 drivers
18
+v0x7fa2f942c610_0 .var "reset_n", 0 0;
19
+v0x7fa2f942c6c0_0 .var "tmp", 15 0;
20
+E_0x7fa2f9415f70 .event negedge, v0x7fa2f9417170_0;
21
+E_0x7fa2f9415e20 .event negedge, v0x7fa2f942bf80_0;
22
+S_0x7fa2f941c480 .scope module, "dut" "simple_fifo" 2 9, 3 4 0, S_0x7fa2f94081a0;
23
+ .timescale 0 0;
24
+    .port_info 0 /INPUT 1 "clk"
25
+    .port_info 1 /INPUT 1 "reset_n"
26
+    .port_info 2 /INPUT 1 "push"
27
+    .port_info 3 /INPUT 1 "pop"
28
+    .port_info 4 /INPUT 16 "data_in"
29
+    .port_info 5 /OUTPUT 16 "data_out"
30
+    .port_info 6 /OUTPUT 1 "full"
31
+    .port_info 7 /OUTPUT 1 "empty"
32
+P_0x7fa2f9403670 .param/l "DEPTH" 0 3 5, +C4<00000000000000000000000000001000>;
33
+P_0x7fa2f94036b0 .param/l "WIDTH" 0 3 6, +C4<00000000000000000000000000010000>;
34
+v0x7fa2f9417170_0 .net "clk", 0 0, v0x7fa2f942c150_0;  1 drivers
35
+v0x7fa2f942ba20 .array "data", 0 7, 15 0;
36
+v0x7fa2f942bac0_0 .net "data_in", 15 0, v0x7fa2f942c210_0;  1 drivers
37
+v0x7fa2f942bb50_0 .var "data_out", 15 0;
38
+v0x7fa2f942bbe0_0 .var "empty", 0 0;
39
+v0x7fa2f942bcb0_0 .var "full", 0 0;
40
+v0x7fa2f942bd40_0 .net "pop", 0 0, v0x7fa2f942c400_0;  1 drivers
41
+v0x7fa2f942bdd0_0 .net "push", 0 0, v0x7fa2f942c4d0_0;  1 drivers
42
+v0x7fa2f942be70_0 .var "rd_ptr", 2 0;
43
+v0x7fa2f942bf80_0 .net "reset_n", 0 0, v0x7fa2f942c610_0;  1 drivers
44
+v0x7fa2f942c020_0 .var "wr_ptr", 2 0;
45
+E_0x7fa2f9416e90 .event posedge, v0x7fa2f9417170_0;
46
+    .scope S_0x7fa2f941c480;
47
+T_0 ;
48
+    %wait E_0x7fa2f9416e90;
49
+    %load/vec4 v0x7fa2f942bf80_0;
50
+    %flag_set/vec4 8;
51
+    %jmp/0xz  T_0.0, 8;
52
+    %pushi/vec4 0, 0, 3;
53
+    %assign/vec4 v0x7fa2f942be70_0, 0;
54
+    %pushi/vec4 0, 0, 3;
55
+    %assign/vec4 v0x7fa2f942c020_0, 0;
56
+    %pushi/vec4 0, 0, 1;
57
+    %assign/vec4 v0x7fa2f942bcb0_0, 0;
58
+    %pushi/vec4 1, 0, 1;
59
+    %assign/vec4 v0x7fa2f942bbe0_0, 0;
60
+    %jmp T_0.1;
61
+T_0.0 ;
62
+    %load/vec4 v0x7fa2f942bdd0_0;
63
+    %load/vec4 v0x7fa2f942bcb0_0;
64
+    %inv;
65
+    %and;
66
+    %flag_set/vec4 8;
67
+    %jmp/0xz  T_0.2, 8;
68
+    %load/vec4 v0x7fa2f942bac0_0;
69
+    %load/vec4 v0x7fa2f942c020_0;
70
+    %pad/u 5;
71
+    %ix/vec4 3;
72
+    %ix/load 4, 0, 0; Constant delay
73
+    %assign/vec4/a/d v0x7fa2f942ba20, 0, 4;
74
+    %load/vec4 v0x7fa2f942c020_0;
75
+    %addi 1, 0, 3;
76
+    %store/vec4 v0x7fa2f942c020_0, 0, 3;
77
+    %load/vec4 v0x7fa2f942c020_0;
78
+    %load/vec4 v0x7fa2f942be70_0;
79
+    %cmp/e;
80
+    %jmp/0xz  T_0.4, 4;
81
+    %pushi/vec4 1, 0, 1;
82
+    %assign/vec4 v0x7fa2f942bcb0_0, 0;
83
+    %pushi/vec4 0, 0, 1;
84
+    %assign/vec4 v0x7fa2f942bbe0_0, 0;
85
+    %jmp T_0.5;
86
+T_0.4 ;
87
+    %pushi/vec4 0, 0, 1;
88
+    %assign/vec4 v0x7fa2f942bcb0_0, 0;
89
+    %pushi/vec4 0, 0, 1;
90
+    %assign/vec4 v0x7fa2f942bbe0_0, 0;
91
+T_0.5 ;
92
+T_0.2 ;
93
+    %load/vec4 v0x7fa2f942bd40_0;
94
+    %load/vec4 v0x7fa2f942bbe0_0;
95
+    %inv;
96
+    %and;
97
+    %flag_set/vec4 8;
98
+    %jmp/0xz  T_0.6, 8;
99
+    %load/vec4 v0x7fa2f942be70_0;
100
+    %pad/u 5;
101
+    %ix/vec4 4;
102
+    %load/vec4a v0x7fa2f942ba20, 4;
103
+    %assign/vec4 v0x7fa2f942bb50_0, 0;
104
+    %load/vec4 v0x7fa2f942be70_0;
105
+    %addi 1, 0, 3;
106
+    %store/vec4 v0x7fa2f942be70_0, 0, 3;
107
+    %load/vec4 v0x7fa2f942c020_0;
108
+    %load/vec4 v0x7fa2f942be70_0;
109
+    %cmp/e;
110
+    %jmp/0xz  T_0.8, 4;
111
+    %pushi/vec4 0, 0, 1;
112
+    %assign/vec4 v0x7fa2f942bcb0_0, 0;
113
+    %pushi/vec4 1, 0, 1;
114
+    %assign/vec4 v0x7fa2f942bbe0_0, 0;
115
+    %jmp T_0.9;
116
+T_0.8 ;
117
+    %pushi/vec4 0, 0, 1;
118
+    %assign/vec4 v0x7fa2f942bcb0_0, 0;
119
+    %pushi/vec4 0, 0, 1;
120
+    %assign/vec4 v0x7fa2f942bbe0_0, 0;
121
+T_0.9 ;
122
+T_0.6 ;
123
+T_0.1 ;
124
+    %jmp T_0;
125
+    .thread T_0;
126
+    .scope S_0x7fa2f94081a0;
127
+T_1 ;
128
+    %pushi/vec4 0, 0, 1;
129
+    %store/vec4 v0x7fa2f942c150_0, 0, 1;
130
+    %pushi/vec4 1, 0, 1;
131
+    %store/vec4 v0x7fa2f942c610_0, 0, 1;
132
+    %pushi/vec4 4, 0, 32;
133
+T_1.0 %dup/vec4;
134
+    %pushi/vec4 0, 0, 32;
135
+    %cmp/s;
136
+    %jmp/1xz T_1.1, 5;
137
+    %jmp/1 T_1.1, 4;
138
+    %pushi/vec4 1, 0, 32;
139
+    %sub;
140
+    %delay 10, 0;
141
+    %load/vec4 v0x7fa2f942c150_0;
142
+    %inv;
143
+    %store/vec4 v0x7fa2f942c150_0, 0, 1;
144
+    %jmp T_1.0;
145
+T_1.1 ;
146
+    %pop/vec4 1;
147
+    %pushi/vec4 0, 0, 1;
148
+    %store/vec4 v0x7fa2f942c610_0, 0, 1;
149
+T_1.2 ;
150
+    %delay 10, 0;
151
+    %load/vec4 v0x7fa2f942c150_0;
152
+    %inv;
153
+    %store/vec4 v0x7fa2f942c150_0, 0, 1;
154
+    %jmp T_1.2;
155
+    %end;
156
+    .thread T_1;
157
+    .scope S_0x7fa2f94081a0;
158
+T_2 ;
159
+    %pushi/vec4 0, 0, 16;
160
+    %store/vec4 v0x7fa2f942c210_0, 0, 16;
161
+    %wait E_0x7fa2f9415e20;
162
+    %pushi/vec4 65535, 0, 16;
163
+    %store/vec4 v0x7fa2f942c210_0, 0, 16;
164
+    %pushi/vec4 8, 0, 32;
165
+T_2.0 %dup/vec4;
166
+    %pushi/vec4 0, 0, 32;
167
+    %cmp/s;
168
+    %jmp/1xz T_2.1, 5;
169
+    %jmp/1 T_2.1, 4;
170
+    %pushi/vec4 1, 0, 32;
171
+    %sub;
172
+    %wait E_0x7fa2f9416e90;
173
+    %pushi/vec4 1, 0, 1;
174
+    %store/vec4 v0x7fa2f942c4d0_0, 0, 1;
175
+    %wait E_0x7fa2f9415f70;
176
+    %pushi/vec4 0, 0, 1;
177
+    %store/vec4 v0x7fa2f942c4d0_0, 0, 1;
178
+    %load/vec4 v0x7fa2f942c210_0;
179
+    %inv;
180
+    %store/vec4 v0x7fa2f942c210_0, 0, 16;
181
+    %jmp T_2.0;
182
+T_2.1 ;
183
+    %pop/vec4 1;
184
+    %load/vec4 v0x7fa2f942c560_0;
185
+    %pad/u 32;
186
+    %pushi/vec4 1, 0, 32;
187
+    %cmp/e;
188
+    %flag_get/vec4 4;
189
+    %inv;
190
+    %load/vec4 v0x7fa2f942c350_0;
191
+    %pad/u 32;
192
+    %pushi/vec4 0, 0, 32;
193
+    %cmp/e;
194
+    %flag_get/vec4 4;
195
+    %inv;
196
+    %and;
197
+    %flag_set/vec4 8;
198
+    %jmp/0xz  T_2.2, 8;
199
+    %vpi_call 2 43 "$display", "Test failed!" {0 0 0};
200
+T_2.2 ;
201
+    %pushi/vec4 65535, 0, 16;
202
+    %store/vec4 v0x7fa2f942c6c0_0, 0, 16;
203
+    %pushi/vec4 8, 0, 32;
204
+T_2.4 %dup/vec4;
205
+    %pushi/vec4 0, 0, 32;
206
+    %cmp/s;
207
+    %jmp/1xz T_2.5, 5;
208
+    %jmp/1 T_2.5, 4;
209
+    %pushi/vec4 1, 0, 32;
210
+    %sub;
211
+    %wait E_0x7fa2f9416e90;
212
+    %pushi/vec4 1, 0, 1;
213
+    %store/vec4 v0x7fa2f942c400_0, 0, 1;
214
+    %wait E_0x7fa2f9415f70;
215
+    %pushi/vec4 0, 0, 1;
216
+    %store/vec4 v0x7fa2f942c400_0, 0, 1;
217
+    %load/vec4 v0x7fa2f942c2a0_0;
218
+    %load/vec4 v0x7fa2f942c6c0_0;
219
+    %cmp/ne;
220
+    %jmp/0xz  T_2.6, 6;
221
+    %vpi_call 2 52 "$display", "Test failed!" {0 0 0};
222
+T_2.6 ;
223
+    %load/vec4 v0x7fa2f942c6c0_0;
224
+    %inv;
225
+    %store/vec4 v0x7fa2f942c6c0_0, 0, 16;
226
+    %jmp T_2.4;
227
+T_2.5 ;
228
+    %pop/vec4 1;
229
+    %load/vec4 v0x7fa2f942c560_0;
230
+    %pad/u 32;
231
+    %pushi/vec4 0, 0, 32;
232
+    %cmp/e;
233
+    %flag_get/vec4 4;
234
+    %inv;
235
+    %load/vec4 v0x7fa2f942c350_0;
236
+    %pad/u 32;
237
+    %pushi/vec4 1, 0, 32;
238
+    %cmp/e;
239
+    %flag_get/vec4 4;
240
+    %inv;
241
+    %and;
242
+    %flag_set/vec4 8;
243
+    %jmp/0xz  T_2.8, 8;
244
+    %vpi_call 2 57 "$display", "Test failed!" {0 0 0};
245
+T_2.8 ;
246
+    %pushi/vec4 5, 0, 32;
247
+T_2.10 %dup/vec4;
248
+    %pushi/vec4 0, 0, 32;
249
+    %cmp/s;
250
+    %jmp/1xz T_2.11, 5;
251
+    %jmp/1 T_2.11, 4;
252
+    %pushi/vec4 1, 0, 32;
253
+    %sub;
254
+    %wait E_0x7fa2f9416e90;
255
+    %jmp T_2.10;
256
+T_2.11 ;
257
+    %pop/vec4 1;
258
+    %pushi/vec4 4660, 0, 16;
259
+    %store/vec4 v0x7fa2f942c210_0, 0, 16;
260
+    %pushi/vec4 8, 0, 32;
261
+T_2.12 %dup/vec4;
262
+    %pushi/vec4 0, 0, 32;
263
+    %cmp/s;
264
+    %jmp/1xz T_2.13, 5;
265
+    %jmp/1 T_2.13, 4;
266
+    %pushi/vec4 1, 0, 32;
267
+    %sub;
268
+    %wait E_0x7fa2f9416e90;
269
+    %pushi/vec4 1, 0, 1;
270
+    %store/vec4 v0x7fa2f942c4d0_0, 0, 1;
271
+    %wait E_0x7fa2f9415f70;
272
+    %pushi/vec4 0, 0, 1;
273
+    %store/vec4 v0x7fa2f942c4d0_0, 0, 1;
274
+    %load/vec4 v0x7fa2f942c210_0;
275
+    %inv;
276
+    %store/vec4 v0x7fa2f942c210_0, 0, 16;
277
+    %jmp T_2.12;
278
+T_2.13 ;
279
+    %pop/vec4 1;
280
+    %load/vec4 v0x7fa2f942c560_0;
281
+    %pad/u 32;
282
+    %pushi/vec4 1, 0, 32;
283
+    %cmp/e;
284
+    %flag_get/vec4 4;
285
+    %inv;
286
+    %load/vec4 v0x7fa2f942c350_0;
287
+    %pad/u 32;
288
+    %pushi/vec4 0, 0, 32;
289
+    %cmp/e;
290
+    %flag_get/vec4 4;
291
+    %inv;
292
+    %and;
293
+    %flag_set/vec4 8;
294
+    %jmp/0xz  T_2.14, 8;
295
+    %vpi_call 2 69 "$display", "Test failed!" {0 0 0};
296
+T_2.14 ;
297
+    %pushi/vec4 4660, 0, 16;
298
+    %store/vec4 v0x7fa2f942c6c0_0, 0, 16;
299
+    %pushi/vec4 8, 0, 32;
300
+T_2.16 %dup/vec4;
301
+    %pushi/vec4 0, 0, 32;
302
+    %cmp/s;
303
+    %jmp/1xz T_2.17, 5;
304
+    %jmp/1 T_2.17, 4;
305
+    %pushi/vec4 1, 0, 32;
306
+    %sub;
307
+    %wait E_0x7fa2f9416e90;
308
+    %pushi/vec4 1, 0, 1;
309
+    %store/vec4 v0x7fa2f942c400_0, 0, 1;
310
+    %wait E_0x7fa2f9415f70;
311
+    %pushi/vec4 0, 0, 1;
312
+    %store/vec4 v0x7fa2f942c400_0, 0, 1;
313
+    %load/vec4 v0x7fa2f942c2a0_0;
314
+    %load/vec4 v0x7fa2f942c6c0_0;
315
+    %cmp/ne;
316
+    %jmp/0xz  T_2.18, 6;
317
+    %vpi_call 2 78 "$display", "Test failed!" {0 0 0};
318
+T_2.18 ;
319
+    %load/vec4 v0x7fa2f942c6c0_0;
320
+    %inv;
321
+    %store/vec4 v0x7fa2f942c6c0_0, 0, 16;
322
+    %jmp T_2.16;
323
+T_2.17 ;
324
+    %pop/vec4 1;
325
+    %load/vec4 v0x7fa2f942c560_0;
326
+    %pad/u 32;
327
+    %pushi/vec4 0, 0, 32;
328
+    %cmp/e;
329
+    %flag_get/vec4 4;
330
+    %inv;
331
+    %load/vec4 v0x7fa2f942c350_0;
332
+    %pad/u 32;
333
+    %pushi/vec4 1, 0, 32;
334
+    %cmp/e;
335
+    %flag_get/vec4 4;
336
+    %inv;
337
+    %and;
338
+    %flag_set/vec4 8;
339
+    %jmp/0xz  T_2.20, 8;
340
+    %vpi_call 2 83 "$display", "Test failed!" {0 0 0};
341
+T_2.20 ;
342
+    %vpi_call 2 85 "$finish" {0 0 0};
343
+    %end;
344
+    .thread T_2;
345
+    .scope S_0x7fa2f94081a0;
346
+T_3 ;
347
+    %vpi_func 2 89 "$test$plusargs" 32, "waves=1" {0 0 0};
348
+    %cmpi/ne 0, 0, 32;
349
+    %jmp/0xz  T_3.0, 4;
350
+    %vpi_call 2 90 "$dumpfile", "out/waves.vcd" {0 0 0};
351
+    %vpi_call 2 91 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x7fa2f94081a0 {0 0 0};
352
+    %vpi_func 2 92 "$test$plusargs" 32, "dump_fifo=1" {0 0 0};
353
+    %cmpi/ne 0, 0, 32;
354
+    %jmp/0xz  T_3.2, 4;
355
+    %vpi_call 2 93 "$dumpvars", 32'sb00000000000000000000000000000000, &A<v0x7fa2f942ba20, 0> {0 0 0};
356
+    %vpi_call 2 94 "$dumpvars", 32'sb00000000000000000000000000000000, &A<v0x7fa2f942ba20, 1> {0 0 0};
357
+    %vpi_call 2 95 "$dumpvars", 32'sb00000000000000000000000000000000, &A<v0x7fa2f942ba20, 2> {0 0 0};
358
+    %vpi_call 2 96 "$dumpvars", 32'sb00000000000000000000000000000000, &A<v0x7fa2f942ba20, 3> {0 0 0};
359
+    %vpi_call 2 97 "$dumpvars", 32'sb00000000000000000000000000000000, &A<v0x7fa2f942ba20, 4> {0 0 0};
360
+    %vpi_call 2 98 "$dumpvars", 32'sb00000000000000000000000000000000, &A<v0x7fa2f942ba20, 5> {0 0 0};
361
+    %vpi_call 2 99 "$dumpvars", 32'sb00000000000000000000000000000000, &A<v0x7fa2f942ba20, 6> {0 0 0};
362
+    %vpi_call 2 100 "$dumpvars", 32'sb00000000000000000000000000000000, &A<v0x7fa2f942ba20, 7> {0 0 0};
363
+T_3.2 ;
364
+T_3.0 ;
365
+    %end;
366
+    .thread T_3;
367
+# The file index is used to find the file name in the following table.
368
+:file_names 4;
369
+    "N/A";
370
+    "<interactive>";
371
+    "fifo_tb.v";
372
+    "simple_fifo.v";

+ 457 - 0
out/waves.vcd

@@ -0,0 +1,457 @@
1
+$date
2
+	Mon May 22 18:16:34 2017
3
+$end
4
+$version
5
+	Icarus Verilog
6
+$end
7
+$timescale
8
+	1s
9
+$end
10
+$scope module fifo_tb $end
11
+$var wire 1 ! full $end
12
+$var wire 1 " empty $end
13
+$var wire 16 # data_out [15:0] $end
14
+$var reg 1 $ clk $end
15
+$var reg 16 % data_in [15:0] $end
16
+$var reg 1 & fifo_pop $end
17
+$var reg 1 ' fifo_push $end
18
+$var reg 1 ( reset_n $end
19
+$var reg 16 ) tmp [15:0] $end
20
+$scope module dut $end
21
+$var wire 1 $ clk $end
22
+$var wire 16 * data_in [15:0] $end
23
+$var wire 1 & pop $end
24
+$var wire 1 ' push $end
25
+$var wire 1 ( reset_n $end
26
+$var reg 16 + data_out [15:0] $end
27
+$var reg 1 " empty $end
28
+$var reg 1 ! full $end
29
+$var reg 3 , rd_ptr [2:0] $end
30
+$var reg 3 - wr_ptr [2:0] $end
31
+$upscope $end
32
+$upscope $end
33
+$scope module fifo_tb $end
34
+$scope module dut $end
35
+$var reg 16 . \data[0] [15:0] $end
36
+$upscope $end
37
+$upscope $end
38
+$scope module fifo_tb $end
39
+$scope module dut $end
40
+$var reg 16 / \data[1] [15:0] $end
41
+$upscope $end
42
+$upscope $end
43
+$scope module fifo_tb $end
44
+$scope module dut $end
45
+$var reg 16 0 \data[2] [15:0] $end
46
+$upscope $end
47
+$upscope $end
48
+$scope module fifo_tb $end
49
+$scope module dut $end
50
+$var reg 16 1 \data[3] [15:0] $end
51
+$upscope $end
52
+$upscope $end
53
+$scope module fifo_tb $end
54
+$scope module dut $end
55
+$var reg 16 2 \data[4] [15:0] $end
56
+$upscope $end
57
+$upscope $end
58
+$scope module fifo_tb $end
59
+$scope module dut $end
60
+$var reg 16 3 \data[5] [15:0] $end
61
+$upscope $end
62
+$upscope $end
63
+$scope module fifo_tb $end
64
+$scope module dut $end
65
+$var reg 16 4 \data[6] [15:0] $end
66
+$upscope $end
67
+$upscope $end
68
+$scope module fifo_tb $end
69
+$scope module dut $end
70
+$var reg 16 5 \data[7] [15:0] $end
71
+$upscope $end
72
+$upscope $end
73
+$enddefinitions $end
74
+#0
75
+$dumpvars
76
+bx 5
77
+bx 4
78
+bx 3
79
+bx 2
80
+bx 1
81
+bx 0
82
+bx /
83
+bx .
84
+bx -
85
+bx ,
86
+bx +
87
+b0 *
88
+bx )
89
+1(
90
+x'
91
+x&
92
+b0 %
93
+0$
94
+bx #
95
+x"
96
+x!
97
+$end
98
+#10
99
+1"
100
+0!
101
+b0 -
102
+b0 ,
103
+1$
104
+#20
105
+0$
106
+#30
107
+1$
108
+#40
109
+b1111111111111111 %
110
+b1111111111111111 *
111
+0(
112
+0$
113
+#50
114
+0"
115
+b1111111111111111 .
116
+b1 -
117
+1'
118
+1$
119
+#60
120
+b0 %
121
+b0 *
122
+0'
123
+0$
124
+#70
125
+b0 /
126
+b10 -
127
+1'
128
+1$
129
+#80
130
+b1111111111111111 %
131
+b1111111111111111 *
132
+0'
133
+0$
134
+#90
135
+b1111111111111111 0
136
+b11 -
137
+1'
138
+1$
139
+#100
140
+b0 %
141
+b0 *
142
+0'
143
+0$
144
+#110
145
+b0 1
146
+b100 -
147
+1'
148
+1$
149
+#120
150
+b1111111111111111 %
151
+b1111111111111111 *
152
+0'
153
+0$
154
+#130
155
+b1111111111111111 2
156
+b101 -
157
+1'
158
+1$
159
+#140
160
+b0 %
161
+b0 *
162
+0'
163
+0$
164
+#150
165
+b0 3
166
+b110 -
167
+1'
168
+1$
169
+#160
170
+b1111111111111111 %
171
+b1111111111111111 *
172
+0'
173
+0$
174
+#170
175
+b1111111111111111 4
176
+b111 -
177
+1'
178
+1$
179
+#180
180
+b0 %
181
+b0 *
182
+0'
183
+0$
184
+#190
185
+1!
186
+b0 5
187
+b0 -
188
+1'
189
+1$
190
+#200
191
+b1111111111111111 )
192
+b1111111111111111 %
193
+b1111111111111111 *
194
+0'
195
+0$
196
+#210
197
+0!
198
+b1111111111111111 #
199
+b1111111111111111 +
200
+b1 ,
201
+1&
202
+1$
203
+#220
204
+b0 )
205
+0&
206
+0$
207
+#230
208
+b0 #
209
+b0 +
210
+b10 ,
211
+1&
212
+1$
213
+#240
214
+b1111111111111111 )
215
+0&
216
+0$
217
+#250
218
+b1111111111111111 #
219
+b1111111111111111 +
220
+b11 ,
221
+1&
222
+1$
223
+#260
224
+b0 )
225
+0&
226
+0$
227
+#270
228
+b0 #
229
+b0 +
230
+b100 ,
231
+1&
232
+1$
233
+#280
234
+b1111111111111111 )
235
+0&
236
+0$
237
+#290
238
+b1111111111111111 #
239
+b1111111111111111 +
240
+b101 ,
241
+1&
242
+1$
243
+#300
244
+b0 )
245
+0&
246
+0$
247
+#310
248
+b0 #
249
+b0 +
250
+b110 ,
251
+1&
252
+1$
253
+#320
254
+b1111111111111111 )
255
+0&
256
+0$
257
+#330
258
+b1111111111111111 #
259
+b1111111111111111 +
260
+b111 ,
261
+1&
262
+1$
263
+#340
264
+b0 )
265
+0&
266
+0$
267
+#350
268
+1"
269
+b0 #
270
+b0 +
271
+b0 ,
272
+1&
273
+1$
274
+#360
275
+b1111111111111111 )
276
+0&
277
+0$
278
+#370
279
+1$
280
+#380
281
+0$
282
+#390
283
+1$
284
+#400
285
+0$
286
+#410
287
+1$
288
+#420
289
+0$
290
+#430
291
+1$
292
+#440
293
+0$
294
+#450
295
+b1001000110100 %
296
+b1001000110100 *
297
+1$
298
+#460
299
+0$
300
+#470
301
+1'
302
+1$
303
+#480
304
+b1110110111001011 %
305
+b1110110111001011 *
306
+0'
307
+0$
308
+#490
309
+0"
310
+b1110110111001011 .
311
+b1 -
312
+1'
313
+1$
314
+#500
315
+b1001000110100 %
316
+b1001000110100 *
317
+0'
318
+0$
319
+#510
320
+b1001000110100 /
321
+b10 -
322
+1'
323
+1$
324
+#520
325
+b1110110111001011 %
326
+b1110110111001011 *
327
+0'
328
+0$
329
+#530
330
+b1110110111001011 0
331
+b11 -
332
+1'
333
+1$
334
+#540
335
+b1001000110100 %
336
+b1001000110100 *
337
+0'
338
+0$
339
+#550
340
+b1001000110100 1
341
+b100 -
342
+1'
343
+1$
344
+#560
345
+b1110110111001011 %
346
+b1110110111001011 *
347
+0'
348
+0$
349
+#570
350
+b1110110111001011 2
351
+b101 -
352
+1'
353
+1$
354
+#580
355
+b1001000110100 %
356
+b1001000110100 *
357
+0'
358
+0$
359
+#590
360
+b1001000110100 3
361
+b110 -
362
+1'
363
+1$
364
+#600
365
+b1110110111001011 %
366
+b1110110111001011 *
367
+0'
368
+0$
369
+#610
370
+b1110110111001011 4
371
+b111 -
372
+1'
373
+1$
374
+#620
375
+b1001000110100 )
376
+b1001000110100 %
377
+b1001000110100 *
378
+0'
379
+0$
380
+#630
381
+b1110110111001011 #
382
+b1110110111001011 +
383
+b1 ,
384
+1&
385
+1$
386
+#640
387
+b1110110111001011 )
388
+0&
389
+0$
390
+#650
391
+b1001000110100 #
392
+b1001000110100 +
393
+b10 ,
394
+1&
395
+1$
396
+#660
397
+b1001000110100 )
398
+0&
399
+0$
400
+#670
401
+b1110110111001011 #
402
+b1110110111001011 +
403
+b11 ,
404
+1&
405
+1$
406
+#680
407
+b1110110111001011 )
408
+0&
409
+0$
410
+#690
411
+b1001000110100 #
412
+b1001000110100 +
413
+b100 ,
414
+1&
415
+1$
416
+#700
417
+b1001000110100 )
418
+0&
419
+0$
420
+#710
421
+b1110110111001011 #
422
+b1110110111001011 +
423
+b101 ,
424
+1&
425
+1$
426
+#720
427
+b1110110111001011 )
428
+0&
429
+0$
430
+#730
431
+b1001000110100 #
432
+b1001000110100 +
433
+b110 ,
434
+1&
435
+1$
436
+#740
437
+b1001000110100 )
438
+0&
439
+0$
440
+#750
441
+1"
442
+b1110110111001011 #
443
+b1110110111001011 +
444
+b111 ,
445
+1&
446
+1$
447
+#760
448
+b1110110111001011 )
449
+0&
450
+0$
451
+#770
452
+1&
453
+1$
454
+#780
455
+b1001000110100 )
456
+0&
457
+0$

+ 59 - 0
simple_fifo.v

@@ -0,0 +1,59 @@
1
+/*
2
+* DEPTH must be a power of 2
3
+*/
4
+module simple_fifo #(
5
+  parameter DEPTH = 8,
6
+  parameter WIDTH = 16
7
+)(
8
+  input wire clk,
9
+  input wire reset_n,
10
+  input wire push,
11
+  input wire pop,
12
+
13
+  input wire [WIDTH-1:0] data_in,
14
+  output reg [WIDTH-1:0] data_out,
15
+
16
+  output reg full,
17
+  output reg empty
18
+);
19
+
20
+reg [$clog2(DEPTH)-1:0] rd_ptr;
21
+reg [$clog2(DEPTH)-1:0] wr_ptr;
22
+reg [WIDTH-1:0] data [DEPTH-1:0];
23
+
24
+always @(posedge clk) begin
25
+  if (reset_n) begin
26
+    rd_ptr <= 0;
27
+    wr_ptr <= 0;
28
+    full <= 0;
29
+    empty <= 1;
30
+  end
31
+  else begin
32
+    if (push & ~full) begin
33
+      data[wr_ptr] <= data_in;
34
+      wr_ptr = wr_ptr + 1;
35
+      if (wr_ptr == rd_ptr) begin
36
+        full <= 1'b1;
37
+        empty <= 1'b0;
38
+      end
39
+      else begin
40
+        full <= 1'b0;
41
+        empty <= 1'b0;
42
+      end
43
+    end
44
+    if (pop & ~empty) begin
45
+      data_out <= data[rd_ptr];
46
+      rd_ptr = rd_ptr + 1;
47
+      if (wr_ptr == rd_ptr) begin
48
+        full <= 1'b0;
49
+        empty <= 1'b1;
50
+      end
51
+      else begin
52
+        full <= 1'b0;
53
+        empty <= 1'b0;
54
+      end
55
+    end
56
+  end
57
+end
58
+
59
+endmodule

+ 1 - 0
test

@@ -0,0 +1 @@
1
+./out/sim +waves=1 +dump_fifo=1