-
Notifications
You must be signed in to change notification settings - Fork 196
Expand file tree
/
Copy pathstream_fifo.sv
More file actions
66 lines (60 loc) · 2.53 KB
/
stream_fifo.sv
File metadata and controls
66 lines (60 loc) · 2.53 KB
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
// Copyright 2020 ETH Zurich and University of Bologna.
// Copyright and related rights are licensed under the Solderpad Hardware
// License, Version 0.51 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law
// or agreed to in writing, software, hardware and materials distributed under
// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
// Author: Georg Rutishauser <georgr@iis.ee.ethz.ch>
module stream_fifo #(
/// FIFO is in fall-through mode
parameter bit FALL_THROUGH = 1'b0,
/// Default data width if the fifo is of type logic
parameter int unsigned DATA_WIDTH = 32,
/// Depth can be arbitrary from 0 to 2**32
parameter int unsigned DEPTH = 8,
parameter type T = logic [DATA_WIDTH-1:0],
// DO NOT OVERWRITE THIS PARAMETER
parameter int unsigned ADDR_DEPTH = (DEPTH > 1) ? $clog2(DEPTH) : 1
) (
input logic clk_i, // Clock
input logic rst_ni, // Asynchronous reset active low
input logic flush_i, // flush the fifo
input logic testmode_i, // test_mode to bypass clock gating
output logic [ADDR_DEPTH-1:0] usage_o, // fill pointer
// input interface
input T data_i, // data to push into the fifo
input logic valid_i, // input data valid
output logic ready_o, // fifo is not full
// output interface
output T data_o, // output data
output logic valid_o, // fifo is not empty
input logic ready_i // pop head from fifo
);
logic push, pop;
logic empty, full;
assign push = valid_i & ~full;
assign pop = ready_i & ~empty;
assign ready_o = ~full;
assign valid_o = ~empty;
fifo_v3 #(
.FALL_THROUGH (FALL_THROUGH),
.DATA_WIDTH (DATA_WIDTH),
.DEPTH (DEPTH),
.dtype(T)
) fifo_i (
.clk_i,
.rst_ni,
.flush_i,
.testmode_i,
.full_o (full),
.empty_o (empty),
.usage_o,
.data_i,
.push_i (push),
.data_o,
.pop_i (pop)
);
endmodule