Test software additions.
authorTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Tue, 9 Jun 2020 18:40:50 +0000 (19:40 +0100)
committerTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Tue, 9 Jun 2020 18:40:50 +0000 (19:40 +0100)
Fixed an issue where the first 512 Byte block had incorrect data if a new capture was started without a reset.

src/NvmeStorageUnit.vhd
test/test.sh [new file with mode: 0644]
test/test_nvme.cpp

index b46afaf8734d47517270314aa0e94184d14d6ddd..1fee042316650ff22de3daf4c9817d994bfb8025 100644 (file)
@@ -455,6 +455,7 @@ signal configComplete               : std_logic := 'U';
 -- Nvme data write signals
 signal writeEnable             : std_logic := 'U';
 signal waitingForData          : std_logic := 'U';
+signal dataEnabledOut1         : std_logic := 'U';
 
 -- Pcie_nvme signals
 signal nvme_reset_local_n      : std_logic := '0';
@@ -522,11 +523,11 @@ begin
        axisClockConverter2 :  AxisClockConverter
        port map (
                clkRx           => clk,
-               resetRx         => reset,
+               resetRx         => "not"(dataEnabledOut1),
                streamRx        => dataIn,
 
                clkTx           => nvme_user_clk,
-               resetTx         => nvme_user_reset,
+               resetTx         => "not"(writeEnable),
                streamTx        => dataIn1
        );
        
@@ -538,9 +539,11 @@ begin
 
                clk2            => clk,
                reset2          => reset,
-               signal2         => dataEnabledOut
+               signal2         => dataEnabledOut1
        );
 
+       dataEnabledOut <= dataEnabledOut1;
+
        -- Register access
        regDataOut1 <= reg_id when(regAddress1 = 0) else
                        reg_control when(regAddress1 = 1) else
diff --git a/test/test.sh b/test/test.sh
new file mode 100644 (file)
index 0000000..0415a48
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/sh
+#######################################################################
+# test.sh      NvmeStorage simple tests
+#######################################################################
+#
+
+test1(){
+       echo "Simple capture test loop: 20 GByte"
+
+       while true; do
+               ./test_nvme -d 2 -s 0 -n 5242880 capture
+               ./test_nvme -d 2 -s 5242880 -n 5242880 capture
+       done
+}
+
+test2(){
+       echo "Simple capture test loop: 200 GByte"
+
+       ./test_nvme -d 2 -s 0 -n 52428800 trim
+       ./test_nvme -nr -d 2 -s 52428800 -n 52428800 trim
+
+       # Let NVMe's perform some trimming
+       sleep 20
+
+       while true; do
+               ./test_nvme -nr -d 2 -s 0 -n 52428800 capture
+               #./test_nvme -nr -d 2 -s 0 -n 52428800 trim
+               #sleep 20
+
+               ./test_nvme -nr -d 2 -s 52428800 -n 52428800 capture
+               #./test_nvme -nr -d 2 -s 52428800 -n 52428800 trim
+               #sleep 20
+       done
+}
+
+test3(){
+       ./test_nvme -d 2 -s 0 -n 5242880 capture
+       ./test_nvme -nr -d 2 -s 0 -n 5242880 capture
+       #./test_nvme -v -nr -nv -d 2 -s 0 -n 8 read
+       ./test_nvme -v -nr -d 2 -s 0 -n 8 read
+}
+
+test3
+
+exit 0
index 2f4ae80d2bf5711ab121a4944b3d89159805bf83..7e9d1dc6f9466a96f3595fcc31871c50e55a767e 100644 (file)
@@ -194,6 +194,10 @@ int Control::nvmeInit(){
                        }
                }
        }
+       else {
+               // Start Nvme request processing thread
+               start();
+       }
        
        return e;
 }
@@ -544,7 +548,7 @@ int Control::nvmeCapture(){
        }
 
        uprintf("Time: %u\n", t);
-       tprintf("StartBlock: 0x%8.8x ErrorStatus: 0x%x, DataRate: %.3f MBytes/s, PeakLatancy: %8u us\n", ostartBlock, e, r / (1024 * 1024), l);
+       tprintf("StartBlock: %8u ErrorStatus: 0x%x, DataRate: %.3f MBytes/s, PeakLatancy: %8u us\n", ostartBlock, e, r / (1024 * 1024), l);
 
        uprintf("Stop NvmeWrite engine\n");
        writeNvmeStorageReg(RegControl, 0x00000000);
@@ -610,6 +614,7 @@ int Control::nvmeCaptureRepeat(){
                        b = readNvmeStorageReg(RegWriteNumBlocks);
                        uprintf("NvmeWrite: numBlocks: %u\n", n);
                        usleep(100000);
+
                        if((getTime() - ts) > tExpected){
                                e = readNvmeStorageReg(RegWriteError);
                                if(onvmeNum == 2){
@@ -641,7 +646,7 @@ int Control::nvmeCaptureRepeat(){
                }
 
                uprintf("Process time: %u\n", t);
-               tprintf("%8d StartBlock: 0x%8.8x ErrorStatus: 0x%x, DataRate: %.3f MBytes/s, PeakLatancy: %8u us\n", n, startBlock, e, r / (1024 * 1024), l);
+               tprintf("%8d StartBlock: %8u ErrorStatus: 0x%x, DataRate: %.3f MBytes/s, PeakLatancy: %8u us\n", n, startBlock, e, r / (1024 * 1024), l);
 
                if(e){
                        printf("Error status: 0x%x, aborted\n", e);
@@ -686,7 +691,7 @@ int Control::nvmeRead(){
                writeNvmeStorageReg(RegReadNumBlocks, onumBlocks);
        }
        
-       if(overbose)
+       if(overbose > 2)
                dumpRegs();
        
        // Start off NvmeRead engine
@@ -694,7 +699,7 @@ int Control::nvmeRead(){
        ts = getTime();
        writeNvmeStorageReg(RegReadControl, 0x00000001);
 
-       if(overbose){
+       if(overbose > 2){
                dumpRegs(0);
                dumpRegs(1);
        }
@@ -838,7 +843,7 @@ int Control::nvmeTrim(){
        
        if(e = nvmeInit())
                return e;
-
+       
        // Note this 
        if(onvmeNum == 2){
                for(block = 0; block < onumBlocks/2; block += (trimBlocks/8)){
@@ -1245,15 +1250,15 @@ void usage(void) {
        fprintf(stderr, "Usage: test_nvme [options] <testname>\n");
        fprintf(stderr, "This program provides the ability perform access tests to an Nvme device on a FPGA development board\n");
        fprintf(stderr, " -help,-h              - Help on command line parameters\n");
-       fprintf(stderr, " -v                    - Verbose\n");
-       fprintf(stderr, " -no-reset             - Disable reset/config on startup\n");
-       fprintf(stderr, " -no-validate          - Disable data validation\n");
+       fprintf(stderr, " -v                    - Verbose. Two adds more verbosity\n");
        fprintf(stderr, " -l                    - List tests\n");
+       fprintf(stderr, " -no-reset || -nr      - Disable reset/config on startup\n");
+       fprintf(stderr, " -no-validate || -nv   - Disable data validation on read's\n");
        fprintf(stderr, " -d <nvmeNum>          - Nvme to operate on: 0: Nvme0, 1: Nvme1, 2: Both Nvme's (default)\n");
        fprintf(stderr, " -s <block>            - The starting 4k block number (default is 0)\n");
-       fprintf(stderr, " -n <num>              - The number of blocks to read/write or trim (default is 1)\n");
+       fprintf(stderr, " -n <num>              - The number of 4k blocks to read/write or trim (default is 2)\n");
        fprintf(stderr, " -rs <block>           - The starting 4k block number for reads in captureAndRead (default is 0)\n");
-       fprintf(stderr, " -rn <num>             - The number of blocks for reads in captureAndRead (default is 2)\n");
+       fprintf(stderr, " -rn <num>             - The number of 4k blocks for reads in captureAndRead (default is 2)\n");
        fprintf(stderr, " -o <filename>         - The filename for output data.\n");
 }
 
@@ -1261,9 +1266,11 @@ static struct option options[] = {
                { "h",                  0, NULL, 0 },
                { "help",               0, NULL, 0 },
                { "v",                  0, NULL, 0 },
+               { "l",                  0, NULL, 0 },
                { "no-reset",           0, NULL, 0 },
+               { "nr",                 0, NULL, 0 },
                { "no-validate",        0, NULL, 0 },
-               { "l",                  0, NULL, 0 },
+               { "nv",                 0, NULL, 0 },
                { "d",                  1, NULL, 0 },
                { "s",                  1, NULL, 0 },
                { "n",                  1, NULL, 0 },
@@ -1290,15 +1297,15 @@ int main(int argc, char** argv){
                else if(!strcmp(s, "v")){
                        control.overbose++;
                }
-               else if(!strcmp(s, "no-reset")){
+               else if(!strcmp(s, "l")){
+                       listTests = 1;
+               }
+               else if(!strcmp(s, "no-reset") || !strcmp(s, "nr")){
                        control.oreset = 0;
                }
-               else if(!strcmp(s, "no-validate")){
+               else if(!strcmp(s, "no-validate") || !strcmp(s, "nv")){
                        control.ovalidate = 0;
                }
-               else if(!strcmp(s, "l")){
-                       listTests = 1;
-               }
                else if(!strcmp(s, "d")){
                        control.setNvme(atoi(optarg));
                }