Initial NvmeRead additions.
authorTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Wed, 20 May 2020 07:17:26 +0000 (08:17 +0100)
committerTerry Barnaby <terry.barnaby@beam.beam.ltd.uk>
Wed, 20 May 2020 07:17:26 +0000 (08:17 +0100)
14 files changed:
sim/Makefile
sim/testbench/TestPkg.vhd
sim/testbench/test020-write.sav
sim/testbench/test020-write.vhd
src/DuneNvmeTestTop.vhd
src/DuneNvmeTestTop.xdc
src/NvmeRead.vhd [new file with mode: 0644]
src/NvmeSim.vhd
src/NvmeStoragePkg.vhd
src/NvmeStorageUnit.vhd
test/NvmeAccess.cpp
test/NvmeAccess.h
test/test_nvme.cpp
vivado/Makefile

index 33fe640bf86838388b65affa58ebf825582d1929..f2ac36802b5bae5689721ec3f0e2dd2755c8cf48 100644 (file)
@@ -37,6 +37,7 @@ FILES_BASE    += ../src/NvmeStreamMux.vhd ../src/AxisDataConvertFifo.vhd ../src/Reg
 
 FILES_SYSTEM   = ../src/NvmeStorageUnit.vhd ../src/NvmeSim.vhd ../src/NvmeConfig.vhd ../src/StreamSwitch.vhd ../src/NvmeQueues.vhd
 FILES_SYSTEM   += ../src/TestDataStream.vhd ../src/TestData.vhd ../src/NvmeWrite.vhd
+FILES_SYSTEM   += ../src/NvmeRead.vhd
 
 # Test files
 FILES_test001-leds += testbench/${TEST}.vhd ${FILES_BASE} ../src/LedCount.vhd
index 926eaf72c3a40671cda3ec76c23b2d76c392d91c..eea30801718542aa1e078dc931c5d6b7f6178d50 100644 (file)
@@ -35,6 +35,7 @@ use work.NvmeStoragePkg.all;
 use work.NvmeStorageIntPkg.all;
 
 package TestPkg is
+       procedure pcieRequestWriteHead(signal clk: std_logic; signal stream: inout AxisStreamType; requesterId: in integer; request: in integer; address: in integer; tag: in integer; count: in integer);
        procedure pcieRequestWrite(signal clk: std_logic; signal stream: inout AxisStreamType; requesterId: in integer; request: in integer; address: in integer; tag: in integer; count: in integer; data: in integer);
        procedure pcieRequestRead(signal clk: std_logic; signal stream: inout AxisStreamType; requesterId: in integer; request: in integer; address: in integer; tag: in integer; count: in integer);
        procedure pcieReply(signal clk: std_logic; signal stream: inout AxisStreamType; requesterId: in integer; status: in integer; address: in integer; tag: in integer; count: in integer; data: in integer);
@@ -43,6 +44,22 @@ package TestPkg is
 end;
 
 package body TestPkg is
+       procedure pcieRequestWriteHead(signal clk: std_logic; signal stream: inout AxisStreamType; requesterId: in integer; request: in integer; address: in integer; tag: in integer; count: in integer) is
+       variable packetHead     : PcieRequestHeadType;
+       begin
+               packetHead.address := to_unsigned(address, packetHead.address'length);
+               packetHead.tag := to_unsigned(tag, packetHead.tag'length);
+               packetHead.count := to_unsigned(count, packetHead.count'length);
+               packetHead.request := to_unsigned(request, packetHead.request'length);
+               packetHead.requesterId := to_unsigned(requesterId, packetHead.requesterId'length);
+
+               -- Send Header
+               wait until rising_edge(clk);
+               stream.data <= to_stl(packetHead);
+               stream.keep <= ones(4);
+               stream.valid <= '1';
+       end procedure;
+
        procedure pcieRequestWrite(signal clk: std_logic; signal stream: inout AxisStreamType; requesterId: in integer; request: in integer; address: in integer; tag: in integer; count: in integer; data: in integer) is
        variable packetHead     : PcieRequestHeadType;
        variable c              : integer;
@@ -60,7 +77,7 @@ package body TestPkg is
                -- Send Header
                wait until rising_edge(clk);
                stream.data <= to_stl(packetHead);
-               stream.keep <= concat('1', 16);
+               stream.keep <= ones(4);
                stream.valid <= '1';
 
                while(c > 0) loop
@@ -95,7 +112,7 @@ package body TestPkg is
                -- Write address
                wait until rising_edge(clk);
                stream.data <= to_stl(packetHead);
-               stream.keep <= concat('1', 16);
+               stream.keep <= ones(4);
                stream.valid <= '1';
                stream.last <= '1';
 
@@ -122,7 +139,7 @@ package body TestPkg is
                -- Write address
                wait until rising_edge(clk);
                stream.data <= to_stl(d, 32) &to_stl(packetHead);
-               stream.keep <= concat('1', 16);
+               stream.keep <= ones(4);
                stream.valid <= '1';
                d := d + 1;
 
@@ -134,7 +151,7 @@ package body TestPkg is
                        c := c - 1;
                end loop;
                stream.last <= '1';
-               stream.keep <= concat('0', 4) & concat('1', 12);                -- Hard coded for multiple of 4 data words
+               stream.keep <= "0111";          -- Hard coded for multiple of 4 data words
 
                wait until rising_edge(clk) and (stream.ready = '1');
                stream.valid <= '0';
index 122c98db83a9486d48855143dbd560bcde9d1a89..a3bb0d8f2ca5da73cf09bd754ec969c1e56b2c42 100644 (file)
@@ -1,15 +1,15 @@
 [*]
 [*] GTKWave Analyzer v3.3.105 (w)1999-2020 BSI
-[*] Sun May 17 18:36:44 2020
+[*] Wed May 20 06:19:38 2020
 [*]
-[dumpfile] "/src/dune/FpgaPlay/test030-nvmewrite/sim/simu/test.ghw"
-[dumpfile_mtime] "Sun May 17 17:30:50 2020"
-[dumpfile_size] 3698502
-[savefile] "/src/dune/FpgaPlay/test030-nvmewrite/sim/testbench/test020-write.sav"
-[timestart] 0
+[dumpfile] "/src/dune/FpgaPlay/test031-nvmewrite/sim/simu/test.ghw"
+[dumpfile_mtime] "Wed May 20 06:06:17 2020"
+[dumpfile_size] 2834231
+[savefile] "/src/dune/FpgaPlay/test031-nvmewrite/sim/testbench/test020-write.sav"
+[timestart] 378700000
 [size] 1920 1171
 [pos] -1 -1
-*-26.418455 145000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+*-26.418455 571000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 [treeopen] top.
 [treeopen] top.test.
 [treeopen] top.test.axil.
@@ -17,8 +17,9 @@
 [treeopen] top.test.nvmestorage0.
 [treeopen] top.test.nvmestorage0.data0.
 [treeopen] top.test.nvmestorage0.datain.
+[treeopen] top.test.nvmestorage0.nvme0send.
 [treeopen] top.test.nvmestorage0.nvmestorageunit0.
-[treeopen] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.
+[treeopen] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.requestout.
 [treeopen] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.buffers.[0].
 [treeopen] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.buffers.[1].
 [treeopen] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.datain.
@@ -36,8 +37,8 @@
 [treeopen] top.test.nvmestorage0.nvmestorageunit0.streamrecv.[2].
 [treeopen] top.test.nvmestorage0.nvmestorageunit0.streamsend.[0].
 [treeopen] top.test.nvmestorage0.nvmestorageunit0.streamsend.[2].
-[sst_width] 290
-[signals_width] 702
+[sst_width] 259
+[signals_width] 806
 [sst_expanded] 1
 [sst_vpaned_height] 768
 @28
@@ -56,12 +57,14 @@ top.test.nvmestorage0.nvmestorageunit0.reset_local
 @800200
 -Host
 @28
+top.test.hostsendready
 top.test.hostsend.valid
 top.test.hostsend.last
 @22
 #{top.test.hostsend.keep[15:0]} top.test.hostsend.keep[15] top.test.hostsend.keep[14] top.test.hostsend.keep[13] top.test.hostsend.keep[12] top.test.hostsend.keep[11] top.test.hostsend.keep[10] top.test.hostsend.keep[9] top.test.hostsend.keep[8] top.test.hostsend.keep[7] top.test.hostsend.keep[6] top.test.hostsend.keep[5] top.test.hostsend.keep[4] top.test.hostsend.keep[3] top.test.hostsend.keep[2] top.test.hostsend.keep[1] top.test.hostsend.keep[0]
 #{top.test.hostsend.data[127:0]} top.test.hostsend.data[127] top.test.hostsend.data[126] top.test.hostsend.data[125] top.test.hostsend.data[124] top.test.hostsend.data[123] top.test.hostsend.data[122] top.test.hostsend.data[121] top.test.hostsend.data[120] top.test.hostsend.data[119] top.test.hostsend.data[118] top.test.hostsend.data[117] top.test.hostsend.data[116] top.test.hostsend.data[115] top.test.hostsend.data[114] top.test.hostsend.data[113] top.test.hostsend.data[112] top.test.hostsend.data[111] top.test.hostsend.data[110] top.test.hostsend.data[109] top.test.hostsend.data[108] top.test.hostsend.data[107] top.test.hostsend.data[106] top.test.hostsend.data[105] top.test.hostsend.data[104] top.test.hostsend.data[103] top.test.hostsend.data[102] top.test.hostsend.data[101] top.test.hostsend.data[100] top.test.hostsend.data[99] top.test.hostsend.data[98] top.test.hostsend.data[97] top.test.hostsend.data[96] top.test.hostsend.data[95] top.test.hostsend.data[94] top.test.hostsend.data[93] top.test.hostsend.data[92] top.test.hostsend.data[91] top.test.hostsend.data[90] top.test.hostsend.data[89] top.test.hostsend.data[88] top.test.hostsend.data[87] top.test.hostsend.data[86] top.test.hostsend.data[85] top.test.hostsend.data[84] top.test.hostsend.data[83] top.test.hostsend.data[82] top.test.hostsend.data[81] top.test.hostsend.data[80] top.test.hostsend.data[79] top.test.hostsend.data[78] top.test.hostsend.data[77] top.test.hostsend.data[76] top.test.hostsend.data[75] top.test.hostsend.data[74] top.test.hostsend.data[73] top.test.hostsend.data[72] top.test.hostsend.data[71] top.test.hostsend.data[70] top.test.hostsend.data[69] top.test.hostsend.data[68] top.test.hostsend.data[67] top.test.hostsend.data[66] top.test.hostsend.data[65] top.test.hostsend.data[64] top.test.hostsend.data[63] top.test.hostsend.data[62] top.test.hostsend.data[61] top.test.hostsend.data[60] top.test.hostsend.data[59] top.test.hostsend.data[58] top.test.hostsend.data[57] top.test.hostsend.data[56] top.test.hostsend.data[55] top.test.hostsend.data[54] top.test.hostsend.data[53] top.test.hostsend.data[52] top.test.hostsend.data[51] top.test.hostsend.data[50] top.test.hostsend.data[49] top.test.hostsend.data[48] top.test.hostsend.data[47] top.test.hostsend.data[46] top.test.hostsend.data[45] top.test.hostsend.data[44] top.test.hostsend.data[43] top.test.hostsend.data[42] top.test.hostsend.data[41] top.test.hostsend.data[40] top.test.hostsend.data[39] top.test.hostsend.data[38] top.test.hostsend.data[37] top.test.hostsend.data[36] top.test.hostsend.data[35] top.test.hostsend.data[34] top.test.hostsend.data[33] top.test.hostsend.data[32] top.test.hostsend.data[31] top.test.hostsend.data[30] top.test.hostsend.data[29] top.test.hostsend.data[28] top.test.hostsend.data[27] top.test.hostsend.data[26] top.test.hostsend.data[25] top.test.hostsend.data[24] top.test.hostsend.data[23] top.test.hostsend.data[22] top.test.hostsend.data[21] top.test.hostsend.data[20] top.test.hostsend.data[19] top.test.hostsend.data[18] top.test.hostsend.data[17] top.test.hostsend.data[16] top.test.hostsend.data[15] top.test.hostsend.data[14] top.test.hostsend.data[13] top.test.hostsend.data[12] top.test.hostsend.data[11] top.test.hostsend.data[10] top.test.hostsend.data[9] top.test.hostsend.data[8] top.test.hostsend.data[7] top.test.hostsend.data[6] top.test.hostsend.data[5] top.test.hostsend.data[4] top.test.hostsend.data[3] top.test.hostsend.data[2] top.test.hostsend.data[1] top.test.hostsend.data[0]
 @28
+top.test.hostrecvready
 top.test.hostrecv.valid
 top.test.hostrecv.last
 @22
@@ -79,18 +82,16 @@ top.test.nvmestate
 top.test.nvmestorage0.nvmestorageunit0.reset_local_counter
 @28
 top.test.nvmestorage0.nvmestorageunit0.reset_local_active
-top.test.nvmestorage0.nvmestorageunit0.writenvmewrite
 @22
 #{top.test.nvmestorage0.nvmestorageunit0.regaddress[7:0]} top.test.nvmestorage0.nvmestorageunit0.regaddress[5] top.test.nvmestorage0.nvmestorageunit0.regaddress[4] top.test.nvmestorage0.nvmestorageunit0.regaddress[3] top.test.nvmestorage0.nvmestorageunit0.regaddress[2] top.test.nvmestorage0.nvmestorageunit0.regaddress[1] top.test.nvmestorage0.nvmestorageunit0.regaddress[0]
+#{top.test.nvmestorage0.nvmestorageunit0.regdatain[31:0]} top.test.nvmestorage0.nvmestorageunit0.regdatain[31] top.test.nvmestorage0.nvmestorageunit0.regdatain[30] top.test.nvmestorage0.nvmestorageunit0.regdatain[29] top.test.nvmestorage0.nvmestorageunit0.regdatain[28] top.test.nvmestorage0.nvmestorageunit0.regdatain[27] top.test.nvmestorage0.nvmestorageunit0.regdatain[26] top.test.nvmestorage0.nvmestorageunit0.regdatain[25] top.test.nvmestorage0.nvmestorageunit0.regdatain[24] top.test.nvmestorage0.nvmestorageunit0.regdatain[23] top.test.nvmestorage0.nvmestorageunit0.regdatain[22] top.test.nvmestorage0.nvmestorageunit0.regdatain[21] top.test.nvmestorage0.nvmestorageunit0.regdatain[20] top.test.nvmestorage0.nvmestorageunit0.regdatain[19] top.test.nvmestorage0.nvmestorageunit0.regdatain[18] top.test.nvmestorage0.nvmestorageunit0.regdatain[17] top.test.nvmestorage0.nvmestorageunit0.regdatain[16] top.test.nvmestorage0.nvmestorageunit0.regdatain[15] top.test.nvmestorage0.nvmestorageunit0.regdatain[14] top.test.nvmestorage0.nvmestorageunit0.regdatain[13] top.test.nvmestorage0.nvmestorageunit0.regdatain[12] top.test.nvmestorage0.nvmestorageunit0.regdatain[11] top.test.nvmestorage0.nvmestorageunit0.regdatain[10] top.test.nvmestorage0.nvmestorageunit0.regdatain[9] top.test.nvmestorage0.nvmestorageunit0.regdatain[8] top.test.nvmestorage0.nvmestorageunit0.regdatain[7] top.test.nvmestorage0.nvmestorageunit0.regdatain[6] top.test.nvmestorage0.nvmestorageunit0.regdatain[5] top.test.nvmestorage0.nvmestorageunit0.regdatain[4] top.test.nvmestorage0.nvmestorageunit0.regdatain[3] top.test.nvmestorage0.nvmestorageunit0.regdatain[2] top.test.nvmestorage0.nvmestorageunit0.regdatain[1] top.test.nvmestorage0.nvmestorageunit0.regdatain[0]
 #{top.test.nvmestorage0.nvmestorageunit0.reg_control[31:0]} top.test.nvmestorage0.nvmestorageunit0.reg_control[31] top.test.nvmestorage0.nvmestorageunit0.reg_control[30] top.test.nvmestorage0.nvmestorageunit0.reg_control[29] top.test.nvmestorage0.nvmestorageunit0.reg_control[28] top.test.nvmestorage0.nvmestorageunit0.reg_control[27] top.test.nvmestorage0.nvmestorageunit0.reg_control[26] top.test.nvmestorage0.nvmestorageunit0.reg_control[25] top.test.nvmestorage0.nvmestorageunit0.reg_control[24] top.test.nvmestorage0.nvmestorageunit0.reg_control[23] top.test.nvmestorage0.nvmestorageunit0.reg_control[22] top.test.nvmestorage0.nvmestorageunit0.reg_control[21] top.test.nvmestorage0.nvmestorageunit0.reg_control[20] top.test.nvmestorage0.nvmestorageunit0.reg_control[19] top.test.nvmestorage0.nvmestorageunit0.reg_control[18] top.test.nvmestorage0.nvmestorageunit0.reg_control[17] top.test.nvmestorage0.nvmestorageunit0.reg_control[16] top.test.nvmestorage0.nvmestorageunit0.reg_control[15] top.test.nvmestorage0.nvmestorageunit0.reg_control[14] top.test.nvmestorage0.nvmestorageunit0.reg_control[13] top.test.nvmestorage0.nvmestorageunit0.reg_control[12] top.test.nvmestorage0.nvmestorageunit0.reg_control[11] top.test.nvmestorage0.nvmestorageunit0.reg_control[10] top.test.nvmestorage0.nvmestorageunit0.reg_control[9] top.test.nvmestorage0.nvmestorageunit0.reg_control[8] top.test.nvmestorage0.nvmestorageunit0.reg_control[7] top.test.nvmestorage0.nvmestorageunit0.reg_control[6] top.test.nvmestorage0.nvmestorageunit0.reg_control[5] top.test.nvmestorage0.nvmestorageunit0.reg_control[4] top.test.nvmestorage0.nvmestorageunit0.reg_control[3] top.test.nvmestorage0.nvmestorageunit0.reg_control[2] top.test.nvmestorage0.nvmestorageunit0.reg_control[1] top.test.nvmestorage0.nvmestorageunit0.reg_control[0]
-@23
 #{top.test.nvmestorage0.nvmestorageunit0.reg_status[31:0]} top.test.nvmestorage0.nvmestorageunit0.reg_status[31] top.test.nvmestorage0.nvmestorageunit0.reg_status[30] top.test.nvmestorage0.nvmestorageunit0.reg_status[29] top.test.nvmestorage0.nvmestorageunit0.reg_status[28] top.test.nvmestorage0.nvmestorageunit0.reg_status[27] top.test.nvmestorage0.nvmestorageunit0.reg_status[26] top.test.nvmestorage0.nvmestorageunit0.reg_status[25] top.test.nvmestorage0.nvmestorageunit0.reg_status[24] top.test.nvmestorage0.nvmestorageunit0.reg_status[23] top.test.nvmestorage0.nvmestorageunit0.reg_status[22] top.test.nvmestorage0.nvmestorageunit0.reg_status[21] top.test.nvmestorage0.nvmestorageunit0.reg_status[20] top.test.nvmestorage0.nvmestorageunit0.reg_status[19] top.test.nvmestorage0.nvmestorageunit0.reg_status[18] top.test.nvmestorage0.nvmestorageunit0.reg_status[17] top.test.nvmestorage0.nvmestorageunit0.reg_status[16] top.test.nvmestorage0.nvmestorageunit0.reg_status[15] top.test.nvmestorage0.nvmestorageunit0.reg_status[14] top.test.nvmestorage0.nvmestorageunit0.reg_status[13] top.test.nvmestorage0.nvmestorageunit0.reg_status[12] top.test.nvmestorage0.nvmestorageunit0.reg_status[11] top.test.nvmestorage0.nvmestorageunit0.reg_status[10] top.test.nvmestorage0.nvmestorageunit0.reg_status[9] top.test.nvmestorage0.nvmestorageunit0.reg_status[8] top.test.nvmestorage0.nvmestorageunit0.reg_status[7] top.test.nvmestorage0.nvmestorageunit0.reg_status[6] top.test.nvmestorage0.nvmestorageunit0.reg_status[5] top.test.nvmestorage0.nvmestorageunit0.reg_status[4] top.test.nvmestorage0.nvmestorageunit0.reg_status[3] top.test.nvmestorage0.nvmestorageunit0.reg_status[2] top.test.nvmestorage0.nvmestorageunit0.reg_status[1] top.test.nvmestorage0.nvmestorageunit0.reg_status[0]
-@22
-#{top.test.nvmestorage0.nvmestorageunit1.reg_control[31:0]} top.test.nvmestorage0.nvmestorageunit1.reg_control[31] top.test.nvmestorage0.nvmestorageunit1.reg_control[30] top.test.nvmestorage0.nvmestorageunit1.reg_control[29] top.test.nvmestorage0.nvmestorageunit1.reg_control[28] top.test.nvmestorage0.nvmestorageunit1.reg_control[27] top.test.nvmestorage0.nvmestorageunit1.reg_control[26] top.test.nvmestorage0.nvmestorageunit1.reg_control[25] top.test.nvmestorage0.nvmestorageunit1.reg_control[24] top.test.nvmestorage0.nvmestorageunit1.reg_control[23] top.test.nvmestorage0.nvmestorageunit1.reg_control[22] top.test.nvmestorage0.nvmestorageunit1.reg_control[21] top.test.nvmestorage0.nvmestorageunit1.reg_control[20] top.test.nvmestorage0.nvmestorageunit1.reg_control[19] top.test.nvmestorage0.nvmestorageunit1.reg_control[18] top.test.nvmestorage0.nvmestorageunit1.reg_control[17] top.test.nvmestorage0.nvmestorageunit1.reg_control[16] top.test.nvmestorage0.nvmestorageunit1.reg_control[15] top.test.nvmestorage0.nvmestorageunit1.reg_control[14] top.test.nvmestorage0.nvmestorageunit1.reg_control[13] top.test.nvmestorage0.nvmestorageunit1.reg_control[12] top.test.nvmestorage0.nvmestorageunit1.reg_control[11] top.test.nvmestorage0.nvmestorageunit1.reg_control[10] top.test.nvmestorage0.nvmestorageunit1.reg_control[9] top.test.nvmestorage0.nvmestorageunit1.reg_control[8] top.test.nvmestorage0.nvmestorageunit1.reg_control[7] top.test.nvmestorage0.nvmestorageunit1.reg_control[6] top.test.nvmestorage0.nvmestorageunit1.reg_control[5] top.test.nvmestorage0.nvmestorageunit1.reg_control[4] top.test.nvmestorage0.nvmestorageunit1.reg_control[3] top.test.nvmestorage0.nvmestorageunit1.reg_control[2] top.test.nvmestorage0.nvmestorageunit1.reg_control[1] top.test.nvmestorage0.nvmestorageunit1.reg_control[0]
 @28
 top.test.axil.toslave.arvalid
 top.test.axil.tomaster.arready
 top.test.axil.tomaster.awready
+top.test.nvmestorage0.axilin.wvalid
 top.test.axil.tomaster.wready
 top.test.axil.toslave.rready
 top.test.axil.tomaster.rvalid
@@ -98,25 +99,40 @@ top.test.axil.tomaster.rvalid
 #{top.test.axil.tomaster.rdata[31:0]} top.test.axil.tomaster.rdata[31] top.test.axil.tomaster.rdata[30] top.test.axil.tomaster.rdata[29] top.test.axil.tomaster.rdata[28] top.test.axil.tomaster.rdata[27] top.test.axil.tomaster.rdata[26] top.test.axil.tomaster.rdata[25] top.test.axil.tomaster.rdata[24] top.test.axil.tomaster.rdata[23] top.test.axil.tomaster.rdata[22] top.test.axil.tomaster.rdata[21] top.test.axil.tomaster.rdata[20] top.test.axil.tomaster.rdata[19] top.test.axil.tomaster.rdata[18] top.test.axil.tomaster.rdata[17] top.test.axil.tomaster.rdata[16] top.test.axil.tomaster.rdata[15] top.test.axil.tomaster.rdata[14] top.test.axil.tomaster.rdata[13] top.test.axil.tomaster.rdata[12] top.test.axil.tomaster.rdata[11] top.test.axil.tomaster.rdata[10] top.test.axil.tomaster.rdata[9] top.test.axil.tomaster.rdata[8] top.test.axil.tomaster.rdata[7] top.test.axil.tomaster.rdata[6] top.test.axil.tomaster.rdata[5] top.test.axil.tomaster.rdata[4] top.test.axil.tomaster.rdata[3] top.test.axil.tomaster.rdata[2] top.test.axil.tomaster.rdata[1] top.test.axil.tomaster.rdata[0]
 @1000200
 -Registers
-@c00200
+@800200
+-NvmeRead
+@22
+#{top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.regaddress[3:0]} top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.regaddress[3] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.regaddress[2] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.regaddress[1] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.regaddress[0]
+#{top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[31:0]} top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[31] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[30] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[29] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[28] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[27] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[26] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[25] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[24] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[23] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[22] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[21] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[20] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[19] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[18] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[17] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[16] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[15] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[14] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[13] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[12] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[11] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[10] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[9] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[8] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[7] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[6] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[5] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[4] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[3] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[2] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[1] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.control[0]
+#{top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[31:0]} top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[31] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[30] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[29] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[28] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[27] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[26] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[25] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[24] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[23] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[22] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[21] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[20] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[19] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[18] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[17] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[16] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[15] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[14] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[13] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[12] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[11] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[10] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[9] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[8] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[7] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[6] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[5] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[4] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[3] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[2] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[1] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datastart[0]
+#{top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[31:0]} top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[31] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[30] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[29] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[28] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[27] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[26] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[25] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[24] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[23] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[22] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[21] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[20] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[19] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[18] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[17] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[16] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[15] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[14] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[13] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[12] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[11] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[10] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[9] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[8] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[7] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[6] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[5] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[4] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[3] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[2] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[1] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.datasize[0]
+@420
+top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.state
+@28
+top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.requestout.ready
+top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.requestout.valid
+top.test.nvmestorage0.nvmestorageunit0.gen03.nvmeread0.requestout.last
+@1000200
+-NvmeRead
+@800200
 -Switch
 @28
+top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamout[0].ready
 top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].valid
 @22
 #{top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[127:0]} top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[127] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[126] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[125] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[124] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[123] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[122] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[121] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[120] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[119] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[118] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[117] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[116] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[115] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[114] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[113] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[112] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[111] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[110] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[109] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[108] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[107] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[106] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[105] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[104] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[103] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[102] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[101] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[100] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[99] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[98] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[97] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[96] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[95] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[94] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[93] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[92] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[91] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[90] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[89] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[88] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[87] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[86] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[85] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[84] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[83] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[82] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[81] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[80] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[79] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[78] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[77] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[76] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[75] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[74] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[73] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[72] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[71] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[70] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[69] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[68] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[67] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[66] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[65] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[64] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[63] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[62] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[61] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[60] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[59] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[58] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[57] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[56] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[55] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[54] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[53] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[52] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[51] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[50] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[49] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[48] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[47] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[46] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[45] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[44] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[43] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[42] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[41] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[40] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[39] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[38] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[37] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[36] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[35] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[34] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[33] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[32] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[31] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[30] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[29] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[28] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[27] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[26] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[25] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[24] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[23] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[22] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[21] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[20] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[19] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[18] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[17] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[16] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[15] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[14] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[13] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[12] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[11] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[10] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[9] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[8] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[7] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[6] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[5] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[4] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[3] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[2] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[1] top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[0].data[0]
 @28
-top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamout[0].ready
-top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[1].valid
 top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamout[1].ready
-top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[2].valid
+top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[1].valid
 top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamout[2].ready
+top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.streamin[2].valid
 @420
 top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.switchstate
 top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.switchin
 top.test.nvmestorage0.nvmestorageunit0.gen03.streamswitch0.switchout
-@1401200
+@1000200
 -Switch
-@c00200
+@800200
 -QueueRam
 @420
 top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.state
@@ -133,7 +149,7 @@ top.test.nvmestorage0.nvmestorageunit0.streamsend[2].last
 @22
 #{top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[127:0]} top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[127] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[126] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[125] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[124] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[123] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[122] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[121] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[120] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[119] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[118] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[117] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[116] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[115] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[114] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[113] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[112] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[111] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[110] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[109] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[108] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[107] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[106] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[105] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[104] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[103] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[102] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[101] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[100] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[99] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[98] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[97] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[96] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[95] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[94] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[93] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[92] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[91] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[90] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[89] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[88] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[87] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[86] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[85] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[84] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[83] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[82] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[81] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[80] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[79] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[78] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[77] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[76] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[75] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[74] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[73] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[72] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[71] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[70] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[69] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[68] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[67] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[66] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[65] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[64] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[63] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[62] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[61] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[60] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[59] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[58] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[57] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[56] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[55] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[54] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[53] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[52] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[51] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[50] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[49] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[48] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[47] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[46] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[45] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[44] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[43] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[42] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[41] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[40] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[39] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[38] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[37] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[36] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[35] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[34] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[33] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[32] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[31] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[30] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[29] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[28] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[27] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[26] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[25] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[24] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[23] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[22] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[21] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[20] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[19] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[18] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[17] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[16] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[15] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[14] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[13] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[12] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[11] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[10] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[9] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[8] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[7] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[6] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[5] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[4] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[3] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[2] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[1] top.test.nvmestorage0.nvmestorageunit0.streamsend[2].data[0]
 #{top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[15:0]} top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[15] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[14] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[13] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[12] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[11] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[10] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[9] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[8] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[7] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[6] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[5] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[4] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[3] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[2] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[1] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmequeues0.requesthead1.requesterid[0]
-@1401200
+@1000200
 -QueueRam
 @800200
 -NvmeStorage
@@ -149,9 +165,32 @@ top.test.nvmestorage0.data0.valid
 top.test.nvmestorage0.data0.last
 @22
 #{top.test.nvmestorage0.data0.data[127:0]} top.test.nvmestorage0.data0.data[127] top.test.nvmestorage0.data0.data[126] top.test.nvmestorage0.data0.data[125] top.test.nvmestorage0.data0.data[124] top.test.nvmestorage0.data0.data[123] top.test.nvmestorage0.data0.data[122] top.test.nvmestorage0.data0.data[121] top.test.nvmestorage0.data0.data[120] top.test.nvmestorage0.data0.data[119] top.test.nvmestorage0.data0.data[118] top.test.nvmestorage0.data0.data[117] top.test.nvmestorage0.data0.data[116] top.test.nvmestorage0.data0.data[115] top.test.nvmestorage0.data0.data[114] top.test.nvmestorage0.data0.data[113] top.test.nvmestorage0.data0.data[112] top.test.nvmestorage0.data0.data[111] top.test.nvmestorage0.data0.data[110] top.test.nvmestorage0.data0.data[109] top.test.nvmestorage0.data0.data[108] top.test.nvmestorage0.data0.data[107] top.test.nvmestorage0.data0.data[106] top.test.nvmestorage0.data0.data[105] top.test.nvmestorage0.data0.data[104] top.test.nvmestorage0.data0.data[103] top.test.nvmestorage0.data0.data[102] top.test.nvmestorage0.data0.data[101] top.test.nvmestorage0.data0.data[100] top.test.nvmestorage0.data0.data[99] top.test.nvmestorage0.data0.data[98] top.test.nvmestorage0.data0.data[97] top.test.nvmestorage0.data0.data[96] top.test.nvmestorage0.data0.data[95] top.test.nvmestorage0.data0.data[94] top.test.nvmestorage0.data0.data[93] top.test.nvmestorage0.data0.data[92] top.test.nvmestorage0.data0.data[91] top.test.nvmestorage0.data0.data[90] top.test.nvmestorage0.data0.data[89] top.test.nvmestorage0.data0.data[88] top.test.nvmestorage0.data0.data[87] top.test.nvmestorage0.data0.data[86] top.test.nvmestorage0.data0.data[85] top.test.nvmestorage0.data0.data[84] top.test.nvmestorage0.data0.data[83] top.test.nvmestorage0.data0.data[82] top.test.nvmestorage0.data0.data[81] top.test.nvmestorage0.data0.data[80] top.test.nvmestorage0.data0.data[79] top.test.nvmestorage0.data0.data[78] top.test.nvmestorage0.data0.data[77] top.test.nvmestorage0.data0.data[76] top.test.nvmestorage0.data0.data[75] top.test.nvmestorage0.data0.data[74] top.test.nvmestorage0.data0.data[73] top.test.nvmestorage0.data0.data[72] top.test.nvmestorage0.data0.data[71] top.test.nvmestorage0.data0.data[70] top.test.nvmestorage0.data0.data[69] top.test.nvmestorage0.data0.data[68] top.test.nvmestorage0.data0.data[67] top.test.nvmestorage0.data0.data[66] top.test.nvmestorage0.data0.data[65] top.test.nvmestorage0.data0.data[64] top.test.nvmestorage0.data0.data[63] top.test.nvmestorage0.data0.data[62] top.test.nvmestorage0.data0.data[61] top.test.nvmestorage0.data0.data[60] top.test.nvmestorage0.data0.data[59] top.test.nvmestorage0.data0.data[58] top.test.nvmestorage0.data0.data[57] top.test.nvmestorage0.data0.data[56] top.test.nvmestorage0.data0.data[55] top.test.nvmestorage0.data0.data[54] top.test.nvmestorage0.data0.data[53] top.test.nvmestorage0.data0.data[52] top.test.nvmestorage0.data0.data[51] top.test.nvmestorage0.data0.data[50] top.test.nvmestorage0.data0.data[49] top.test.nvmestorage0.data0.data[48] top.test.nvmestorage0.data0.data[47] top.test.nvmestorage0.data0.data[46] top.test.nvmestorage0.data0.data[45] top.test.nvmestorage0.data0.data[44] top.test.nvmestorage0.data0.data[43] top.test.nvmestorage0.data0.data[42] top.test.nvmestorage0.data0.data[41] top.test.nvmestorage0.data0.data[40] top.test.nvmestorage0.data0.data[39] top.test.nvmestorage0.data0.data[38] top.test.nvmestorage0.data0.data[37] top.test.nvmestorage0.data0.data[36] top.test.nvmestorage0.data0.data[35] top.test.nvmestorage0.data0.data[34] top.test.nvmestorage0.data0.data[33] top.test.nvmestorage0.data0.data[32] top.test.nvmestorage0.data0.data[31] top.test.nvmestorage0.data0.data[30] top.test.nvmestorage0.data0.data[29] top.test.nvmestorage0.data0.data[28] top.test.nvmestorage0.data0.data[27] top.test.nvmestorage0.data0.data[26] top.test.nvmestorage0.data0.data[25] top.test.nvmestorage0.data0.data[24] top.test.nvmestorage0.data0.data[23] top.test.nvmestorage0.data0.data[22] top.test.nvmestorage0.data0.data[21] top.test.nvmestorage0.data0.data[20] top.test.nvmestorage0.data0.data[19] top.test.nvmestorage0.data0.data[18] top.test.nvmestorage0.data0.data[17] top.test.nvmestorage0.data0.data[16] top.test.nvmestorage0.data0.data[15] top.test.nvmestorage0.data0.data[14] top.test.nvmestorage0.data0.data[13] top.test.nvmestorage0.data0.data[12] top.test.nvmestorage0.data0.data[11] top.test.nvmestorage0.data0.data[10] top.test.nvmestorage0.data0.data[9] top.test.nvmestorage0.data0.data[8] top.test.nvmestorage0.data0.data[7] top.test.nvmestorage0.data0.data[6] top.test.nvmestorage0.data0.data[5] top.test.nvmestorage0.data0.data[4] top.test.nvmestorage0.data0.data[3] top.test.nvmestorage0.data0.data[2] top.test.nvmestorage0.data0.data[1] top.test.nvmestorage0.data0.data[0]
+@28
+top.test.nvmestorage0.nvme0send.ready
+top.test.nvmestorage0.nvme0send.valid
+top.test.nvmestorage0.nvme1send.ready
+top.test.nvmestorage0.nvme1send.valid
+top.test.nvmestorage0.hostrecv0.ready
 @1000200
 -NvmeStorage
 @800200
+-NvmeStorageUnit
+@420
+top.test.nvmestorage0.nvmestorageunit0.pciestreammux0.muxstate
+@28
+top.test.nvmestorage0.nvmestorageunit0.hostrecv.ready
+@29
+top.test.nvmestorage0.nvmestorageunit0.hostrecv.valid
+@28
+top.test.nvmestorage0.nvmestorageunit0.pciestreammux0.stream2in.ready
+top.test.nvmestorage0.nvmestorageunit0.pciestreammux0.stream2in.valid
+top.test.nvmestorage0.nvmestorageunit0.pciestreammux0.stream3in.ready
+top.test.nvmestorage0.nvmestorageunit0.pciestreammux0.stream3in.valid
+top.test.nvmestorage0.nvmestorageunit0.pciestreammux0.stream1out.ready
+top.test.nvmestorage0.nvmestorageunit0.pciestreammux0.stream1out.valid
+@1000200
+-NvmeStorageUnit
+@c00200
 -NvmeWrite
 @28
 top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.enable
@@ -239,16 +278,10 @@ top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.last
 @22
 #{top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.keep[15:0]} top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.keep[3] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.keep[2] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.keep[1] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.keep[0]
 #{top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[127:0]} top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[127] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[126] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[125] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[124] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[123] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[122] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[121] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[120] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[119] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[118] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[117] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[116] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[115] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[114] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[113] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[112] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[111] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[110] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[109] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[108] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[107] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[106] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[105] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[104] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[103] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[102] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[101] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[100] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[99] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[98] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[97] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[96] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[95] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[94] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[93] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[92] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[91] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[90] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[89] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[88] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[87] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[86] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[85] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[84] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[83] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[82] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[81] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[80] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[79] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[78] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[77] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[76] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[75] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[74] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[73] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[72] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[71] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[70] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[69] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[68] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[67] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[66] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[65] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[64] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[63] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[62] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[61] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[60] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[59] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[58] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[57] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[56] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[55] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[54] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[53] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[52] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[51] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[50] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[49] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[48] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[47] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[46] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[45] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[44] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[43] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[42] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[41] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[40] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[39] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[38] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[37] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[36] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[35] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[34] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[33] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[32] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[31] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[30] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[29] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[28] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[27] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[26] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[25] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[24] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[23] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[22] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[21] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[20] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[19] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[18] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[17] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[16] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[15] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[14] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[13] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[12] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[11] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[10] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[9] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[8] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[7] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[6] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[5] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[4] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[3] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[2] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[1] top.test.nvmestorage0.nvmestorageunit0.gen03.nvmewrite0.memreplyout.data[0]
-@1000200
+@1401200
 -NvmeWrite
-@c00200
+@800200
 -NvmeSim
-@420
-top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.state
-@28
-top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.waitingforreply
-@22
-#{top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[10:0]} top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[10] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[9] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[8] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[7] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[6] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[5] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[4] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[3] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[2] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[1] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[0]
 @28
 top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreq.ready
 top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreq.valid
@@ -261,7 +294,15 @@ top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.valid
 top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.last
 @22
 #{top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[127:0]} top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[127] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[126] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[125] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[124] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[123] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[122] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[121] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[120] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[119] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[118] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[117] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[116] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[115] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[114] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[113] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[112] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[111] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[110] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[109] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[108] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[107] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[106] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[105] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[104] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[103] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[102] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[101] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[100] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[99] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[98] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[97] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[96] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[95] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[94] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[93] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[92] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[91] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[90] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[89] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[88] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[87] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[86] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[85] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[84] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[83] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[82] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[81] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[80] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[79] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[78] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[77] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[76] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[75] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[74] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[73] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[72] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[71] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[70] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[69] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[68] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[67] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[66] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[65] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[64] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[63] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[62] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[61] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[60] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[59] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[58] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[57] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[56] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[55] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[54] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[53] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[52] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[51] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[50] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[49] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[48] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[47] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[46] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[45] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[44] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[43] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[42] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[41] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[40] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[39] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[38] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[37] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[36] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[35] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[34] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[33] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[32] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[31] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[30] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[29] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[28] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[27] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[26] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[25] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[24] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[23] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[22] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[21] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[20] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[19] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[18] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[17] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[16] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[15] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[14] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[13] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[12] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[11] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[10] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[9] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[8] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[7] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[6] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[5] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[4] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[3] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[2] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[1] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.hostreply.data[0]
-#{top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.queue_pos[9:0]} top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.queue_pos[2] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.queue_pos[1] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.queue_pos[0]
+@420
+top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reqstate
+top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.queuewritein
+top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.queuewriteout
+top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.state
+@28
+top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.waitingforreply
+@22
+#{top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[10:0]} top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[10] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[9] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[8] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[7] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[6] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[5] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[4] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[3] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[2] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[1] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.count[0]
 #{top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[31:0]} top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[31] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[30] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[29] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[28] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[27] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[26] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[25] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[24] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[23] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[22] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[21] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[20] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[19] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[18] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[17] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[16] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[15] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[14] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[13] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[12] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[11] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[10] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[9] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[8] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[7] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[6] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[5] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[4] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[3] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[2] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[1] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.reg_io1_queue[0]
 @28
 top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereq.ready
@@ -281,7 +322,7 @@ top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.valid
 top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.last
 @22
 #{top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[127:0]} top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[127] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[126] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[125] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[124] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[123] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[122] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[121] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[120] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[119] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[118] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[117] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[116] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[115] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[114] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[113] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[112] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[111] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[110] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[109] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[108] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[107] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[106] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[105] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[104] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[103] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[102] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[101] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[100] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[99] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[98] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[97] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[96] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[95] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[94] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[93] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[92] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[91] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[90] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[89] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[88] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[87] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[86] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[85] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[84] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[83] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[82] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[81] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[80] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[79] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[78] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[77] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[76] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[75] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[74] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[73] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[72] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[71] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[70] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[69] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[68] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[67] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[66] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[65] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[64] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[63] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[62] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[61] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[60] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[59] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[58] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[57] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[56] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[55] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[54] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[53] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[52] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[51] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[50] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[49] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[48] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[47] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[46] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[45] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[44] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[43] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[42] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[41] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[40] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[39] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[38] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[37] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[36] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[35] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[34] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[33] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[32] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[31] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[30] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[29] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[28] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[27] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[26] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[25] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[24] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[23] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[22] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[21] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[20] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[19] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[18] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[17] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[16] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[15] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[14] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[13] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[12] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[11] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[10] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[9] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[8] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[7] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[6] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[5] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[4] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[3] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[2] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[1] top.test.nvmestorage0.nvmestorageunit0.sim.nvmesim0.nvmereply.data[0]
-@1401200
+@1000200
 -NvmeSim
 [pattern_trace] 1
 [pattern_trace] 0
index 5e5992b3e8105a82aa43f253565f5ce8ffef4ef8..bd6b77f640afd02700ea51a41fa4aa55f682e659 100644 (file)
@@ -165,7 +165,7 @@ begin
                axil.toSlave <= ((others => '0'), (others => '0'), '0', (others => '0'), (others => '0'), '0', '0', (others => '0'), (others => '0'), '0', '0');
                wait until reset = '0';
 
-               if(True) then
+               if(False) then
                        -- Test Read/Write NvmeStorageUnit's registers
                        wait for 100 ns;
                        busWrite(clk, axil.toSlave, axil.toMaster, 16#0004#, 16#40000000#);
@@ -188,7 +188,7 @@ begin
                        wait;
                end if;
                
-               if(True) then
+               if(False) then
                        -- Perform local reset
                        wait for 100 ns;
                        busWrite(clk, axil.toSlave, axil.toMaster, 4, 16#00000001#);
@@ -199,23 +199,61 @@ begin
                        busRead(clk, axil.toSlave, axil.toMaster, 16#0008#);
                end if;
                
-               if(True) then
+               if(False) then
                        -- Start off TestData source and start writing data to Nvme
                        wait for 100 ns;
                        sendData <= '1';
 
                        -- Write to NvmeStorage control register to start NvmeWrite processing
                        wait for 100 ns;
-                       --busWrite(clk, axil.toSlave, axil.toMaster, 16#0044#, 2);              -- Number of blocks
-                       busWrite(clk, axil.toSlave, axil.toMaster, 16#0044#, 16);               -- Number of blocks
-                       busWrite(clk, axil.toSlave, axil.toMaster, 16#0004#, 16#00000004#);     -- Start
+                       --busWrite(clk, axil.toSlave, axil.toMaster, 16#0144#, 2);              -- Number of blocks
+                       busWrite(clk, axil.toSlave, axil.toMaster, 16#0144#, 16);               -- Number of blocks
+                       busWrite(clk, axil.toSlave, axil.toMaster, 16#0104#, 16#00000004#);     -- Start
 
                        wait for 11000 ns;
-                       --busWrite(clk, axil.toSlave, axil.toMaster, 16#0004#, 16#00000000#);   -- Stop
-                       --busWrite(clk, axil.toSlave, axil.toMaster, 16#0004#, 16#00000004#);   -- Start
+                       --busWrite(clk, axil.toSlave, axil.toMaster, 16#0104#, 16#00000000#);   -- Stop
+                       --busWrite(clk, axil.toSlave, axil.toMaster, 16#0104#, 16#00000004#);   -- Start
                        wait;   
                end if;
                
+               if(True) then
+                       -- Start off Reading data from block 8
+                       wait for 100 ns;
+
+                       busWrite(clk, axil.toSlave, axil.toMaster, 16#0188#, 8);                -- Start blocks
+                       busWrite(clk, axil.toSlave, axil.toMaster, 16#018C#, 1);                -- Number blocks
+                       busRead(clk, axil.toSlave, axil.toMaster, 16#0188#);
+
+                       busWrite(clk, axil.toSlave, axil.toMaster, 16#0180#, 16#00000001#);     -- Start
+
+                       wait for 11000 ns;
+                       --busWrite(clk, axil.toSlave, axil.toMaster, 16#0180#, 16#00000000#);   -- Stop
+                       wait;   
+               end if;
+               
+               if(False) then
+                       -- Send command to IO queue to read a block
+                       wait for 100 ns;
+
+                       -- Write to DataQueue
+                       pcieRequestWriteHead(clk, hostReq, 1, 1, 16#02010000#, 16#22#, 16);
+
+                       wait until rising_edge(clk) and (hostReq.ready = '1');
+                       hostReq.data <= zeros(64) & x"00000001" & x"01000002";  -- Namespace 1, From stream1, opcode 2
+                       wait until rising_edge(clk) and (hostReq.ready = '1');
+                       hostReq.data <= zeros(32) & x"01F00000" & zeros(64);    -- Data source address to host
+                       wait until rising_edge(clk) and (hostReq.ready = '1');
+                       hostReq.data <= zeros(32) & x"00000000" & zeros(64);    -- Block number
+                       wait until rising_edge(clk) and (hostReq.ready = '1');
+                       hostReq.data <= zeros(96) & to_stl(0, 32);              -- WriteMethod, NumBlocks (0 is 1 block)
+                       hostReq.last <= '1';
+                       wait until rising_edge(clk) and (hostReq.ready = '1');
+                       hostReq.last <= '0';
+                       hostReq.valid <= '0';
+                       
+                       wait;
+               end if;
+
                --wait for 1000 ns;
                
                -- Perform local reset
@@ -235,10 +273,10 @@ begin
                --pcieRequestWrite(clk, hostReq, 1, 1, 16#1000#, 16#22#, 1, 16#40#);
 
                -- Write to AdminQueue
-               pcieRequestWrite(clk, hostReq, 1, 1, 16#02000000#, 16#22#, 16, 16#00000010#);
+               --pcieRequestWrite(clk, hostReq, 1, 1, 16#02000000#, 16#22#, 16, 16#00000010#);
 
                -- Write to DataQueue
-               pcieRequestWrite(clk, hostReq, 1, 1, 16#02010000#, 16#22#, 16, 16#00000010#);
+               --pcieRequestWrite(clk, hostReq, 1, 1, 16#02010000#, 16#22#, 16, 16#00000010#);
 
                -- Perform NVMe data write
                -- Write to DataWriteQueue doorbell register
@@ -258,8 +296,8 @@ begin
                dataOutReady    => dataStreamReady
        );      
 
-       axisConnect(hostSend1, hostSend, hostSendReady);
-       axisConnect(hostRecv, hostrecvReady, hostRecv1);
+       axisConnect(hostSend, hostSendReady, hostSend1);
+       axisConnect(hostRecv1, hostRecv, hostrecvReady);
        
        hostReply.ready <= '1';
        
index 9a677b95321063136b9f1044d8d42187f406dfde..91b730c18da48945797c6f8743fb24787ceff584 100644 (file)
@@ -248,6 +248,9 @@ begin
        axil_reset <= not axil_reset_n;
        
        nvmeStorage0 : NvmeStorage
+       generic map (
+               ClockPeriod     => 8 ns
+       )
        port map (
                clk             => axil_clk,
                reset           => axil_reset,
index 1b5d4d23004fccf679f915161accc8920e98c559..83a78c27095a7c1eca3db6ec1e2a6113fce60c86 100644 (file)
@@ -8,7 +8,6 @@
 #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
-#set_clock_groups -name async_pcie_host_nvme -asynchronous -group {pci_clk} -group {nvme_clk}\r
 set_clock_groups -name async_host_nvme -asynchronous -group [get_clocks -include_generated_clocks pci_clk] -group [get_clocks -include_generated_clocks nvme_clk]\r
 \r
 # Asynchronous resets\r
@@ -21,7 +20,7 @@ set_false_path -through [get_pins pcie_host0/inst/pcie3_ip_i/U0/pcie3_uscale_top
 set_false_path -through [get_nets pcie_host0/inst/cfg_max*]\r
 set_false_path -to [get_pins -hier *sync_reg[0]/D]\r
 \r
-set_output_delay -clock [get_clocks nvme_clk] 0.0 [get_ports -filter NAME=~leds*]\r
+set_output_delay -clock [get_clocks nvme_clk] -max 0.0 [get_ports -filter NAME=~leds*]\r
 set_false_path -to [get_ports -filter NAME=~leds*]\r
 \r
 # General settings\r
diff --git a/src/NvmeRead.vhd b/src/NvmeRead.vhd
new file mode 100644 (file)
index 0000000..4543c6f
--- /dev/null
@@ -0,0 +1,277 @@
+--------------------------------------------------------------------------------
+-- NvmeRead.vhd Nvme Write data module
+-------------------------------------------------------------------------------
+--!
+--! @class     NvmeRead
+--! @author    Terry Barnaby (terry.barnaby@beam.ltd.uk)
+--! @date      2020-05-14
+--! @version   0.4.1
+--!
+--! @brief
+--! This module performs the Nvme read data functionality.
+--!
+--! @details
+--! TBD
+--!
+--! @copyright GNU GPL License
+--! Copyright (c) Beam Ltd, All rights reserved. <br>
+--! This code is free software: you can redistribute it and/or modify
+--! it under the terms of the GNU General Public License as published by
+--! the Free Software Foundation, either version 3 of the License, or
+--! (at your option) any later version.
+--! This program is distributed in the hope that it will be useful,
+--! but WITHOUT ANY WARRANTY; without even the implied warranty of
+--! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--! GNU General Public License for more details. <br>
+--! You should have received a copy of the GNU General Public License
+--! along with this code. If not, see <https://www.gnu.org/licenses/>.
+--!
+library ieee;
+use ieee.std_logic_1164.all;
+use ieee.numeric_std.all;
+
+library unisim;
+use unisim.vcomponents.all;
+
+library work;
+use work.NvmeStoragePkg.all;
+use work.NvmeStorageIntPkg.all;
+
+entity NvmeRead is
+generic(
+       Simulate        : boolean := False;                     --! Generate simulation core
+       BlockSize       : integer := NvmeStorageBlockSize       --! System block size
+);
+port (
+       clk             : in std_logic;                         --! The interface clock line
+       reset           : in std_logic;                         --! The active high reset line
+
+       -- To Nvme Request/reply streams
+       requestOut      : inout AxisStreamType := AxisStreamOutput;     --! To Nvme request stream (3)
+       replyIn         : inout AxisStreamType := AxisStreamInput;      --! from Nvme reply stream
+
+       regWrite        : in std_logic;                         --! Enable write to register
+       regAddress      : in unsigned(3 downto 0);              --! Register to read/write
+       regDataIn       : in std_logic_vector(31 downto 0);     --! Register write data
+       regDataOut      : out std_logic_vector(31 downto 0)     --! Register contents
+);
+end;
+
+architecture Behavioral of NvmeRead is
+
+constant TCQ           : time := 1 ns;
+constant NvmeBlocks    : integer := BlockSize / NvmeBlockSize;         --! The number of Nvme blocks per NvmeStorage system block
+
+subtype RegisterType   is unsigned(31 downto 0);
+
+type StateType         is (STATE_IDLE, STATE_INIT, STATE_RUN, STATE_COMPLETE,
+                               STATE_QUEUE_HEAD, STATE_QUEUE_0, STATE_QUEUE_1, STATE_QUEUE_2, STATE_QUEUE_3,
+                               STATE_WAIT_REPLY);
+type ReplyStateType    is (REPSTATE_IDLE, REPSTATE_INIT, REPSTATE_COMPLETE, REPSTATE_QUEUE_REPLY1, REPSTATE_QUEUE_REPLY2);
+
+signal state           : StateType := STATE_IDLE;
+signal replyState      : ReplyStateType := REPSTATE_QUEUE_REPLY1;
+signal nvmeReplyHead   : NvmeReplyHeadType;
+
+-- Register information
+signal control         : RegisterType := (others => '0');      --! Control register
+signal status          : RegisterType := (others => '0');      --! Status register
+signal dataStart       : RegisterType := (others => '0');      --! The data chunk start position in blocks
+signal dataSize                : RegisterType := (others => '0');      --! The data chunk size in blocks
+signal error           : RegisterType := (others => '0');      --! The system errors status
+
+signal enabled         : std_logic := '0';                                     --! Read is enabled
+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
+
+
+--! Set the fields in the PCIe TLP header
+function setHeader(request: integer; address: integer; count: integer; tag: integer) return std_logic_vector is
+begin
+       return to_stl(set_PcieRequestHeadType(3, request, address, count, tag));
+end function;
+
+begin
+       -- Register access
+       regDataOut      <= std_logic_vector(control) when(regAddress = 0)
+                       else std_logic_vector(status) when(regAddress = 1)
+                       else std_logic_vector(dataStart) when(regAddress = 2)
+                       else std_logic_vector(dataSize) when(regAddress = 3)
+                       else std_logic_vector(error) when(regAddress = 4)
+                       else ones(32);
+       
+       enabled <= control(0);
+       status  <= (others => '0');
+       
+       -- Register process
+       process(clk)
+       begin
+               if(rising_edge(clk)) then
+                       if(reset = '1') then
+                               control         <= (others => '0');
+                               dataStart       <= (others => '0');
+                               dataSize        <= (others => '0');
+                       elsif((regWrite = '1') and (regAddress = 0)) then
+                               control <= unsigned(regDataIn);
+                       elsif((regWrite = '1') and (regAddress = 2)) then
+                               dataStart <= unsigned(regDataIn);
+                       elsif((regWrite = '1') and (regAddress = 3)) then
+                               dataSize <= unsigned(regDataIn);
+                       end if;
+               end if;
+       end process;
+
+
+       nvmeReplyHead <= to_NvmeReplyHeadType(replyIn.data);
+       
+       -- Process data read.
+       process(clk)
+       begin
+               if(rising_edge(clk)) then
+                       if(reset = '1') then
+                               requestOut.valid        <= '0';
+                               requestOut.last         <= '0';
+                               requestOut.keep         <= (others => '1');
+                               numBlocksProc           <= (others => '0');
+                               state                   <= STATE_IDLE;
+                       else
+                               case(state) is
+                               when STATE_IDLE =>
+                                       if(enabled = '1') then
+                                               state <= STATE_INIT;
+                                       end if;
+                               
+                               when STATE_INIT =>
+                                       -- Initialise for next run
+                                       numBlocksProc   <= (others => '0');
+                                       state           <= STATE_RUN;
+                                       
+                               when STATE_RUN =>
+                                       if(enabled = '1') then
+                                               if(numBlocksProc >= dataSize) then
+                                                       state <= STATE_COMPLETE;
+                                               
+                                               else
+                                                       requestOut.data         <= setHeader(1, 16#02020000#, 16, 0);
+                                                       requestOut.valid        <= '1';
+                                                       state                   <= STATE_QUEUE_HEAD;
+                                               end if;
+                                       else
+                                               state <= STATE_COMPLETE;
+                                       end if;
+                               
+                               when STATE_COMPLETE =>
+                                       if(enabled = '0') then
+                                               state <= STATE_IDLE;
+                                       end if;
+
+                               when STATE_QUEUE_HEAD =>
+                                       if(requestOut.valid = '1' and requestOut.ready = '1') then
+                                               requestOut.data <= zeros(64) & x"00000001" & x"06" & to_stl(numBlocksProc(7 downto 0)) & x"0002";       -- Namespace 1, From stream6, opcode 2
+                                               state           <= STATE_QUEUE_0;
+                                       end if;
+
+                               when STATE_QUEUE_0 =>
+                                       if(requestOut.valid = '1' and requestOut.ready = '1') then
+                                               requestOut.data <= zeros(32) & x"01F00000" & zeros(64); -- Data source address to host
+                                               state           <= STATE_QUEUE_1;
+                                       end if;
+
+                               when STATE_QUEUE_1 =>
+                                       if(requestOut.valid = '1' and requestOut.ready = '1') then
+                                               requestOut.data <= zeros(32-log2(NvmeBlocks)) & std_logic_vector(dataStart + numBlocksProc) & zeros(log2(NvmeBlocks) + 64);
+                                               state           <= STATE_QUEUE_2;
+                                       end if;
+
+                               when STATE_QUEUE_2 =>
+                                       if(requestOut.valid = '1' and requestOut.ready = '1') then
+                                               requestOut.data <= zeros(96) & to_stl(NvmeBlocks-1, 32);        -- WriteMethod, NumBlocks (0 is 1 block)
+                                               requestOut.last <= '1';
+                                               numBlocksProc   <= numBlocksProc + 1;
+                                               state           <= STATE_QUEUE_3;
+                                       end if;
+
+                               when STATE_QUEUE_3 =>
+                                       if(requestOut.valid = '1' and requestOut.ready = '1') then
+                                               requestOut.last         <= '0';
+                                               requestOut.valid        <= '0';
+                                               
+                                               state <= STATE_WAIT_REPLY;
+                                       end if;
+
+                               when STATE_WAIT_REPLY =>
+                                       --! Need to wait here
+                                       if(numBlocksProc > numBlocksDone) then
+                                               state <= STATE_WAIT_REPLY;
+                                       else
+                                               state <= STATE_RUN;
+                                       end if;
+
+                               end case;
+                       end if;
+               end if;
+       end process;
+       
+       -- Process replies. This accepts Read request replies from the Nvme storing any errors.
+       process(clk)
+       begin
+               if(rising_edge(clk)) then
+                       if(reset = '1') then
+                               replyIn.ready   <= '0';
+                               error           <= (others => '0');
+                               numBlocksDone   <= (others => '0');
+                               replyState      <= REPSTATE_IDLE;
+                       else
+                               case(replyState) is
+                               when REPSTATE_IDLE =>
+                                       if(enabled = '1') then
+                                               replyState <= REPSTATE_INIT;
+                                       end if;
+                               
+                               when REPSTATE_INIT =>
+                                       -- Initialise for next run
+                                       replyIn.ready   <= '1';
+                                       error           <= (others => '0');
+                                       numBlocksDone   <= (others => '0');
+                                       replyState      <= REPSTATE_QUEUE_REPLY1;
+                                       
+                               when REPSTATE_COMPLETE =>
+                                       if(enabled = '0') then
+                                               replyIn.ready   <= '0';
+                                               replyState      <= REPSTATE_IDLE;
+                                       end if;
+                               
+                               when REPSTATE_QUEUE_REPLY1 =>
+                                       if(enabled = '0') then
+                                               if(replyIn.valid = '0') then
+                                                       replyIn.ready   <= '0';
+                                               end if;
+                                               replyState <= REPSTATE_COMPLETE;
+                                       else
+                                               if(numBlocksDone >= dataSize) then
+                                                       replyState <= REPSTATE_COMPLETE;
+                                       
+                                               elsif(replyIn.valid = '1' and replyIn.ready = '1') then
+                                                       replyState <= REPSTATE_QUEUE_REPLY2;
+                                               end if;
+                                       end if;
+
+                               when REPSTATE_QUEUE_REPLY2 =>
+                                       if(enabled = '0') then
+                                               replyIn.ready   <= '0';
+                                               replyState      <= REPSTATE_COMPLETE;
+
+                                       elsif(replyIn.valid = '1' and replyIn.ready = '1') then
+                                               if(error = 0) then
+                                                       error(15 downto 0) <= '0' & nvmeReplyHead.status;
+                                               end if;
+
+                                               numBlocksDone   <= numBlocksDone + 1;
+                                               replyState      <= REPSTATE_QUEUE_REPLY1;
+                                       end if;
+                               
+                               end case;
+                       end if;
+               end if;
+       end process;
+end;
index 40370ff27efe10fe351eced211bc9e36a228983a..52a84a797d2a0b537c4637b1a547785a79d2dc0a 100644 (file)
@@ -26,7 +26,7 @@
 --! NVMe requests not pipelined and carried out one at a time, in sequence.
 --! Currently does not perform configuration or NVMe register read operations.
 --! Currently does not handle NVMe read data requests.
---! Note NvmeSim still pretty basic and hostReq.ready is left high during NvmeWrite operation so host requests would be ignored.
+--! Note NvmeSim still pretty basic.
 --!
 --! @copyright GNU GPL License
 --! Copyright (c) Beam Ltd, All rights reserved. <br>
@@ -74,32 +74,47 @@ end;
 architecture Behavioral of NvmeSim is
 
 constant TCQ                   : time := 1 ns;
+constant NumQueue              : integer := 16;                        --! Number of queue entries
 constant RegWidth              : integer := 32;
 constant NumWordsRead          : integer := BlockSize/4;               --! Number of 32bit Dwords in a block
 
 subtype RegDataType            is std_logic_vector(RegWidth-1 downto 0);
-type StateType                 is (STATE_IDLE, STATE_WRITE, STATE_REPLY, STATE_READ, STATE_READ_QUEUE_START, STATE_READ_QUEUE,
-                                       STATE_QUEUE_REPLY_HEAD, STATE_QUEUE_REPLY_DATA,
-                                       STATE_READ_DATA_START, STATE_READ_DATA_RECV_START, STATE_READ_DATA_RECV,
-                                       STATE_REPLY_QUEUE);
-type QueueRequestType          is array(0 to 15) of std_logic_vector(31 downto 0);
 
-signal state                   : StateType := STATE_IDLE;
-signal nvmeReply1              : AxisStreamType;                       --! Nvme reply stream for valid replies
+-- Host requests
+type ReqStateType              is (REQSTATE_IDLE, REQSTATE_WRITE, REQSTATE_READ, REQSTATE_REPLY);
+signal reqState                        : ReqStateType := REQSTATE_IDLE;
 signal hostRequestHead         : PcieRequestHeadType;
 signal hostRequestHead1                : PcieRequestHeadType := set_PcieRequestHeadType(0, 0, 0, 0, 0);
 signal hostReplyHead           : PcieReplyHeadType := set_PcieReplyHeadType(0, 0, 0, 0, 0);
 signal hostReplyHead1          : PcieReplyHeadType := set_PcieReplyHeadType(0, 0, 0, 0, 0);
-signal nvmeRequestHead         : PcieRequestHeadType;
-signal nvmeReply1Head          : PcieReplyHeadType;
 signal reg_pci_command         : RegDataType := (others => '0');
-signal queue_pos               : unsigned(2 downto 0);                         -- Hardcoded for 8 queue entries
 signal reg_admin_queue         : RegDataType := (others => '0');
 signal reg_io1_queue           : RegDataType := (others => '0');
 signal reg_io2_queue           : RegDataType := (others => '0');
+
+-- Process queues
+signal queueAdminIn            : integer range 0 to NumQueue-1 := 0;
+signal queueAdminOut           : integer range 0 to NumQueue-1 := 0;
+signal queueWriteIn            : integer range 0 to NumQueue-1 := 0;
+signal queueWriteOut           : integer range 0 to NumQueue-1 := 0;
+signal queueReadIn             : integer range 0 to NumQueue-1 := 0;
+signal queueReadOut            : integer range 0 to NumQueue-1 := 0;
+
+type StateType                 is (STATE_IDLE, STATE_READ_QUEUE_START, STATE_READ_QUEUE,
+                                       STATE_QUEUE_REPLY_HEAD, STATE_QUEUE_REPLY_DATA,
+                                       STATE_READ_DATA_START, STATE_READ_DATA_RECV_START, STATE_READ_DATA_RECV,
+                                       STATE_WRITE_DATA_START, STATE_WRITE_DATA_PACKET_START, STATE_WRITE_DATA,
+                                       STATE_REPLY_QUEUE);
+type QueueRequestType          is array(0 to 15) of std_logic_vector(31 downto 0);
+
+signal state                   : StateType := STATE_IDLE;
+signal queue                   : integer range 0 to NumQueue-1 := 0;
+signal queue_pos               : integer range 0 to NumQueue-1 := 0;
+signal nvmeReply1              : AxisStreamType;                       --! Nvme reply stream for valid replies
+signal nvmeRequestHead         : PcieRequestHeadType;
+signal nvmeReply1Head          : PcieReplyHeadType;
 signal regData                 : RegDataType := (others => '0');
 signal streamNum               : integer := 1;
-signal queue                   : integer;
 signal count                   : unsigned(10 downto 0);
 signal chunkCount              : unsigned(10 downto 0);
 signal queueRequest            : QueueRequestType := (others => (others => '0'));
@@ -108,8 +123,18 @@ signal waitingForReply             : std_logic := '0';
 
 signal data                    : std_logic_vector(127 downto 0);
 
+function queueNext(pos: integer) return integer is
 begin
-       -- Register access
+       if(pos = (NumQueue - 1)) then
+               return 0;
+       else
+               return pos + 1;
+       end if;
+end;
+
+begin
+       -- Host requests including register access
+       hostRequestHead         <= to_PcieRequestHeadType(hostReq.data);
        regData                 <= reg_pci_command when hostRequestHead1.address = x"4" else x"FFFFFFFF";
 
        hostReplyHead.byteCount <= to_unsigned(4, hostReplyHead.byteCount'length);
@@ -119,82 +144,74 @@ begin
        hostReplyHead.count     <= to_unsigned(1, hostReplyHead.count'length);
        hostReplyHead.tag       <= hostRequestHead1.tag;
        hostReplyHead.requesterId       <= hostRequestHead1.requesterId;
+
        data                    <= concat('0', 32) & to_stl(hostReplyHead);
-       hostReply.data          <= zeros(32) & to_stl(hostReplyHead1) when(state = STATE_REPLY)
+       hostReply.data          <= zeros(32) & to_stl(hostReplyHead1) when(reqState = REQSTATE_REPLY)
                                        else regData & data(95 downto 0);
                
-       hostRequestHead         <= to_PcieRequestHeadType(hostReq.data);
+
+
        nvmeReq.data            <= zeros(16)  & queueRequest(0)(31 downto 16) & zeros(96) when(state = STATE_QUEUE_REPLY_DATA)
                                        else to_stl(nvmeRequestHead);
        nvmeReply1Head          <= to_PcieReplyHeadType(nvmeReply1.data);
-       
+
        -- Process host requests
        process(clk)
        begin
                if(rising_edge(clk)) then
                        if(reset = '1') then
+                               hostReq.ready   <= '0';
+                               hostReply.valid <= '0';
+                               hostReply.last  <= '0';
                                reg_pci_command <= (others => '0');
-                               queue_pos       <= (others => '0');
                                reg_admin_queue <= (others => '0');
                                reg_io1_queue   <= (others => '0');
                                reg_io2_queue   <= (others => '0');
-                               hostReq.ready   <= '0';
-                               hostReply.valid <= '0';
-                               hostReply.last  <= '0';
-                               nvmeReq.valid   <= '0';
-                               nvmeReq.last    <= '0';
-                               nvmeReply1.ready <= '0';
-                               nvmeRequestHead <= to_PcieRequestHeadType(concat('0', 128));
-                               state           <= STATE_IDLE;
+                               queueAdminIn    <= 0;
+                               queueWriteIn    <= 0;
+                               queueReadIn     <= 0;
+                               reqState        <= REQSTATE_IDLE;
                        else
-                               case(state) is
-                               when STATE_IDLE =>
+                               case(reqState) is
+                               when REQSTATE_IDLE =>
                                        if(hostReq.ready = '1' and hostReq.valid= '1') then
                                                hostRequestHead1 <= hostRequestHead;
 
                                                if((hostRequestHead.request = 10) or (hostRequestHead.request = 1)) then
-                                                       state   <= STATE_WRITE;
+                                                       reqState <= REQSTATE_WRITE;
                                                elsif(hostRequestHead.request = 8) then
-                                                       state   <= STATE_READ;
+                                                       reqState <= REQSTATE_READ;
                                                end if;
                                        else
                                                hostReq.ready   <= '1';
                                        end if;
 
-                               when STATE_WRITE =>
+                               when REQSTATE_WRITE =>
                                        if(hostReq.ready = '1' and hostReq.valid= '1') then
                                                if(hostRequestHead1.request = 10) then
                                                        if(hostRequestHead1.address = x"0004") then
                                                                reg_pci_command <= hostReq.data(31 downto 0);
                                                        end if;
-                                                       state <= STATE_REPLY;
+                                                       reqState <= REQSTATE_REPLY;
                                                else 
                                                        if(hostRequestHead1.address = x"1000") then
-                                                               queue_pos       <= unsigned(hostReq.data(2 downto 0)) - 1;
                                                                reg_admin_queue <= hostReq.data(31 downto 0);
-                                                               queue           <= 0;
-                                                               state           <= STATE_READ_QUEUE_START;
+                                                               queueAdminIn    <= to_integer(unsigned(hostReq.data(3 downto 0)));
                                                        elsif(hostRequestHead1.address = x"1008") then
-                                                               queue_pos       <= unsigned(hostReq.data(2 downto 0)) - 1;
                                                                reg_io1_queue   <= hostReq.data(31 downto 0);
-                                                               queue           <= 1;
-                                                               state           <= STATE_READ_QUEUE_START;
+                                                               queueWriteIn    <= to_integer(unsigned(hostReq.data(3 downto 0)));
                                                        elsif(hostRequestHead1.address = x"1010") then
-                                                               queue_pos       <= unsigned(hostReq.data(2 downto 0)) - 1;
                                                                reg_io2_queue   <= hostReq.data(31 downto 0);
-                                                               queue           <= 2;
-                                                               state           <= STATE_READ_QUEUE_START;
-                                                       else
-                                                               state <= STATE_IDLE;
+                                                               queueReadIn     <= to_integer(unsigned(hostReq.data(3 downto 0)));
                                                        end if;
+
+                                                       reqState <= REQSTATE_IDLE;
                                                end if;
 
-                                               -- This should realy turn off, but with the newStreamSwitch waiting for ready
-                                               --  and the currentNvmeStreamMux.vhd we need to allow replies.
-                                               --hostReq.ready <= '0';
+                                               hostReq.ready <= '0';
                                        end if;
 
-                               when STATE_REPLY =>
+                               when REQSTATE_REPLY =>
                                        hostReplyHead1.byteCount        <= to_unsigned(0, hostReplyHead1.byteCount'length);
                                        hostReplyHead1.address          <= to_unsigned(0, hostReplyHead1.address'length);
                                        hostReplyHead1.error            <= to_unsigned(0, hostReplyHead1.error'length);
@@ -205,7 +222,7 @@ begin
                                        if(hostReply.ready = '1' and hostReply.valid= '1') then
                                                hostReply.valid <= '0';
                                                hostReply.last  <= '0';
-                                               state           <= STATE_IDLE;
+                                               reqState        <= REQSTATE_IDLE;
                                        else
                                                hostReply.valid <= '1';
                                                hostReply.last  <= '1';
@@ -213,20 +230,59 @@ begin
                                        end if;
                                        
 
-                               when STATE_READ =>
+                               when REQSTATE_READ =>
                                        if(hostReply.ready = '1' and hostReply.valid= '1') then
                                                hostReply.valid <= '0';
                                                hostReply.last  <= '0';
-                                               state           <= STATE_IDLE;
+                                               reqState        <= REQSTATE_IDLE;
                                        else
                                                hostReply.valid <= '1';
                                                hostReply.last  <= '1';
                                                hostReply.keep  <= ones(hostReply.keep'length);
                                        end if;
+                               end case;
+                       end if;
+               end if;
+       end process;
+
+
+       -- Process requests
+       process(clk)
+       begin
+               if(rising_edge(clk)) then
+                       if(reset = '1') then
+                               queueWriteOut   <= 0;
+                               queueReadOut    <= 0;
+                               queue           <= 0;
+                               queue_pos       <= 0;
+                               nvmeReq.valid   <= '0';
+                               nvmeReq.last    <= '0';
+                               nvmeReply1.ready <= '0';
+                               nvmeRequestHead <= to_PcieRequestHeadType(concat('0', 128));
+                               state           <= STATE_IDLE;
+                       else
+                               case(state) is
+                               when STATE_IDLE =>
+                                       if(queueAdminIn /= queueAdminOut) then
+                                               queue           <= 0;
+                                               queue_pos       <= queueAdminOut;
+                                               queueAdminOut   <= queueNext(queueAdminOut);
+                                               state           <= STATE_READ_QUEUE_START;
+                                       elsif(queueWriteIn /= queueWriteOut) then
+                                               queue           <= 1;
+                                               queue_pos       <= queueWriteOut;
+                                               queueWriteOut   <= queueNext(queueWriteOut);
+                                               state           <= STATE_READ_QUEUE_START;
+                                       elsif(queueReadIn /= queueReadOut) then
+                                               queue           <= 2;
+                                               queue_pos       <= queueReadOut;
+                                               queueReadOut    <= queueNext(queueReadOut);
+                                               state           <= STATE_READ_QUEUE_START;
+                                       end if;
 
                                when STATE_READ_QUEUE_START =>
                                        -- Perform bus master read request for queue data
-                                       nvmeRequestHead.address <= x"020" & to_unsigned(queue, 4) & zeros(7) & queue_pos & zeros(6);
+                                       nvmeRequestHead.address <= x"020" & to_unsigned(queue, 4) & zeros(6) & to_unsigned(queue_pos, 4) & zeros(6);
                                        nvmeRequestHead.tag     <= x"44";
                                        nvmeRequestHead.requesterId     <= to_unsigned(0, nvmeRequestHead.requesterId'length);
                                        nvmeRequestHead.request <= "0000";
@@ -273,7 +329,7 @@ begin
                                                                state           <= STATE_READ_DATA_START;
                                                                --state         <= STATE_REPLY_QUEUE;           -- For testing, ignore actual reading of data across Pcie
                                                        elsif(queue = 2) then
-                                                               state           <= STATE_READ_DATA_START;
+                                                               state           <= STATE_WRITE_DATA_START;
                                                        else
                                                                -- Writes an entry into the Admin reply queue. Simply uses info in that last queued request. So only one request at a time.
                                                                -- Note data sent to queue is just the header reapeated so junk data ATM.
@@ -347,6 +403,53 @@ begin
                                                chunkCount <= chunkCount - 4;
                                        end if;
 
+
+                               when STATE_WRITE_DATA_START =>
+                                       -- Perform bus master write request for data to write to NVMe
+                                       nvmeRequestHead.address <= unsigned(queueRequest(6));
+                                       --nvmeRequestHead.address       <= to_unsigned(16#05000000#, nvmeRequestHead.address'length);
+                                       nvmeRequestHead.tag     <= x"44";
+                                       nvmeRequestHead.request <= "0001";
+                                       nvmeRequestHead.count   <= to_unsigned(NumWordsRead, nvmeRequestHead.count'length);                             -- Test size of 32 DWords
+                                       
+                                       if(nvmeReq.valid = '1' and nvmeReq.ready = '1') then
+                                               count           <= nvmeRequestHead.count;       -- Note ignoring 1 DWord in first 128 bits
+                                               nvmeReq.last    <= '0';
+                                               nvmeReq.valid   <= '0';
+                                               nvmeReply1.ready <= '1';
+                                               waitingForReply <= '0';
+                                               state           <= STATE_WRITE_DATA_PACKET_START;
+                                       else
+                                               nvmeReq.keep    <= ones(nvmeReq.keep'length);
+                                               nvmeReq.last    <= '0';
+                                               nvmeReq.valid   <= '1';
+                                       end if;
+
+                               when STATE_WRITE_DATA_PACKET_START =>
+                                       -- Write random data
+                                       if(nvmeReply1.valid = '1' and nvmeReply1.ready = '1') then
+                                               chunkCount      <= nvmeReply1Head.count;
+                                               state           <= STATE_WRITE_DATA;
+                                       end if;
+
+                               when STATE_WRITE_DATA =>
+                                       -- Read in write data ignoring it
+                                       if(nvmeReply1.valid = '1' and nvmeReply1.ready = '1') then
+                                               if(chunkCount = 4) then
+                                                       if(count = 4) then
+                                                               nvmeReply1.ready<= '0';
+                                                               state           <= STATE_REPLY_QUEUE;
+                                                       else
+                                                               state           <= STATE_WRITE_DATA_PACKET_START;
+                                                       end if;
+                                               end if;
+                                               count <= count - 4;
+                                               chunkCount <= chunkCount - 4;
+                                       end if;
+
+
+
+
                                when STATE_REPLY_QUEUE =>
                                        -- Send reply queue header
                                        -- Writes an entry into the DataWRite reply queue. Simply uses info in that last queued request. So only one request at a time.
index 88f9f17036ba6cb80bee73fd5ccb3d535e83aa7e..03a563c64f4a9e17d0b7f1f286167d82df94f3d8 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          := 8 ns;                --! Clock period for timers (125 MHz)
                BlockSize       : integer       := NvmeStorageBlockSize --! System block size
        );
        port (
index 06389da06f3fdc483a91ead0fdab637aa1f01f3f..c4282e80ab9db4ed4e2d5e695c4b69de4ca92c15 100644 (file)
@@ -88,27 +88,6 @@ constant TCQ         : time := 1 ns;
 constant NumStreams    : integer := 8;
 constant ResetCycles   : integer := (100 ms / ClockPeriod);
 
-component AxilClockConverter is
-generic(
-       Simulate        : boolean       := Simulate
-);
-port (
-       clk0            : in std_logic;
-       reset0          : in std_logic;
-
-       -- Bus0
-       axil0In         : in AxilToSlaveType;
-       axil0Out        : out AxilToMasterType;
-
-       clk1            : in std_logic;
-       reset1          : in std_logic;
-
-       -- Bus1
-       axilOut : out AxilToSlaveType;
-       axilIn          : in AxilToMasterType
-);
-end component;
-
 component RegAccessClockConvertor is
 port (
        clk1            : in std_logic;                         --! The interface clock line
@@ -343,6 +322,26 @@ port (
 );
 end component;
 
+component NvmeRead is
+generic(
+       Simulate        : boolean := False;                     --! Generate simulation core
+       BlockSize       : integer := NvmeStorageBlockSize       --! System block size
+);
+port (
+       clk             : in std_logic;                         --! The interface clock line
+       reset           : in std_logic;                         --! The active high reset line
+
+       -- To Nvme Request/reply streams
+       requestOut      : inout AxisStreamType := AxisStreamOutput;     --! To Nvme request stream (3)
+       replyIn         : inout AxisStreamType := AxisStreamInput;      --! from Nvme reply stream
+
+       regWrite        : in std_logic;                         --! Enable write to register
+       regAddress      : in unsigned(3 downto 0);              --! Register to read/write
+       regDataIn       : in std_logic_vector(31 downto 0);     --! Register write data
+       regDataOut      : out std_logic_vector(31 downto 0)     --! Register contents
+);
+end component;
+
 signal reset_local             : std_logic := '0';
 signal reset_local_active      : std_logic := '0';
 signal reset_local_counter     : integer range 0 to ResetCycles := 0;
@@ -363,6 +362,8 @@ alias writeSend                     is streamSend(4);
 alias writeRecv                        is streamRecv(4);
 alias writeMemSend             is streamSend(5);
 alias writeMemRecv             is streamRecv(5);
+alias readSend                 is streamSend(6);
+alias readRecv                 is streamRecv(6);
 
 signal dataIn1                 : AxisStreamType;
 signal streamNone              : AxisStreamType := AxisStreamOutput;
@@ -401,7 +402,9 @@ signal reg_status           : RegDataType := (others => '0');
 signal reg_totalBlocks         : RegDataType := to_stl(NvmeTotalBlocks, RegWidth);
 signal reg_blocksLost          : RegDataType := (others => '0');
 signal reg_nvmeWrite           : RegDataType := (others => '0');
-signal writeNvmeWrite          : std_logic := '0';
+signal reg_nvmeRead            : RegDataType := (others => '0');
+signal nvmeWrite_write         : std_logic := '0';
+signal nvmeRead_write          : std_logic := '0';
 
 -- Nvme configuration signals
 signal configStart             : std_logic := 'U';
@@ -496,10 +499,12 @@ begin
                        reg_totalBlocks when(regAddress1 = 3) else
                        reg_blocksLost when(regAddress1 = 4) else
                        reg_nvmeWrite when((regAddress1 >= 16) and (regAddress1 < 32)) else
+                       reg_nvmeRead when((regAddress1 >= 32) and (regAddress1 < 48)) else
                        x"FFFFFFFF";
 
        regDataOut <= zeros(31) & reset_local_active when(reset_local_active = '1') else regDataOut0;
-       writeNvmeWrite <= regWrite1 when((regAddress1 >= 16) and (regAddress1 < 32)) else '0';
+       nvmeWrite_write <= regWrite1 when((regAddress1 >= 16) and (regAddress1 < 32)) else '0';
+       nvmeRead_write <= regWrite1 when((regAddress1 >= 32) and (regAddress1 < 48)) else '0';
        
        -- Status register bits
        reg_status(0)           <= '0';
@@ -727,7 +732,7 @@ begin
        
        -- Full switched communications
        gen03: if true generate
-       set1: for i in 6 to 7 generate
+       set1: for i in 7 to 7 generate
                streamSend(i).valid     <= '0';
                streamRecv(i).ready     <= '1';
        end generate;
@@ -799,11 +804,26 @@ begin
                memReqIn        => writeMemRecv,
                memReplyOut     => writeMemSend,
 
-               regWrite        => writeNvmeWrite,
+               regWrite        => nvmeWrite_write,
                regAddress      => regAddress1(3 downto 0),
                regDataIn       => regDataIn1,
                regDataOut      => reg_nvmeWrite
        );
 
+       -- The Data read processing
+       nvmeRead0: NvmeRead
+       port map (
+               clk             => nvme_user_clk,
+               reset           => nvme_user_reset,
+
+               requestOut      => readSend,
+               replyIn         => readRecv,
+
+               regWrite        => nvmeRead_write,
+               regAddress      => regAddress1(3 downto 0),
+               regDataIn       => regDataIn1,
+               regDataOut      => reg_nvmeRead
+       );
+
        end generate;
 end;
index c77a0ada3aae3f981a0ad6557d86a117ac452c65..79810556263d2cd363a7c3357e25a5066d39a160 100644 (file)
@@ -42,9 +42,9 @@
  * You should have received a copy of the GNU General Public License
  * along with this code. If not, see <https://www.gnu.org/licenses/>.
  */
-#define        LDEBUG1         0               // High level debug
-#define        LDEBUG2         0               // Debug host to NVMe queued requests
-#define        LDEBUG3         0               // Debug NVMe to host queued requests (bus master)
+#define        LDEBUG1         1               // High level debug
+#define        LDEBUG2         1               // Debug host to NVMe queued requests
+#define        LDEBUG3         1               // Debug NVMe to host queued requests (bus master)
 #define        LDEBUG4         0               // Xlinux PCIe DMA IP register debug
 
 #include <NvmeAccess.h>
@@ -668,6 +668,11 @@ void NvmeAccess::dumpRegs(int nvmeNum){
        printf("NumBlocks:      %8.8x\n", oregs[nvmeRegbase/4 + 19]);
        printf("TimeUs:         %8.8x\n", oregs[nvmeRegbase/4 + 20]);
 
+       printf("ReadControl:    %8.8x\n", oregs[nvmeRegbase/4 + 32]);
+       printf("ReadStatus:     %8.8x\n", oregs[nvmeRegbase/4 + 33]);
+       printf("ReadBlock:      %8.8x\n", oregs[nvmeRegbase/4 + 34]);
+       printf("ReadNumBlocks:  %8.8x\n", oregs[nvmeRegbase/4 + 35]);
+
 #ifdef ZAP     
        for(r = 16; r < 21; r++){
                printf("Reg%2.2d:    %8.8x\n", r, oregs[nvmeRegbase/4 + r]);
index d8e8b26e23b7662c34ae4b2450295c75e1f05d50..bf9c613a440e360f7658fe8de1e045500834928d 100644 (file)
@@ -73,6 +73,11 @@ const BUInt  RegWriteError           = 0x048;        ///< The write error status
 const BUInt    RegWriteNumBlocks       = 0x04C;        ///< The number of blocks written
 const BUInt    RegWriteTime            = 0x050;        ///< The write time in microseconds
 
+const BUInt    RegReadControl          = 0x080;        ///< The read data control register
+const BUInt    RegReadStatus           = 0x084;        ///< The read data status register
+const BUInt    RegReadBlock            = 0x088;        ///< The read data starting block register
+const BUInt    RegReadNumBlocks        = 0x08C;        ///< The read data number of blocks register
+
 class NvmeRequestPacket {
 public:
                        NvmeRequestPacket(){
index 3542e7cc09972f1bf6e0797db6620b695e385b82..efdb2cb3a9834de75ddbf1060c27b93d0ac01252 100644 (file)
@@ -67,7 +67,8 @@ public:
        int             test6();                                ///< Run test6
        int             test7();                                ///< Run test7
        int             test8();                                ///< Run test8
-       int             test9();                                ///< Run test8
+       int             test9();                                ///< Run test9
+       int             test10();                               ///< Run test10
 
        int             test_misc();                            ///< Collection of misc tests
 
@@ -581,6 +582,53 @@ int Control::test9(){
        return 0;
 }
 
+int Control::test10(){
+       int     e;
+       int     a;
+       BUInt32 v;
+       BUInt32 n;
+       BUInt32 t;
+       double  r;
+       double  ts;
+       BUInt   numBlocks = 1;                  // 1 GByte
+       //BUInt numBlocks = 262144;             // 1 GByte
+       //BUInt numBlocks = 2621440;            // 10 GByte
+
+       //numBlocks = 8;
+       //numBlocks = 2621440;          // 10 GByte
+       
+       printf("Test10: Read 1 block using NvmeRead functionality\n");
+
+       setNvme(0);
+       if(e = configureNvme())
+               return e;
+
+       setNvme(1);
+       if(e = configureNvme())
+               return e;
+
+       //setNvme(2);
+       setNvme(0);
+
+       //dumpRegs();
+       
+       // Set number of blocks to write
+       writeNvmeStorageReg(RegReadBlock, 0);
+       writeNvmeStorageReg(RegReadNumBlocks, numBlocks);
+       dumpRegs();
+       
+       // Start off NvmeRead engine
+       printf("\nStart NvmeRead engine\n");
+       writeNvmeStorageReg(RegReadControl, 0x00000001);
+
+       sleep(2);
+       dumpRegs();
+
+       return 0;
+}
+
+
+
 int Control::test_misc(){
        BUInt32 address = 0;
        BUInt32 data[8];
@@ -736,6 +784,9 @@ int main(int argc, char** argv){
                else if(!strcmp(test, "test9")){
                        err = control.test9();
                }
+               else if(!strcmp(test, "test10")){
+                       err = control.test10();
+               }
                else if(!strcmp(test, "test_misc")){
                        err = control.test_misc();
                }
index 1e8b4dd91a63d920dfbd56820c8789004c8e54cc..a5c1ec947462745a208c591e5ecc7d8de4d31f6e 100644 (file)
@@ -30,6 +30,7 @@ SYN_FILES     += ../src/NvmeSim.vhd
 SYN_FILES      += ../src/NvmeQueues.vhd
 SYN_FILES      += ../src/NvmeConfig.vhd
 SYN_FILES      += ../src/NvmeWrite.vhd
+SYN_FILES      += ../src/NvmeRead.vhd
 SYN_FILES      += ../src/NvmeStorageUnit.vhd
 SYN_FILES      += ../src/NvmeStorage.vhd
 SYN_FILES      += ../src/TestData.vhd