Added Nvme trim/deallocate functionality.
[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         );
112         port (
113                 clk             : in std_logic;                         --! The interface clock line
114                 reset           : in std_logic;                         --! The active high reset line
115
116                 -- Control and status interface
117                 axilIn          : in AxilToSlaveType;                   --! Axil bus input signals
118                 axilOut         : out AxilToMasterType;                 --! Axil bus output signals
119
120                 -- From host to NVMe request/reply streams
121                 hostSend        : in AxisType;                          --! Host request stream
122                 hostSendReady   : out std_logic;                        --! Host request stream ready line
123                 hostRecv        : out AxisType;                         --! Host reply stream
124                 hostRecvReady   : in std_logic;                         --! Host reply stream ready line
125
126                 -- AXIS data stream input
127                 dataDropBlocks  : in std_logic;                         --! If set to '1' drop complete input blocks and account for the loss
128                 dataEnabledOut  : out std_logic;                        --! Indicates that data ingest is enabled
129                 dataIn          : in AxisDataStreamType;                --! Raw data input stream
130                 dataIn_ready    : out std_logic;                        --! Raw data input ready
131
132                 -- NVMe interface
133                 nvme_clk_p      : in std_logic;                         --! Nvme external clock +ve
134                 nvme_clk_n      : in std_logic;                         --! Nvme external clock -ve
135                 nvme_reset_n    : out std_logic;                        --! Nvme reset output to reset NVMe devices
136
137                 nvme0_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX plus lanes
138                 nvme0_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX minus lanes
139                 nvme0_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX plus lanes
140                 nvme0_exp_rxn   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX minus lanes
141
142                 nvme1_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX plus lanes
143                 nvme1_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX minus lanes
144                 nvme1_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme1 PCIe RX plus lanes
145                 nvme1_exp_rxn   : in std_logic_vector(3 downto 0);      --! Nvme1 PCIe RX minus lanes
146
147                 -- Debug
148                 leds            : out std_logic_vector(5 downto 0)
149         );
150         end component;
151         
152         --! Simple test data source
153         component TestData is
154         generic(
155                 BlockSize       : integer := NvmeStorageBlockSize       --! The block size in Bytes.
156         );
157         port (
158                 clk             : in std_logic;                         --! The interface clock line
159                 reset           : in std_logic;                         --! The active high reset line
160
161                 -- Control and status interface
162                 enable          : in std_logic;                         --! Enable production of data. Clears to reset state when set to 0.
163
164                 -- AXIS data output
165                 dataOut         : out AxisDataStreamType;               --! Output data stream
166                 dataOutReady    : in std_logic                          --! Ready signal for output data stream
167         );
168         end component;
169 end package;
170
171 package body NvmeStoragePkg is
172         function to_AxilAddress(v: integer) return std_logic_vector is
173         begin
174                 return std_logic_vector(to_unsigned(v, AxilAddressWidth));
175         end function;
176
177         function to_AxilData(v: integer)        return std_logic_vector is
178         begin
179                 return std_logic_vector(to_unsigned(v, AxilDataWidth));
180         end function;
181
182         function to_AxisData(v: integer) return std_logic_vector is
183         begin
184                 return std_logic_vector(to_unsigned(v, AxisDataWidth));
185         end function;
186 end;