Ospero board support updates.
authorTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Tue, 16 Jun 2020 07:23:16 +0000 (08:23 +0100)
committerTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Tue, 16 Jun 2020 07:23:16 +0000 (08:23 +0100)
NvmeWrite: Added complete status bit to status register.

12 files changed:
Config.mk
Makefile
docsrc/DuneNvmeStorageManual.odt
src/DuneNvmeTestOpseroTop.vhd
src/DuneNvmeTestOpseroTop.xdc
src/DuneNvmeTestTop.vhd
src/NvmeStorage.vhd
src/NvmeStoragePkg.vhd
src/NvmeStorageUnit.vhd
src/NvmeWrite.vhd
test/test_nvme.cpp
vivado/Vivado.mk

index b61f5577bcaa52cad3332a3096b8cb70a0a1662b..f8fc97ac2e694df218c5bba93568f1ed35a08505 100644 (file)
--- a/Config.mk
+++ b/Config.mk
@@ -4,5 +4,5 @@
 ################################################################################
 #
 PROJECT                = DuneNvme
-VERSION                = 0.9.0
+VERSION                = 1.0.0
 DOCDIR         ?= 
index f47fae7dd162b6ee70c96a06307b000ab503954f..3f31126c3234f9a2a18474797cbcabca578fb64c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -14,11 +14,13 @@ PACKAGES    += "texlive-scheme-medium texlive-hanging texlive-stackengine texlive-e
 all:
        make -C vivado
        make -C test
+       make -C test/bfpga_driver
 
 all_targets:
        make -C vivado DuneNvmeTest
        make -C vivado DuneNvmeTestOspero
        make -C test
+       make -C test/bfpga_driver
 
 install: all
 
index 8d9e2c4108a79c8214dee697e2a1213a8fed91cc..b34cbe6789b236f5dada0339123891d4b0d62347 100644 (file)
Binary files a/docsrc/DuneNvmeStorageManual.odt and b/docsrc/DuneNvmeStorageManual.odt differ
index cfa86136bc5d2f89ce4d68c569bfcc7901d39f9d..4acc02551e2e188c6fd12c62fd0a9e35991cbb25 100644 (file)
@@ -62,7 +62,7 @@ port (
 
        nvme0_clk_p     : in std_logic;
        nvme0_clk_n     : in std_logic;
-       nvme0_reset_n   : out std_logic;
+       nvme0_reset     : out std_logic;
 
        nvme0_exp_txp   : out std_logic_vector(3 downto 0);
        nvme0_exp_txn   : out std_logic_vector(3 downto 0);
@@ -71,7 +71,7 @@ port (
 
        nvme1_clk_p     : in std_logic;
        nvme1_clk_n     : in std_logic;
-       nvme1_reset_n   : out std_logic;
+       nvme1_reset     : out std_logic;
 
        nvme1_exp_txp   : out std_logic_vector(3 downto 0);
        nvme1_exp_txn   : out std_logic_vector(3 downto 0);
@@ -163,9 +163,10 @@ signal pci_clk                     : std_logic := 'U';
 signal pci_clk_gt              : std_logic := 'U';
 signal nvme0_clk               : std_logic := 'U';
 signal nvme0_clk_gt            : std_logic := 'U';
+signal nvme0_reset_n           : std_logic := 'U';
 signal nvme1_clk               : std_logic := 'U';
 signal nvme1_clk_gt            : std_logic := 'U';
-signal nvme_reset_n            : std_logic := 'U';
+signal nvme1_reset_n           : std_logic := 'U';
 
 signal leds_l                  : std_logic_vector(7 downto 0) := (others => '0');
 
@@ -217,8 +218,8 @@ begin
                CEB     => '0'
        );
 
-       nvme0_reset_n <= not nvme_reset_n;
-       nvme1_reset_n <= not nvme_reset_n;
+       nvme0_reset <= not nvme0_reset_n;
+       nvme1_reset <= not nvme1_reset_n;
        
        -- The PCIe interface to the host
        pcie_host0 : Pcie_host
@@ -319,10 +320,9 @@ begin
                dataIn_ready    => dataStream_ready,
 
                -- NVMe interface
-               nvme_reset_n    => nvme_reset_n,
-
                nvme0_clk       => nvme0_clk,
                nvme0_clk_gt    => nvme0_clk_gt,
+               nvme0_reset_n   => nvme0_reset_n,
                nvme0_exp_txp   => nvme0_exp_txp,
                nvme0_exp_txn   => nvme0_exp_txn,
                nvme0_exp_rxp   => nvme0_exp_rxp,
@@ -330,6 +330,7 @@ begin
 
                nvme1_clk       => nvme1_clk,
                nvme1_clk_gt    => nvme1_clk_gt,
+               nvme1_reset_n   => nvme1_reset_n,
                nvme1_exp_txp   => nvme1_exp_txp,
                nvme1_exp_txn   => nvme1_exp_txn,
                nvme1_exp_rxp   => nvme1_exp_rxp,
index 0d8f6de99367db4102d7619185355ad3bb85ffd4..63e9cdac8fc199ff9ce61cd62c465772b47230e3 100644 (file)
@@ -38,7 +38,8 @@
 # System timings\r
 #create_clock -period 5.000 -name sys_clk_p -waveform {0.000 2.500} [get_ports sys_clk_p]\r
 create_clock -period 10.000 -name pci_clk [get_ports pci_clk_p]\r
-create_clock -period 10.000 -name nvme_clk [get_ports nvme_clk_p]\r
+create_clock -period 10.000 -name nvme0_clk [get_ports nvme0_clk_p]\r
+create_clock -period 10.000 -name nvme1_clk [get_ports nvme1_clk_p]\r
 \r
 # CDC crossings\r
 set_false_path -to [get_cells -hier sendCdcReg1*]\r
@@ -110,8 +111,8 @@ set_property PACKAGE_PIN R23 [get_ports {leds[6]}]
 set_property PACKAGE_PIN P23 [get_ports {leds[7]}]\r
 \r
 # PCie Nvme0 interfaces\r
-set_property PACKAGE_PIN H11 [get_ports nvme0_reset_n]\r
-set_property IOSTANDARD LVCMOS18 [get_ports nvme0_reset_n]\r
+set_property PACKAGE_PIN H11 [get_ports nvme0_reset]\r
+set_property IOSTANDARD LVCMOS18 [get_ports nvme0_reset]\r
 set_property PACKAGE_PIN K6 [get_ports {nvme0_clk_p}]\r
 set_property PACKAGE_PIN K5 [get_ports {nvme0_clk_n}]\r
 #set_property LOC GTHE3_COMMON_X0Y1 [get_cells nvme_clk_buf0]\r
@@ -135,8 +136,8 @@ set_property LOC RAMB18_X8Y106 [get_cells -hierarchical -filter {NAME =~ *nvmeSt
 set_property LOC RAMB18_X8Y107 [get_cells -hierarchical -filter {NAME =~ *nvmeStorageUnit0*pcie3_uscale_top_inst/pcie3_uscale_wrapper_inst/bram_inst/bram_cpl_inst/CPL_FIFO_16KB.bram_16k_inst/RAMB18E2[3].ramb18e2_inst}]\r
 \r
 # PCie Nvme1 interfaces\r
-set_property PACKAGE_PIN L12 [get_ports nvme1_reset_n]\r
-set_property IOSTANDARD LVCMOS18 [get_ports nvme1_reset_n]\r
+set_property PACKAGE_PIN L12 [get_ports nvme1_reset]\r
+set_property IOSTANDARD LVCMOS18 [get_ports nvme1_reset]\r
 set_property PACKAGE_PIN H6 [get_ports {nvme1_clk_p}]\r
 set_property PACKAGE_PIN H5 [get_ports {nvme1_clk_n}]\r
 #set_property LOC GTHE3_COMMON_X0Y1 [get_cells nvme_clk_buf1]\r
index 83b76b6fcf1213c6023936fff151317f26c40ae5..74b2f925fd236ab99dfdd76e748766468fdd4221 100644 (file)
@@ -300,10 +300,9 @@ begin
                dataIn_ready    => dataStream_ready,
 
                -- NVMe interface
-               nvme_reset_n    => nvme_reset_n,
-
                nvme0_clk       => nvme_clk,
                nvme0_clk_gt    => nvme_clk_gt,
+               nvme0_reset_n   => nvme_reset_n,
                nvme0_exp_txp   => nvme0_exp_txp,
                nvme0_exp_txn   => nvme0_exp_txn,
                nvme0_exp_rxp   => nvme0_exp_rxp,
@@ -311,6 +310,7 @@ begin
 
                nvme1_clk       => nvme_clk,
                nvme1_clk_gt    => nvme_clk_gt,
+               --nvme1_reset_n => nvme1_reset_n,
                nvme1_exp_txp   => nvme1_exp_txp,
                nvme1_exp_txn   => nvme1_exp_txn,
                nvme1_exp_rxp   => nvme1_exp_rxp,
index b976c63a14d35918d560536d9b81d91872e5a0ca..8b86017f52af3673050cd546f0232135431e6d4a 100644 (file)
@@ -82,10 +82,9 @@ port (
        dataIn_ready    : out std_logic;                        --! Raw data input ready
 
        -- NVMe interface
-       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_reset_n   : out std_logic;                        --! Nvme0 reset output to reset NVMe device
        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
@@ -93,6 +92,7 @@ port (
 
        nvme1_clk       : in std_logic;                         --! Nvme1 external clock
        nvme1_clk_gt    : in std_logic;                         --! Nvme1 external GT clock
+       nvme1_reset_n   : out std_logic;                        --! Nvme1 reset output to reset NVMe device
        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
@@ -390,7 +390,7 @@ begin
                -- NVMe interface
                nvme_clk        => nvme0_clk,
                nvme_clk_gt     => nvme0_clk_gt,
-               nvme_reset_n    => nvme_reset_n,
+               nvme_reset_n    => nvme0_reset_n,
                nvme_exp_txp    => nvme0_exp_txp,
                nvme_exp_txn    => nvme0_exp_txn,
                nvme_exp_rxp    => nvme0_exp_rxp,
@@ -422,6 +422,7 @@ begin
                -- NVMe interface
                nvme_clk        => nvme1_clk,
                nvme_clk_gt     => nvme1_clk_gt,
+               nvme_reset_n    => nvme1_reset_n,
                nvme_exp_txp    => nvme1_exp_txp,
                nvme_exp_txn    => nvme1_exp_txn,
                nvme_exp_rxp    => nvme1_exp_rxp,
index c602498aeea2b43336bb1e241ad0e75b9844d0f4..ff99b43ad1332eb59ae71d142a9f0aea51a22b5c 100644 (file)
@@ -137,10 +137,9 @@ package NvmeStoragePkg is
                dataIn_ready    : out std_logic;                        --! Raw data input ready
 
                -- NVMe interface
-               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_reset_n   : out std_logic;                        --! Nvme0 reset output to reset NVMe device
                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
@@ -148,6 +147,7 @@ package NvmeStoragePkg is
 
                nvme1_clk       : in std_logic;                         --! Nvme1 external clock
                nvme1_clk_gt    : in std_logic;                         --! Nvme1 external GT clock
+               nvme1_reset_n   : out std_logic;                        --! Nvme0 reset output to reset NVMe device
                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 deff79f7edcf9b2eb7c0a831ad461f12e7b072d1..dfcf2b5e7d6733a65b391b991f9e816cd80b18d5 100644 (file)
@@ -343,6 +343,7 @@ port (
        dataIn          : inout AxisStreamType := AxisStreamInput;      --! Raw data to save stream
 
        waitingForData  : out std_logic;                        --! Set when dataIn is empty so other tasks can be run.
+       complete        : out std_logic;                        --! Set when capture process is complete
 
        -- To Nvme Request/reply streams
        requestOut      : inout AxisStreamType := AxisStreamOutput;     --! To Nvme request stream (3)
@@ -437,7 +438,7 @@ signal regDataIn1           : std_logic_vector(31 downto 0);        --! Register write data
 signal regDataOut0             : std_logic_vector(31 downto 0);        --! Register contents
 signal regDataOut1             : std_logic_vector(31 downto 0);        --! Register contents
 
-signal reg_id                  : RegDataType := x"56000901";
+signal reg_id                  : RegDataType := x"56010000";
 signal reg_control             : RegDataType := (others => '0');
 signal reg_status              : RegDataType := (others => '0');
 signal reg_totalBlocks         : RegDataType := to_stl(NvmeTotalBlocks, RegWidth);
@@ -456,6 +457,7 @@ signal configComplete               : std_logic := 'U';
 signal writeEnable             : std_logic := 'U';
 signal waitingForData          : std_logic := 'U';
 signal dataEnabledOut1         : std_logic := 'U';
+signal writeComplete           : std_logic := 'U';
 
 -- Pcie_nvme signals
 signal nvme_reset_local_n      : std_logic := '0';
@@ -553,9 +555,10 @@ begin
        -- Status register bits
        reg_status(0)           <= '0';
        reg_status(1)           <= configComplete;
-       reg_status(2)           <= '0';
-       reg_status(3)           <= '0';                                         -- **** Needs setting
-       reg_status(31 downto 4) <= (others => '0');
+       reg_status(2)           <= reg_control(2);
+       reg_status(3)           <= writeComplete;
+       reg_status(4)           <= '0';                         -- Error: ideally needs seting from various sources
+       reg_status(31 downto 5) <= (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.
index 4e2260afc5166ec86ccd32960354a209b6803c82..9aa1632d53f5d2b92250d1a38ba44fe53d2d5345 100644 (file)
@@ -89,6 +89,7 @@ port (
        dataIn          : inout AxisStreamType := AxisStreamInput;      --! Raw data to save stream
        
        waitingForData  : out std_logic;                        --! Set when dataIn is empty so other tasks can be run.
+       complete        : out std_logic;                        --! Set when capture process is complete
 
        -- To Nvme Request/reply streams
        requestOut      : inout AxisStreamType := AxisStreamOutput;     --! To Nvme request stream (3)
@@ -188,7 +189,7 @@ signal inState              : InStateType := INSTATE_IDLE;
 signal state           : StateType := STATE_IDLE;
 signal replyState      : ReplyStateType := REPSTATE_QUEUE_REPLY1;
 
-signal complete                : std_logic := '0';
+signal complete_l      : std_logic := '0';
 signal blockNumberIn   : unsigned(31 downto 0) := (others => '0');             --! Input block number
 signal numBlocksProc   : unsigned(31 downto 0) := (others => '0');             --! Number of block write requests sent
 signal numBlocksDone   : unsigned(31 downto 0) := (others => '0');             --! Number of block write completions received
@@ -295,6 +296,8 @@ begin
                        else std_logic_vector(test1) when(regAddress = 7)
                        else ones(32);
        
+       complete <= complete_l;
+       
        test0(31 downto 16) <= numBlocksProc(15 downto 0);
        test0(15 downto 0) <= blockNumberIn(15 downto 0);
        test1(31 downto 16) <= numBlocksTrimmed(15 downto 0);
@@ -336,8 +339,8 @@ begin
 
        -- Input data process. Accepts data from input stream and stores it into a free buffer if available.
        dataIn.ready <= writeEnable;
-       --waitingForData <= not enable or complete or not dataIn.valid;
-       waitingForData <= not enable or complete;
+       --waitingForData <= not enable or complete_l or not dataIn.valid;
+       waitingForData <= not enable or complete_l;
 
        process(clk)
        variable c: integer;
@@ -448,7 +451,7 @@ begin
                                processQueueOut         <= 0;
                                numBlocksTrimmed        <= (others => '0');
                                trimQueueProc           <= (others => '0');
-                               complete                <= '0';
+                               complete_l              <= '0';
                                state                   <= STATE_IDLE;
                        else
                                case(state) is
@@ -468,13 +471,13 @@ begin
                                        processQueueOut         <= 0;
                                        numBlocksTrimmed        <= (others => '0');
                                        trimQueueProc           <= (others => '0');
-                                       complete                <= '0';
+                                       complete_l              <= '0';
                                        state                   <= STATE_RUN;
                                        
                                when STATE_RUN =>
                                        if(enable = '1') then
                                                if(numBlocksProc >= dataChunkSize) then
-                                                       complete        <= '1';
+                                                       complete_l      <= '1';
                                                        state           <= STATE_COMPLETE;
                                                
                                                elsif(DoTrim and (numBlocksTrimmed < dataChunkSize) and ((trimQueueProc - trimQueueDone) < 4)) then
@@ -492,7 +495,7 @@ begin
 
                                                end if;
                                        else
-                                               complete        <= '1';
+                                               complete_l      <= '1';
                                                state           <= STATE_COMPLETE;
                                        end if;
                                
index d2d1892bf89758d89eee7beecae8ffe1b661a7b3..e7168d84ec054492964747f5b97cb12421bd0185 100644 (file)
@@ -523,7 +523,7 @@ int Control::nvmeCapture(){
        uprintf("Start NvmeWrite engine\n");
        writeNvmeStorageReg(RegControl, 0x00000004);
 
-       // Wait untill all blocks have been processed.
+       // Wait until all blocks have been processed. Could wait for complete status instead.
        ts = getTime();
        n = 0;
        while(n != numBlocks){
index 70f4f6afb38617890352f12d2e971d49206aaa61..24fc76220f75e5dd7dbe3ea464024491a34b8248 100644 (file)
@@ -45,18 +45,20 @@ project: ${PROJECT}.xpr
 fpga: ${BITFILE}
 
 clean:
-       -rm -rf *.log *.jou *.html *.xml
+       -rm -f *.log *.jou *.html *.xml
        -rm -fr ${PROJECT}.cache ${PROJECT}.hw ${PROJECT}.ip_user_files ${PROJECT}.runs ${PROJECT}.sim ${PROJECT}.srcs
-       -rm -rf create_project.tcl run_synth.tcl run_impl.tcl generate_bit.tcl
-       -rm -rf program.tcl generate_mcs.tcl *.mcs *.prm flash.tcl report.tcl
-       -rm -f utilisation.txt
+       -rm -f create_project.tcl run_synth.tcl run_impl.tcl generate_bit.tcl
+       -rm -f program.tcl generate_mcs.tcl *.mcs *.prm flash.tcl report.tcl
+       -rm -f utilisation.txt .built-${PROJECT}.xpr
 
 distclean: clean
        -rm -fr *.cache *.hw *.ip_user_files *.runs *.sim *.srcs .Xil defines.v
-       -rm -rf rev bitfiles
+       -rm -fr rev bitfiles
 
 # Vivado project file
-${PROJECT}.xpr: Makefile Config.mk $(XCI_FILES)
+${PROJECT}.xpr: .built-${PROJECT}.xpr
+
+.built-${PROJECT}.xpr: Makefile Config.mk $(XCI_FILES)
        rm -rf defines.v
        touch defines.v
        for x in $(DEFS); do echo '`define' $$x >> defines.v; done
@@ -69,9 +71,10 @@ ${PROJECT}.xpr: Makefile Config.mk $(XCI_FILES)
        for x in $(XCI_FILES); do echo "import_ip $$x" >> create_project.tcl; done
        echo "exit" >> create_project.tcl
        vivado -nojournal -nolog -mode batch -source create_project.tcl
+       touch .built-${PROJECT}.xpr
 
 # Synthesis run
-${PROJECT}.runs/synth_1/${PROJECT}.dcp: ${PROJECT}.xpr $(SYN_FILES) $(INC_FILES) $(XDC_FILES)
+${PROJECT}.runs/synth_1/${PROJECT}.dcp: .built-${PROJECT}.xpr $(SYN_FILES) $(INC_FILES) $(XDC_FILES)
        rm -f ${BITFILE}
        echo "open_project ${PROJECT}.xpr" > run_synth.tcl
        echo "reset_run synth_1" >> run_synth.tcl
@@ -143,7 +146,7 @@ report: ${PROJECT}.runs/impl_1/${PROJECT}_routed.dcp
 
 program: ${BITFILE}
        echo "open_hw_manager" > program.tcl
-       echo "connect_hw_server ${FPGA_TARGET}" >> program.tcl
+       echo "connect_hw_server ${VIVADO_TARGET}" >> program.tcl
        echo "open_hw_target" >> program.tcl
        echo "current_hw_device [lindex [get_hw_devices] 0]" >> program.tcl
        echo "refresh_hw_device -update_hw_probes false [current_hw_device]" >> program.tcl