632c447229e51f3d89b911a33f8b438877e9b21d
[DuneNvme.git] / src / NvmeStoragePkg.vhd
1 --------------------------------------------------------------------------------
2 -- NvmeStoragePkg.vhd External interface definitions for NvmeStorage module
3 --------------------------------------------------------------------------------
4 --!
5 --! @class      NvmeStoragePkg
6 --! @author     Terry Barnaby (terry.barnaby@beam.ltd.uk)
7 --! @date       2020-05-12
8 --! @version    0.5.1
9 --!
10 --! @brief
11 --! This package provides external interface definitions for the NvmeStorage module.
12 --!
13 --! @details
14 --!
15 --! @copyright GNU GPL License
16 --! Copyright (c) Beam Ltd, All rights reserved. <br>
17 --! This code is free software: you can redistribute it and/or modify
18 --! it under the terms of the GNU General Public License as published by
19 --! the Free Software Foundation, either version 3 of the License, or
20 --! (at your option) any later version.
21 --! This program is distributed in the hope that it will be useful,
22 --! but WITHOUT ANY WARRANTY; without even the implied warranty of
23 --! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 --! GNU General Public License for more details. <br>
25 --! You should have received a copy of the GNU General Public License
26 --! along with this code. If not, see <https://www.gnu.org/licenses/>.
27 --!
28 library ieee ;
29 use ieee.std_logic_1164.all;
30 use ieee.numeric_std.all;
31
32 package NvmeStoragePkg is
33         --! System constants
34         constant NvmeStorageBlockSize   : integer := 4096;      --! System block size
35
36         --! AXI Lite bus like interface
37         constant AxilAddressWidth       : integer := 32;
38         constant AxilDataWidth          : integer := 32;
39
40         type AxilToSlaveType is record
41                 awaddr          : std_logic_vector(AxilAddressWidth-1 downto 0);
42                 awprot          : std_logic_vector(2 downto 0);
43                 awvalid         : std_logic;
44
45                 wdata           : std_logic_vector(AxilDataWidth-1 downto 0);
46                 wstrb           : std_logic_vector(3 downto 0);
47                 wvalid          : std_logic;
48
49                 bready          : std_logic;
50
51                 araddr          : std_logic_vector(AxilAddressWidth-1 downto 0);
52                 arprot          : std_logic_vector(2 downto 0);
53                 arvalid         : std_logic;
54
55                 rready          : std_logic;
56         end record;
57
58         type AxilToMasterType is record
59                 awready         : std_logic;
60
61                 wready          : std_logic;
62
63                 bvalid          : std_logic;
64                 bresp           : std_logic_vector(1 downto 0);
65
66                 arready         : std_logic;
67
68                 rdata           : std_logic_vector(AxilDataWidth-1 downto 0);
69                 rresp           : std_logic_vector(1 downto 0);
70                 rvalid          : std_logic;
71         end record;
72         
73         type AxilBusType is record
74                 toSlave         : AxilToSlaveType;
75                 toMaster        : AxilToMasterType;
76         end record;
77
78         function to_AxilAddress(v: integer) return std_logic_vector;
79         function to_AxilData(v: integer) return std_logic_vector;
80
81
82         --! AXI Stream interface
83         constant AxisDataWidth  : integer := 128;
84         constant AxisKeepWidth  : integer := AxisDataWidth / 8;
85
86         type AxisType is record
87                 valid           : std_logic;
88                 last            : std_logic;
89                 data            : std_logic_vector(AxisDataWidth-1 downto 0);
90                 keep            : std_logic_vector(AxisKeepWidth-1 downto 0);
91         end record;
92
93         constant AxisInit       : AxisType := ('0', '0', (others => '0'), (others => '0'));
94
95         -- Axis data stream
96         constant AxisDataStreamWidth : integer := 256;
97
98         type AxisDataStreamType is record
99                 valid           : std_logic;
100                 last            : std_logic;
101                 data            : std_logic_vector(AxisDataStreamWidth-1 downto 0);
102         end record;
103
104
105         --! The NvmeStorage module's interface
106         component NvmeStorage is
107         generic(
108                 Simulate        : boolean       := False;                       --! Generate simulation core
109                 ClockPeriod     : time          := 8 ns;                        --! Clock period for timers (125 MHz)
110                 BlockSize       : integer       := NvmeStorageBlockSize;        --! System block size
111                 NumBlocksDrop   : integer       := 2;                           --! The number of blocks to drop at a time
112                 UseConfigure    : boolean       := False                        --! The module configures the Nvme's on reset
113         );
114         port (
115                 clk             : in std_logic;                         --! The interface clock line
116                 reset           : in std_logic;                         --! The active high reset line
117
118                 -- Control and status interface
119                 axilIn          : in AxilToSlaveType;                   --! Axil bus input signals
120                 axilOut         : out AxilToMasterType;                 --! Axil bus output signals
121
122                 -- From host to NVMe request/reply streams
123                 hostSend        : in AxisType;                          --! Host request stream
124                 hostSend_ready  : out std_logic;                        --! Host request stream ready line
125                 hostRecv        : out AxisType;                         --! Host reply stream
126                 hostRecv_ready  : in std_logic;                         --! Host reply stream ready line
127
128                 -- AXIS data stream input
129                 dataDropBlocks  : in std_logic;                         --! If set to '1' drop complete input blocks and account for the loss
130                 dataEnabledOut  : out std_logic;                        --! Indicates that data ingest is enabled
131                 dataIn          : in AxisDataStreamType;                --! Raw data input stream
132                 dataIn_ready    : out std_logic;                        --! Raw data input ready
133
134                 -- NVMe interface
135                 nvme_clk_p      : in std_logic;                         --! Nvme external clock +ve
136                 nvme_clk_n      : in std_logic;                         --! Nvme external clock -ve
137                 nvme_reset_n    : out std_logic;                        --! Nvme reset output to reset NVMe devices
138
139                 nvme0_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX plus lanes
140                 nvme0_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX minus lanes
141                 nvme0_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX plus lanes
142                 nvme0_exp_rxn   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX minus lanes
143
144                 nvme1_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX plus lanes
145                 nvme1_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX minus lanes
146                 nvme1_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme1 PCIe RX plus lanes
147                 nvme1_exp_rxn   : in std_logic_vector(3 downto 0);      --! Nvme1 PCIe RX minus lanes
148
149                 -- Debug
150                 leds            : out std_logic_vector(5 downto 0)
151         );
152         end component;
153         
154         --! Simple test data source
155         component TestData is
156         generic(
157                 BlockSize       : integer := NvmeStorageBlockSize       --! The block size in Bytes.
158         );
159         port (
160                 clk             : in std_logic;                         --! The interface clock line
161                 reset           : in std_logic;                         --! The active high reset line
162
163                 -- Control and status interface
164                 enable          : in std_logic;                         --! Enable production of data. Clears to reset state when set to 0.
165
166                 -- AXIS data output
167                 dataOut         : out AxisDataStreamType;               --! Output data stream
168                 dataOutReady    : in std_logic                          --! Ready signal for output data stream
169         );
170         end component;
171 end package;
172
173 package body NvmeStoragePkg is
174         function to_AxilAddress(v: integer) return std_logic_vector is
175         begin
176                 return std_logic_vector(to_unsigned(v, AxilAddressWidth));
177         end function;
178
179         function to_AxilData(v: integer)        return std_logic_vector is
180         begin
181                 return std_logic_vector(to_unsigned(v, AxilDataWidth));
182         end function;
183
184         function to_AxisData(v: integer) return std_logic_vector is
185         begin
186                 return std_logic_vector(to_unsigned(v, AxisDataWidth));
187         end function;
188 end;