Modified NvmeStorageUnit.vhd to support Ultrascale+ PCIe blocks with Platform set...
authorTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Fri, 14 Aug 2020 11:07:52 +0000 (12:07 +0100)
committerTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Fri, 14 Aug 2020 11:07:52 +0000 (12:07 +0100)
sim/testbench/test021-read.vhd
src/K800/DuneNvmeTop.vhd
src/KCU105/DuneNvmeOpseroTop.vhd
src/KCU105/DuneNvmeTop.vhd
src/NvmeStorageIntPkg.vhd
src/NvmeStorageUnit.vhd

index af7598c6f4998572787fa10188aa253fcd2699eb..5bea7b422a190492bd78a8547f9489a675cc1777 100644 (file)
@@ -25,6 +25,7 @@ constant BlockSize    : integer := 4096;                      --! Proper block size
 component NvmeStorage is
 generic(
        Simulate        : boolean       := True;                --! Generate simulation core
+       Platform        : string        := "Ultrascale";        --! The underlying target platform
        --ClockPeriod   : time          := 10 ms;               --! Clock period for timers (125 MHz)
        ClockPeriod     : time          := 8 ns;                --! Clock period for timers (125 MHz)
        BlockSize       : integer       := Blocksize;           --! System block size
index 1d5cb3b4d9ace003e74dc7bf5581060e9e9c4175..22d137b55b98000301897325b4762dcd66e88b9d 100644 (file)
@@ -42,7 +42,8 @@ use work.NvmeStoragePkg.all;
 
 entity DuneNvmeTestTop is
 generic(
-       Simulate        : boolean       := False
+       Simulate        : boolean       := False;
+       Platform        : string        := "Ultrascale"         --! The underlying target platform
 );
 port (
        sys_clk_p       : in std_logic;
@@ -268,7 +269,7 @@ begin
        nvmeStorage0 : NvmeStorage
        generic map (
                Simulate        => False,                       --! Generate simulation core
-               Platform        => "Ultrascale",                --! The underlying target platform
+               Platform        => Platform,                    --! The underlying target platform
                ClockPeriod     => 4 ns,                        --! Clock period for timers (250 MHz)
                BlockSize       => NvmeStorageBlockSize,        --! System block size
                NumBlocksDrop   => 2,                           --! The number of blocks to drop at a time
index b72e32a79990bb833248ebaf50e0990c56bd1d5a..263bdd5cae355c8cbfee22663dc36a9967295a6f 100644 (file)
@@ -42,7 +42,8 @@ use work.NvmeStoragePkg.all;
 
 entity DuneNvmeTestOsperoTop is
 generic(
-       Simulate        : boolean       := False
+       Simulate        : boolean       := False;
+       Platform        : string        := "Ultrascale"         --! The underlying target platform
 );
 port (
        sys_clk_p       : in std_logic;
@@ -288,7 +289,7 @@ begin
        nvmeStorage0 : NvmeStorage
        generic map (
                Simulate        => False,                       --! Generate simulation core
-               Platform        => "Ultrascale",                --! The underlying target platform
+               Platform        => Platform,                    --! The underlying target platform
                ClockPeriod     => 4 ns,                        --! Clock period for timers (250 MHz)
                BlockSize       => NvmeStorageBlockSize,        --! System block size
                NumBlocksDrop   => 2,                           --! The number of blocks to drop at a time
index 1d5cb3b4d9ace003e74dc7bf5581060e9e9c4175..22d137b55b98000301897325b4762dcd66e88b9d 100644 (file)
@@ -42,7 +42,8 @@ use work.NvmeStoragePkg.all;
 
 entity DuneNvmeTestTop is
 generic(
-       Simulate        : boolean       := False
+       Simulate        : boolean       := False;
+       Platform        : string        := "Ultrascale"         --! The underlying target platform
 );
 port (
        sys_clk_p       : in std_logic;
@@ -268,7 +269,7 @@ begin
        nvmeStorage0 : NvmeStorage
        generic map (
                Simulate        => False,                       --! Generate simulation core
-               Platform        => "Ultrascale",                --! The underlying target platform
+               Platform        => Platform,                    --! The underlying target platform
                ClockPeriod     => 4 ns,                        --! Clock period for timers (250 MHz)
                BlockSize       => NvmeStorageBlockSize,        --! System block size
                NumBlocksDrop   => 2,                           --! The number of blocks to drop at a time
index 83a4254e2aeaeee71177753d686eda65b677c9d0..d1f18c48b196b53aa2506fdbabfce7834c0ffdf7 100644 (file)
@@ -50,6 +50,7 @@ package NvmeStorageIntPkg is
        function zeros(n: integer) return unsigned;
        function ones(n: integer) return std_logic_vector;
        function truncate(v: unsigned; n: integer) return unsigned;
+       function extend(v: std_logic_vector; n: integer) return std_logic_vector;
        function keepBits(numWords: unsigned) return std_logic_vector;
        function keepBits(numWords: integer) return std_logic_vector;
 
@@ -208,6 +209,11 @@ package body NvmeStorageIntPkg is
                return v(n - 1 downto 0);
        end function;
 
+       function extend(v: std_logic_vector; n: integer) return std_logic_vector is
+       begin
+               return zeros(n - v'length) & v;
+       end function;
+
        --! Set the keep bits based on the number of 32 bit words to be transfered
        function keepBits(numWords: unsigned) return std_logic_vector is
        begin
index d88d1b568a4540476b0c44e10771dad07427c151..7e483f764e0f9ff475c251d9c872968df8e6a5bb 100644 (file)
@@ -104,6 +104,25 @@ constant TCQ               : time := 1 ns;
 constant NumStreams    : integer := 8;
 constant ResetCycles   : integer := (100 ms / ClockPeriod);
 
+-- Platform specifics
+function pcieRqUserBits return integer is
+begin
+       if(platform = "Ultrascale+") then
+               return 62;
+       else
+               return 60;
+       end if;
+end;
+
+function pcieCqUserBits return integer is
+begin
+       if(platform = "Ultrascale+") then
+               return 88;
+       else
+               return 85;
+       end if;
+end;
+
 component RegAccessClockConvertor is
 port (
        clk1            : in std_logic;                         --! The interface clock line
@@ -169,7 +188,7 @@ port (
        s_axis_rq_tkeep : in std_logic_vector ( 3 downto 0 );
        s_axis_rq_tlast : in std_logic;
        s_axis_rq_tready : out std_logic_vector ( 3 downto 0 );
-       s_axis_rq_tuser : in std_logic_vector ( 59 downto 0 );
+       s_axis_rq_tuser : in std_logic_vector ( pcieRqUserBits-1 downto 0 );
        s_axis_rq_tvalid : in std_logic;
        m_axis_rc_tdata : out std_logic_vector ( 127 downto 0 );
        m_axis_rc_tkeep : out std_logic_vector ( 3 downto 0 );
@@ -181,7 +200,7 @@ port (
        m_axis_cq_tkeep : out std_logic_vector ( 3 downto 0 );
        m_axis_cq_tlast : out std_logic;
        m_axis_cq_tready : in std_logic;
-       m_axis_cq_tuser : out std_logic_vector ( 84 downto 0 );
+       m_axis_cq_tuser : out std_logic_vector ( pcieCqUserBits-1 downto 0 );
        m_axis_cq_tvalid : out std_logic;
        s_axis_cc_tdata : in std_logic_vector ( 127 downto 0 );
        s_axis_cc_tkeep : in std_logic_vector ( 3 downto 0 );
@@ -216,7 +235,7 @@ port (
        s_axis_rq_tkeep : in std_logic_vector ( 3 downto 0 );
        s_axis_rq_tlast : in std_logic;
        s_axis_rq_tready : out std_logic_vector ( 3 downto 0 );
-       s_axis_rq_tuser : in std_logic_vector ( 59 downto 0 );
+       s_axis_rq_tuser : in std_logic_vector ( pcieRqUserBits-1 downto 0 );
        s_axis_rq_tvalid : in std_logic;
        m_axis_rc_tdata : out std_logic_vector ( 127 downto 0 );
        m_axis_rc_tkeep : out std_logic_vector ( 3 downto 0 );
@@ -228,7 +247,7 @@ port (
        m_axis_cq_tkeep : out std_logic_vector ( 3 downto 0 );
        m_axis_cq_tlast : out std_logic;
        m_axis_cq_tready : in std_logic;
-       m_axis_cq_tuser : out std_logic_vector ( 84 downto 0 );
+       m_axis_cq_tuser : out std_logic_vector ( pcieCqUserBits-1 downto 0 );
        m_axis_cq_tvalid : out std_logic;
        s_axis_cc_tdata : in std_logic_vector ( 127 downto 0 );
        s_axis_cc_tkeep : in std_logic_vector ( 3 downto 0 );
@@ -423,7 +442,7 @@ signal streamSink           : AxisStreamType := AxisStreamSink;
 signal hostReq                 : AxisStreamType;
 signal hostReq_ready           : std_logic_vector(3 downto 0);
 signal hostReq_morethan1       : std_logic;
-signal hostReq_user            : std_logic_vector(59 downto 0);
+signal hostReq_user            : std_logic_vector(pcieRqUserBits-1 downto 0);
 
 signal hostReply               : AxisStreamType;
 
@@ -792,8 +811,8 @@ begin
        -- Warning: This may not be valid for message and atomic packets.
        --hostReq_morethan1 <= reg_control(31);
        hostReq_morethan1 <= '1' when(unsigned(hostReq.data(74 downto 64)) > 1) else '0';
-       hostReq_user <= x"00000000" & "0000" & "00000000" & "0" & "00" & "0" & "0" & "000" & "1111" & "1111" when(hostReq_morethan1 = '1')
-               else x"00000000" & "0000" & "00000000" & "0" & "00" & "0" & "0" & "000" & "0000" & "1111";
+       hostReq_user <= extend(x"00000000" & "0000" & "00000000" & "0" & "00" & "0" & "0" & "000" & "1111" & "1111", hostReq_user'length) when(hostReq_morethan1 = '1')
+               else extend(x"00000000" & "0000" & "00000000" & "0" & "00" & "0" & "0" & "000" & "0000" & "1111", hostReq_user'length);
 
        nvmeReply.ready <= nvmeReply_ready(0) and nvmeReply_ready(1) and nvmeReply_ready(2) and nvmeReply_ready(3);
        nvmeReply_user <= (others => '0');