Now supports multiple NVMe clock inputs.
authorTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Thu, 21 May 2020 09:28:48 +0000 (10:28 +0100)
committerTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Thu, 21 May 2020 09:28:48 +0000 (10:28 +0100)
Some tidy ups.

docsrc/DuneNvmeStorageManual.odt
sim/testbench/test020-write.vhd
src/DuneNvmeTestTop.vhd
src/NvmeStorage.vhd
src/NvmeStoragePkg.vhd
src/NvmeStorageUnit.vhd

index 7846c8b16490e2608b773b7b7d356d61556842ae..fdd7a492603f12a345f3bea6cf4fc1d4beb32704 100644 (file)
Binary files a/docsrc/DuneNvmeStorageManual.odt and b/docsrc/DuneNvmeStorageManual.odt differ
index c4219f582a7402a9ec08dc1a5a977daf02468c57..3071729ff57e5569bd24ce7921de13067294bed3 100644 (file)
@@ -51,15 +51,17 @@ port (
        dataIn_ready    : out std_logic;                        --! Raw data input ready
 
        -- NVMe interface
-       nvme_clk_p      : in std_logic;                         --! Nvme external clock +ve
-       nvme_clk_n      : in std_logic;                         --! Nvme external clock -ve
        nvme_reset_n    : out std_logic;                        --! Nvme reset output to reset NVMe devices
 
+       nvme0_clk       : in std_logic;                         --! Nvme0 external clock
+       nvme0_clk_gt    : in std_logic;                         --! Nvme0 external GT clock
        nvme0_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX plus lanes
        nvme0_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX minus lanes
        nvme0_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX plus lanes
        nvme0_exp_rxn   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX minus lanes
 
+       nvme1_clk       : in std_logic;                         --! Nvme1 external clock
+       nvme1_clk_gt    : in std_logic;                         --! Nvme1 external GT clock
        nvme1_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX plus lanes
        nvme1_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX minus lanes
        nvme1_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme1 PCIe RX plus lanes
@@ -338,14 +340,15 @@ begin
                dataIn_ready    => dataStreamReady,
 
                -- NVMe interface
-               nvme_clk_p      => '0',
-               nvme_clk_n      => '0',
-
+               nvme0_clk       => '0',
+               nvme0_clk_gt    => '0',
                --nvme0_exp_txp : out std_logic_vector(0 downto 0);
                --nvme0_exp_txn : out std_logic_vector(0 downto 0);
                nvme0_exp_rxp   => "0000",
                nvme0_exp_rxn   => "0000",
 
+               nvme1_clk       => '0',
+               nvme1_clk_gt    => '0',
                --nvme1_exp_txp : out std_logic_vector(0 downto 0);
                --nvme1_exp_txn : out std_logic_vector(0 downto 0);
                nvme1_exp_rxp   => "0000",
index 349dea5a6cd06589b0497a3f315f84cc51bf502b..f0a6bb6b3bb16ff1fb503cac81effffebc3e3cf8 100644 (file)
@@ -149,6 +149,9 @@ signal sys_clk                      : std_logic := 'U';
 
 signal pci_clk                 : std_logic := 'U';
 signal pci_clk_gt              : std_logic := 'U';
+signal nvme_clk                        : std_logic := 'U';
+signal nvme_clk_gt             : std_logic := 'U';
+
 signal leds_l                  : std_logic_vector(7 downto 0) := (others => '0');
 
 signal axil_clk                        : std_logic;
@@ -173,7 +176,7 @@ begin
        );
 
        -- PCIE Clock, 100MHz
-       pci_clk_buf0 : IBUFDS_GTE3 port map(
+       pci_clk_buf0 : IBUFDS_GTE3 port map (
                I       => pci_clk_p,
                IB      => pci_clk_n,
                O       => pci_clk_gt,
@@ -181,6 +184,15 @@ begin
                CEB     => '0'
        );
        
+       -- NVME PCIE Clock, 100MHz. Clock shared between both Nvme devices
+       nvme_clk_buf0 : IBUFDS_GTE3 port map (
+               I       => nvme_clk_p,
+               IB      => nvme_clk_n,
+               O       => nvme_clk_gt,
+               ODIV2   => nvme_clk,
+               CEB     => '0'
+       );
+       
        -- The PCIe interface to the host
        pcie_host0 : Pcie_host
        port map (
@@ -248,9 +260,6 @@ begin
        axil_reset <= not axil_reset_n;
        
        nvmeStorage0 : NvmeStorage
-       generic map (
-               ClockPeriod     => 8 ns
-       )
        port map (
                clk             => axil_clk,
                reset           => axil_reset,
@@ -272,15 +281,17 @@ begin
                dataIn_ready    => dataStream_ready,
 
                -- NVMe interface
-               nvme_clk_p      => nvme_clk_p,
-               nvme_clk_n      => nvme_clk_n,
                nvme_reset_n    => nvme_reset_n,
 
+               nvme0_clk       => nvme_clk,
+               nvme0_clk_gt    => nvme_clk_gt,
                nvme0_exp_txp   => nvme0_exp_txp,
                nvme0_exp_txn   => nvme0_exp_txn,
                nvme0_exp_rxp   => nvme0_exp_rxp,
                nvme0_exp_rxn   => nvme0_exp_rxn,
 
+               nvme1_clk       => nvme_clk,
+               nvme1_clk_gt    => nvme_clk_gt,
                nvme1_exp_txp   => nvme1_exp_txp,
                nvme1_exp_txn   => nvme1_exp_txn,
                nvme1_exp_rxp   => nvme1_exp_rxp,
index 39079e929c346ba3787ce6fe4fec0fdf0b58c3c4..ddba299bfa7c844c6c3d3ea439078be7919de3ee 100644 (file)
@@ -45,7 +45,7 @@ use work.NvmeStorageIntPkg.all;
 entity NvmeStorage is
 generic(
        Simulate        : boolean       := False;                       --! Generate simulation core
-       ClockPeriod     : time          := 8 ns;                        --! Clock period for timers (125 MHz)
+       ClockPeriod     : time          := 4 ns;                        --! Clock period for timers (250 MHz)
        BlockSize       : integer       := NvmeStorageBlockSize;        --! System block size
        NumBlocksDrop   : integer       := 2;                           --! The number of blocks to drop at a time
        UseConfigure    : boolean       := False                        --! The module configures the Nvme's on reset
@@ -71,15 +71,17 @@ port (
        dataIn_ready    : out std_logic;                        --! Raw data input ready
 
        -- NVMe interface
-       nvme_clk_p      : in std_logic;                         --! Nvme external clock +ve
-       nvme_clk_n      : in std_logic;                         --! Nvme external clock -ve
        nvme_reset_n    : out std_logic;                        --! Nvme reset output to reset NVMe devices
 
+       nvme0_clk       : in std_logic;                         --! Nvme0 external clock
+       nvme0_clk_gt    : in std_logic;                         --! Nvme0 external GT clock
        nvme0_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX plus lanes
        nvme0_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX minus lanes
        nvme0_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX plus lanes
        nvme0_exp_rxn   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX minus lanes
 
+       nvme1_clk       : in std_logic;                         --! Nvme1 external clock
+       nvme1_clk_gt    : in std_logic;                         --! Nvme1 external GT clock
        nvme1_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX plus lanes
        nvme1_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX minus lanes
        nvme1_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme1 PCIe RX plus lanes
@@ -95,7 +97,7 @@ architecture Behavioral of NvmeStorage is
 component NvmeStorageUnit is
 generic(
        Simulate        : boolean       := Simulate;            --! Generate simulation core
-       ClockPeriod     : time          := ClockPeriod;         --! Clock period for timers (125 MHz)
+       ClockPeriod     : time          := ClockPeriod;         --! Clock period for timers (250 MHz)
        BlockSize       : integer       := BlockSize;           --! System block size
        PcieCore        : integer       := 0;                   --! The Pcie hardblock block to use
        UseConfigure    : boolean       := False                --! The module configures the Nvme's on reset
@@ -167,9 +169,6 @@ end component;
 
 constant TCQ           : time := 1 ns;
 
-signal nvme_clk                : std_logic := 'U';
-signal nvme_clk_gt     : std_logic := 'U';
-
 signal wvalid_delay    : std_logic := '0';
 signal rvalid_delay    : unsigned(4 downto 0) := (others => '0');
 
@@ -208,16 +207,6 @@ signal dropBlocks  : std_logic := '0';
 signal regBlocksLost   : unsigned(31 downto 0) := (others => '0');
 
 begin
-       -- NVME PCIE Clock, 100MHz
-       nvme_clk_buf0 : IBUFDS_GTE3
-       port map (
-               I       => nvme_clk_p,
-               IB      => nvme_clk_n,
-               O       => nvme_clk_gt,
-               ODIV2   => nvme_clk,
-               CEB     => '0'
-       );
-       
        -- Register processing. Depending on the read or write address set, pass to appropriate NvmeStorageUnit module.
        -- Bus ready returns            
        axilOut.awready <= axilIn.awvalid;
@@ -370,8 +359,8 @@ begin
                dataIn          => data0,
 
                -- NVMe interface
-               nvme_clk        => nvme_clk,
-               nvme_clk_gt     => nvme_clk_gt,
+               nvme_clk        => nvme0_clk,
+               nvme_clk_gt     => nvme0_clk_gt,
                nvme_reset_n    => nvme_reset_n,
                nvme_exp_txp    => nvme0_exp_txp,
                nvme_exp_txn    => nvme0_exp_txn,
@@ -401,8 +390,8 @@ begin
                dataIn          => data1,
 
                -- NVMe interface
-               nvme_clk        => nvme_clk,
-               nvme_clk_gt     => nvme_clk_gt,
+               nvme_clk        => nvme1_clk,
+               nvme_clk_gt     => nvme1_clk_gt,
                nvme_exp_txp    => nvme1_exp_txp,
                nvme_exp_txn    => nvme1_exp_txn,
                nvme_exp_rxp    => nvme1_exp_rxp,
index 632c447229e51f3d89b911a33f8b438877e9b21d..1cc90e151d0c6c1cb7fcea04d71ecd1987c19a33 100644 (file)
@@ -106,7 +106,7 @@ package NvmeStoragePkg is
        component NvmeStorage is
        generic(
                Simulate        : boolean       := False;                       --! Generate simulation core
-               ClockPeriod     : time          := 8 ns;                        --! Clock period for timers (125 MHz)
+               ClockPeriod     : time          := 4 ns;                        --! Clock period for timers (250 MHz)
                BlockSize       : integer       := NvmeStorageBlockSize;        --! System block size
                NumBlocksDrop   : integer       := 2;                           --! The number of blocks to drop at a time
                UseConfigure    : boolean       := False                        --! The module configures the Nvme's on reset
@@ -132,15 +132,17 @@ package NvmeStoragePkg is
                dataIn_ready    : out std_logic;                        --! Raw data input ready
 
                -- NVMe interface
-               nvme_clk_p      : in std_logic;                         --! Nvme external clock +ve
-               nvme_clk_n      : in std_logic;                         --! Nvme external clock -ve
                nvme_reset_n    : out std_logic;                        --! Nvme reset output to reset NVMe devices
 
+               nvme0_clk       : in std_logic;                         --! Nvme0 external clock
+               nvme0_clk_gt    : in std_logic;                         --! Nvme0 external GT clock
                nvme0_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX plus lanes
                nvme0_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme0 PCIe TX minus lanes
                nvme0_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX plus lanes
                nvme0_exp_rxn   : in std_logic_vector(3 downto 0);      --! Nvme0 PCIe RX minus lanes
 
+               nvme1_clk       : in std_logic;                         --! Nvme1 external clock
+               nvme1_clk_gt    : in std_logic;                         --! Nvme1 external GT clock
                nvme1_exp_txp   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX plus lanes
                nvme1_exp_txn   : out std_logic_vector(3 downto 0);     --! Nvme1 PCIe TX minus lanes
                nvme1_exp_rxp   : in std_logic_vector(3 downto 0);      --! Nvme1 PCIe RX plus lanes
index 88062965a167534edaf511a81baddd1a48a4a0b9..5a1fc2b391564b8456300c36f84ac39f67e5b75e 100644 (file)
@@ -45,7 +45,7 @@ use work.NvmeStorageIntPkg.all;
 entity NvmeStorageUnit is
 generic(
        Simulate        : boolean       := False;               --! Generate simulation core
-       ClockPeriod     : time          := 8 ns;                --! Clock period for timers (125 MHz)
+       ClockPeriod     : time          := 4 ns;                --! Clock period for timers (250 MHz)
        BlockSize       : integer       := NvmeStorageBlockSize;        --! System block size
        PcieCore        : integer       := 0;                   --! The Pcie hardblock block to use
        UseConfigure    : boolean       := False                --! The module configures the Nvme's on reset
@@ -511,7 +511,8 @@ begin
        reg_status(0)           <= '0';
        reg_status(1)           <= configComplete;
        reg_status(2)           <= '0';
-       reg_status(31 downto 3) <= (others => '0');
+       reg_status(3)           <= '0';                                         -- **** Needs setting
+       reg_status(31 downto 4) <= (others => '0');
        
        -- Perform reset of Nvme subsystem. This implements a 100ms reset suitable for the Nvme Pcie reset.
        -- Local state machines and external Nvme devices use this reset_local signal.