litedram: Add an L2 cache with store queue
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 27 May 2020 01:06:51 +0000 (11:06 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 5 Jun 2020 00:33:27 +0000 (10:33 +1000)
This adds a cache between the wishbone and litedram with the following
features (at this point, it's still evolving)

  - 128 bytes line width in order to have a reasonable amount of
litedram pipelining on the 128-bit wide data port.

  - Configurable geometry otherwise

  - Stores are acked immediately on wishbone whether hit or miss
(minus a 2 cycles delay if there's a previous load response in the
way) and sent to LiteDRAM via 8 entries (configurable) store queue

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
13 files changed:
Makefile
litedram/extras/wave.gtkw [new file with mode: 0644]
litedram/extras/wave.opt [new file with mode: 0644]
litedram/extras/wrapper-mw-init.vhdl
litedram/gen-src/sdram_init/include/system.h
litedram/generated/arty/litedram_core.init
litedram/generated/arty/litedram_core.v
litedram/generated/nexys-video/litedram_core.init
litedram/generated/nexys-video/litedram_core.v
litedram/generated/sim/litedram_core.init
litedram/generated/sim/litedram_core.v
microwatt.core
sync_fifo.vhdl [new file with mode: 0644]

index ea7181c7c95d09db6e0c79eaff50a829b759861a..9ed6ff870613915e4a1a2cda3d729b646d50d61b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -50,7 +50,7 @@ core_files = decode_types.vhdl common.vhdl wishbone_types.vhdl fetch1.vhdl \
        loadstore1.vhdl mmu.vhdl dcache.vhdl writeback.vhdl core_debug.vhdl \
        core.vhdl
 
-soc_files = wishbone_arbiter.vhdl wishbone_bram_wrapper.vhdl \
+soc_files = wishbone_arbiter.vhdl wishbone_bram_wrapper.vhdl sync_fifo.vhdl \
        wishbone_debug_master.vhdl xics.vhdl syscon.vhdl soc.vhdl
 
 soc_sim_files = sim_console.vhdl sim_uart.vhdl sim_bram_helpers.vhdl \
diff --git a/litedram/extras/wave.gtkw b/litedram/extras/wave.gtkw
new file mode 100644 (file)
index 0000000..e0d0637
--- /dev/null
@@ -0,0 +1,122 @@
+[*]
+[*] GTKWave Analyzer v3.3.86 (w)1999-2017 BSI
+[*] Sat May 30 08:37:38 2020
+[*]
+[dumpfile] "/home/ANT.AMAZON.COM/benh/hackplace/microwatt/foo.ghw"
+[dumpfile_mtime] "Sat May 30 08:35:43 2020"
+[dumpfile_size] 1424191
+[savefile] "/home/ANT.AMAZON.COM/benh/hackplace/microwatt/litedram/extras/wave.gtkw"
+[timestart] 677520000
+[size] 2509 1371
+[pos] -1 -1
+*-24.000000 642355000000 -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.core_dram_tb.
+[treeopen] top.core_dram_tb.dram.
+[sst_width] 301
+[signals_width] 366
+[sst_expanded] 1
+[sst_vpaned_height] 410
+@28
+top.core_dram_tb.dram.system_clk
+@200
+-wb_in
+@22
+#{top.core_dram_tb.dram.wb_in.adr[31:0]} top.core_dram_tb.dram.wb_in.adr[31] top.core_dram_tb.dram.wb_in.adr[30] top.core_dram_tb.dram.wb_in.adr[29] top.core_dram_tb.dram.wb_in.adr[28] top.core_dram_tb.dram.wb_in.adr[27] top.core_dram_tb.dram.wb_in.adr[26] top.core_dram_tb.dram.wb_in.adr[25] top.core_dram_tb.dram.wb_in.adr[24] top.core_dram_tb.dram.wb_in.adr[23] top.core_dram_tb.dram.wb_in.adr[22] top.core_dram_tb.dram.wb_in.adr[21] top.core_dram_tb.dram.wb_in.adr[20] top.core_dram_tb.dram.wb_in.adr[19] top.core_dram_tb.dram.wb_in.adr[18] top.core_dram_tb.dram.wb_in.adr[17] top.core_dram_tb.dram.wb_in.adr[16] top.core_dram_tb.dram.wb_in.adr[15] top.core_dram_tb.dram.wb_in.adr[14] top.core_dram_tb.dram.wb_in.adr[13] top.core_dram_tb.dram.wb_in.adr[12] top.core_dram_tb.dram.wb_in.adr[11] top.core_dram_tb.dram.wb_in.adr[10] top.core_dram_tb.dram.wb_in.adr[9] top.core_dram_tb.dram.wb_in.adr[8] top.core_dram_tb.dram.wb_in.adr[7] top.core_dram_tb.dram.wb_in.adr[6] top.core_dram_tb.dram.wb_in.adr[5] top.core_dram_tb.dram.wb_in.adr[4] top.core_dram_tb.dram.wb_in.adr[3] top.core_dram_tb.dram.wb_in.adr[2] top.core_dram_tb.dram.wb_in.adr[1] top.core_dram_tb.dram.wb_in.adr[0]
+@28
+top.core_dram_tb.dram.wb_in.cyc
+@22
+#{top.core_dram_tb.dram.wb_in.dat[63:0]} top.core_dram_tb.dram.wb_in.dat[63] top.core_dram_tb.dram.wb_in.dat[62] top.core_dram_tb.dram.wb_in.dat[61] top.core_dram_tb.dram.wb_in.dat[60] top.core_dram_tb.dram.wb_in.dat[59] top.core_dram_tb.dram.wb_in.dat[58] top.core_dram_tb.dram.wb_in.dat[57] top.core_dram_tb.dram.wb_in.dat[56] top.core_dram_tb.dram.wb_in.dat[55] top.core_dram_tb.dram.wb_in.dat[54] top.core_dram_tb.dram.wb_in.dat[53] top.core_dram_tb.dram.wb_in.dat[52] top.core_dram_tb.dram.wb_in.dat[51] top.core_dram_tb.dram.wb_in.dat[50] top.core_dram_tb.dram.wb_in.dat[49] top.core_dram_tb.dram.wb_in.dat[48] top.core_dram_tb.dram.wb_in.dat[47] top.core_dram_tb.dram.wb_in.dat[46] top.core_dram_tb.dram.wb_in.dat[45] top.core_dram_tb.dram.wb_in.dat[44] top.core_dram_tb.dram.wb_in.dat[43] top.core_dram_tb.dram.wb_in.dat[42] top.core_dram_tb.dram.wb_in.dat[41] top.core_dram_tb.dram.wb_in.dat[40] top.core_dram_tb.dram.wb_in.dat[39] top.core_dram_tb.dram.wb_in.dat[38] top.core_dram_tb.dram.wb_in.dat[37] top.core_dram_tb.dram.wb_in.dat[36] top.core_dram_tb.dram.wb_in.dat[35] top.core_dram_tb.dram.wb_in.dat[34] top.core_dram_tb.dram.wb_in.dat[33] top.core_dram_tb.dram.wb_in.dat[32] top.core_dram_tb.dram.wb_in.dat[31] top.core_dram_tb.dram.wb_in.dat[30] top.core_dram_tb.dram.wb_in.dat[29] top.core_dram_tb.dram.wb_in.dat[28] top.core_dram_tb.dram.wb_in.dat[27] top.core_dram_tb.dram.wb_in.dat[26] top.core_dram_tb.dram.wb_in.dat[25] top.core_dram_tb.dram.wb_in.dat[24] top.core_dram_tb.dram.wb_in.dat[23] top.core_dram_tb.dram.wb_in.dat[22] top.core_dram_tb.dram.wb_in.dat[21] top.core_dram_tb.dram.wb_in.dat[20] top.core_dram_tb.dram.wb_in.dat[19] top.core_dram_tb.dram.wb_in.dat[18] top.core_dram_tb.dram.wb_in.dat[17] top.core_dram_tb.dram.wb_in.dat[16] top.core_dram_tb.dram.wb_in.dat[15] top.core_dram_tb.dram.wb_in.dat[14] top.core_dram_tb.dram.wb_in.dat[13] top.core_dram_tb.dram.wb_in.dat[12] top.core_dram_tb.dram.wb_in.dat[11] top.core_dram_tb.dram.wb_in.dat[10] top.core_dram_tb.dram.wb_in.dat[9] top.core_dram_tb.dram.wb_in.dat[8] top.core_dram_tb.dram.wb_in.dat[7] top.core_dram_tb.dram.wb_in.dat[6] top.core_dram_tb.dram.wb_in.dat[5] top.core_dram_tb.dram.wb_in.dat[4] top.core_dram_tb.dram.wb_in.dat[3] top.core_dram_tb.dram.wb_in.dat[2] top.core_dram_tb.dram.wb_in.dat[1] top.core_dram_tb.dram.wb_in.dat[0]
+#{top.core_dram_tb.dram.wb_in.sel[7:0]} top.core_dram_tb.dram.wb_in.sel[7] top.core_dram_tb.dram.wb_in.sel[6] top.core_dram_tb.dram.wb_in.sel[5] top.core_dram_tb.dram.wb_in.sel[4] top.core_dram_tb.dram.wb_in.sel[3] top.core_dram_tb.dram.wb_in.sel[2] top.core_dram_tb.dram.wb_in.sel[1] top.core_dram_tb.dram.wb_in.sel[0]
+@28
+top.core_dram_tb.dram.wb_in.stb
+top.core_dram_tb.dram.wb_in.we
+@200
+-
+-wb_out
+@28
+top.core_dram_tb.dram.wb_out.ack
+@22
+#{top.core_dram_tb.dram.wb_out.dat[63:0]} top.core_dram_tb.dram.wb_out.dat[63] top.core_dram_tb.dram.wb_out.dat[62] top.core_dram_tb.dram.wb_out.dat[61] top.core_dram_tb.dram.wb_out.dat[60] top.core_dram_tb.dram.wb_out.dat[59] top.core_dram_tb.dram.wb_out.dat[58] top.core_dram_tb.dram.wb_out.dat[57] top.core_dram_tb.dram.wb_out.dat[56] top.core_dram_tb.dram.wb_out.dat[55] top.core_dram_tb.dram.wb_out.dat[54] top.core_dram_tb.dram.wb_out.dat[53] top.core_dram_tb.dram.wb_out.dat[52] top.core_dram_tb.dram.wb_out.dat[51] top.core_dram_tb.dram.wb_out.dat[50] top.core_dram_tb.dram.wb_out.dat[49] top.core_dram_tb.dram.wb_out.dat[48] top.core_dram_tb.dram.wb_out.dat[47] top.core_dram_tb.dram.wb_out.dat[46] top.core_dram_tb.dram.wb_out.dat[45] top.core_dram_tb.dram.wb_out.dat[44] top.core_dram_tb.dram.wb_out.dat[43] top.core_dram_tb.dram.wb_out.dat[42] top.core_dram_tb.dram.wb_out.dat[41] top.core_dram_tb.dram.wb_out.dat[40] top.core_dram_tb.dram.wb_out.dat[39] top.core_dram_tb.dram.wb_out.dat[38] top.core_dram_tb.dram.wb_out.dat[37] top.core_dram_tb.dram.wb_out.dat[36] top.core_dram_tb.dram.wb_out.dat[35] top.core_dram_tb.dram.wb_out.dat[34] top.core_dram_tb.dram.wb_out.dat[33] top.core_dram_tb.dram.wb_out.dat[32] top.core_dram_tb.dram.wb_out.dat[31] top.core_dram_tb.dram.wb_out.dat[30] top.core_dram_tb.dram.wb_out.dat[29] top.core_dram_tb.dram.wb_out.dat[28] top.core_dram_tb.dram.wb_out.dat[27] top.core_dram_tb.dram.wb_out.dat[26] top.core_dram_tb.dram.wb_out.dat[25] top.core_dram_tb.dram.wb_out.dat[24] top.core_dram_tb.dram.wb_out.dat[23] top.core_dram_tb.dram.wb_out.dat[22] top.core_dram_tb.dram.wb_out.dat[21] top.core_dram_tb.dram.wb_out.dat[20] top.core_dram_tb.dram.wb_out.dat[19] top.core_dram_tb.dram.wb_out.dat[18] top.core_dram_tb.dram.wb_out.dat[17] top.core_dram_tb.dram.wb_out.dat[16] top.core_dram_tb.dram.wb_out.dat[15] top.core_dram_tb.dram.wb_out.dat[14] top.core_dram_tb.dram.wb_out.dat[13] top.core_dram_tb.dram.wb_out.dat[12] top.core_dram_tb.dram.wb_out.dat[11] top.core_dram_tb.dram.wb_out.dat[10] top.core_dram_tb.dram.wb_out.dat[9] top.core_dram_tb.dram.wb_out.dat[8] top.core_dram_tb.dram.wb_out.dat[7] top.core_dram_tb.dram.wb_out.dat[6] top.core_dram_tb.dram.wb_out.dat[5] top.core_dram_tb.dram.wb_out.dat[4] top.core_dram_tb.dram.wb_out.dat[3] top.core_dram_tb.dram.wb_out.dat[2] top.core_dram_tb.dram.wb_out.dat[1] top.core_dram_tb.dram.wb_out.dat[0]
+@28
+top.core_dram_tb.dram.wb_out.stall
+@200
+-
+-wb_req
+@22
+#{top.core_dram_tb.dram.wb_req.adr[31:0]} top.core_dram_tb.dram.wb_req.adr[31] top.core_dram_tb.dram.wb_req.adr[30] top.core_dram_tb.dram.wb_req.adr[29] top.core_dram_tb.dram.wb_req.adr[28] top.core_dram_tb.dram.wb_req.adr[27] top.core_dram_tb.dram.wb_req.adr[26] top.core_dram_tb.dram.wb_req.adr[25] top.core_dram_tb.dram.wb_req.adr[24] top.core_dram_tb.dram.wb_req.adr[23] top.core_dram_tb.dram.wb_req.adr[22] top.core_dram_tb.dram.wb_req.adr[21] top.core_dram_tb.dram.wb_req.adr[20] top.core_dram_tb.dram.wb_req.adr[19] top.core_dram_tb.dram.wb_req.adr[18] top.core_dram_tb.dram.wb_req.adr[17] top.core_dram_tb.dram.wb_req.adr[16] top.core_dram_tb.dram.wb_req.adr[15] top.core_dram_tb.dram.wb_req.adr[14] top.core_dram_tb.dram.wb_req.adr[13] top.core_dram_tb.dram.wb_req.adr[12] top.core_dram_tb.dram.wb_req.adr[11] top.core_dram_tb.dram.wb_req.adr[10] top.core_dram_tb.dram.wb_req.adr[9] top.core_dram_tb.dram.wb_req.adr[8] top.core_dram_tb.dram.wb_req.adr[7] top.core_dram_tb.dram.wb_req.adr[6] top.core_dram_tb.dram.wb_req.adr[5] top.core_dram_tb.dram.wb_req.adr[4] top.core_dram_tb.dram.wb_req.adr[3] top.core_dram_tb.dram.wb_req.adr[2] top.core_dram_tb.dram.wb_req.adr[1] top.core_dram_tb.dram.wb_req.adr[0]
+@28
+top.core_dram_tb.dram.wb_req.cyc
+@22
+#{top.core_dram_tb.dram.wb_req.dat[63:0]} top.core_dram_tb.dram.wb_req.dat[63] top.core_dram_tb.dram.wb_req.dat[62] top.core_dram_tb.dram.wb_req.dat[61] top.core_dram_tb.dram.wb_req.dat[60] top.core_dram_tb.dram.wb_req.dat[59] top.core_dram_tb.dram.wb_req.dat[58] top.core_dram_tb.dram.wb_req.dat[57] top.core_dram_tb.dram.wb_req.dat[56] top.core_dram_tb.dram.wb_req.dat[55] top.core_dram_tb.dram.wb_req.dat[54] top.core_dram_tb.dram.wb_req.dat[53] top.core_dram_tb.dram.wb_req.dat[52] top.core_dram_tb.dram.wb_req.dat[51] top.core_dram_tb.dram.wb_req.dat[50] top.core_dram_tb.dram.wb_req.dat[49] top.core_dram_tb.dram.wb_req.dat[48] top.core_dram_tb.dram.wb_req.dat[47] top.core_dram_tb.dram.wb_req.dat[46] top.core_dram_tb.dram.wb_req.dat[45] top.core_dram_tb.dram.wb_req.dat[44] top.core_dram_tb.dram.wb_req.dat[43] top.core_dram_tb.dram.wb_req.dat[42] top.core_dram_tb.dram.wb_req.dat[41] top.core_dram_tb.dram.wb_req.dat[40] top.core_dram_tb.dram.wb_req.dat[39] top.core_dram_tb.dram.wb_req.dat[38] top.core_dram_tb.dram.wb_req.dat[37] top.core_dram_tb.dram.wb_req.dat[36] top.core_dram_tb.dram.wb_req.dat[35] top.core_dram_tb.dram.wb_req.dat[34] top.core_dram_tb.dram.wb_req.dat[33] top.core_dram_tb.dram.wb_req.dat[32] top.core_dram_tb.dram.wb_req.dat[31] top.core_dram_tb.dram.wb_req.dat[30] top.core_dram_tb.dram.wb_req.dat[29] top.core_dram_tb.dram.wb_req.dat[28] top.core_dram_tb.dram.wb_req.dat[27] top.core_dram_tb.dram.wb_req.dat[26] top.core_dram_tb.dram.wb_req.dat[25] top.core_dram_tb.dram.wb_req.dat[24] top.core_dram_tb.dram.wb_req.dat[23] top.core_dram_tb.dram.wb_req.dat[22] top.core_dram_tb.dram.wb_req.dat[21] top.core_dram_tb.dram.wb_req.dat[20] top.core_dram_tb.dram.wb_req.dat[19] top.core_dram_tb.dram.wb_req.dat[18] top.core_dram_tb.dram.wb_req.dat[17] top.core_dram_tb.dram.wb_req.dat[16] top.core_dram_tb.dram.wb_req.dat[15] top.core_dram_tb.dram.wb_req.dat[14] top.core_dram_tb.dram.wb_req.dat[13] top.core_dram_tb.dram.wb_req.dat[12] top.core_dram_tb.dram.wb_req.dat[11] top.core_dram_tb.dram.wb_req.dat[10] top.core_dram_tb.dram.wb_req.dat[9] top.core_dram_tb.dram.wb_req.dat[8] top.core_dram_tb.dram.wb_req.dat[7] top.core_dram_tb.dram.wb_req.dat[6] top.core_dram_tb.dram.wb_req.dat[5] top.core_dram_tb.dram.wb_req.dat[4] top.core_dram_tb.dram.wb_req.dat[3] top.core_dram_tb.dram.wb_req.dat[2] top.core_dram_tb.dram.wb_req.dat[1] top.core_dram_tb.dram.wb_req.dat[0]
+#{top.core_dram_tb.dram.wb_req.sel[7:0]} top.core_dram_tb.dram.wb_req.sel[7] top.core_dram_tb.dram.wb_req.sel[6] top.core_dram_tb.dram.wb_req.sel[5] top.core_dram_tb.dram.wb_req.sel[4] top.core_dram_tb.dram.wb_req.sel[3] top.core_dram_tb.dram.wb_req.sel[2] top.core_dram_tb.dram.wb_req.sel[1] top.core_dram_tb.dram.wb_req.sel[0]
+@28
+top.core_dram_tb.dram.wb_req.stb
+top.core_dram_tb.dram.wb_req.we
+@200
+-
+-user_port
+@28
+top.core_dram_tb.dram.user_port0_rdata_ready
+top.core_dram_tb.dram.user_port0_rdata_valid
+top.core_dram_tb.dram.user_port0_wdata_ready
+top.core_dram_tb.dram.user_port0_wdata_valid
+top.core_dram_tb.dram.user_port0_cmd_we
+top.core_dram_tb.dram.user_port0_cmd_ready
+top.core_dram_tb.dram.user_port0_cmd_valid
+@22
+#{top.core_dram_tb.dram.user_port0_rdata_data[127:0]} top.core_dram_tb.dram.user_port0_rdata_data[127] top.core_dram_tb.dram.user_port0_rdata_data[126] top.core_dram_tb.dram.user_port0_rdata_data[125] top.core_dram_tb.dram.user_port0_rdata_data[124] top.core_dram_tb.dram.user_port0_rdata_data[123] top.core_dram_tb.dram.user_port0_rdata_data[122] top.core_dram_tb.dram.user_port0_rdata_data[121] top.core_dram_tb.dram.user_port0_rdata_data[120] top.core_dram_tb.dram.user_port0_rdata_data[119] top.core_dram_tb.dram.user_port0_rdata_data[118] top.core_dram_tb.dram.user_port0_rdata_data[117] top.core_dram_tb.dram.user_port0_rdata_data[116] top.core_dram_tb.dram.user_port0_rdata_data[115] top.core_dram_tb.dram.user_port0_rdata_data[114] top.core_dram_tb.dram.user_port0_rdata_data[113] top.core_dram_tb.dram.user_port0_rdata_data[112] top.core_dram_tb.dram.user_port0_rdata_data[111] top.core_dram_tb.dram.user_port0_rdata_data[110] top.core_dram_tb.dram.user_port0_rdata_data[109] top.core_dram_tb.dram.user_port0_rdata_data[108] top.core_dram_tb.dram.user_port0_rdata_data[107] top.core_dram_tb.dram.user_port0_rdata_data[106] top.core_dram_tb.dram.user_port0_rdata_data[105] top.core_dram_tb.dram.user_port0_rdata_data[104] top.core_dram_tb.dram.user_port0_rdata_data[103] top.core_dram_tb.dram.user_port0_rdata_data[102] top.core_dram_tb.dram.user_port0_rdata_data[101] top.core_dram_tb.dram.user_port0_rdata_data[100] top.core_dram_tb.dram.user_port0_rdata_data[99] top.core_dram_tb.dram.user_port0_rdata_data[98] top.core_dram_tb.dram.user_port0_rdata_data[97] top.core_dram_tb.dram.user_port0_rdata_data[96] top.core_dram_tb.dram.user_port0_rdata_data[95] top.core_dram_tb.dram.user_port0_rdata_data[94] top.core_dram_tb.dram.user_port0_rdata_data[93] top.core_dram_tb.dram.user_port0_rdata_data[92] top.core_dram_tb.dram.user_port0_rdata_data[91] top.core_dram_tb.dram.user_port0_rdata_data[90] top.core_dram_tb.dram.user_port0_rdata_data[89] top.core_dram_tb.dram.user_port0_rdata_data[88] top.core_dram_tb.dram.user_port0_rdata_data[87] top.core_dram_tb.dram.user_port0_rdata_data[86] top.core_dram_tb.dram.user_port0_rdata_data[85] top.core_dram_tb.dram.user_port0_rdata_data[84] top.core_dram_tb.dram.user_port0_rdata_data[83] top.core_dram_tb.dram.user_port0_rdata_data[82] top.core_dram_tb.dram.user_port0_rdata_data[81] top.core_dram_tb.dram.user_port0_rdata_data[80] top.core_dram_tb.dram.user_port0_rdata_data[79] top.core_dram_tb.dram.user_port0_rdata_data[78] top.core_dram_tb.dram.user_port0_rdata_data[77] top.core_dram_tb.dram.user_port0_rdata_data[76] top.core_dram_tb.dram.user_port0_rdata_data[75] top.core_dram_tb.dram.user_port0_rdata_data[74] top.core_dram_tb.dram.user_port0_rdata_data[73] top.core_dram_tb.dram.user_port0_rdata_data[72] top.core_dram_tb.dram.user_port0_rdata_data[71] top.core_dram_tb.dram.user_port0_rdata_data[70] top.core_dram_tb.dram.user_port0_rdata_data[69] top.core_dram_tb.dram.user_port0_rdata_data[68] top.core_dram_tb.dram.user_port0_rdata_data[67] top.core_dram_tb.dram.user_port0_rdata_data[66] top.core_dram_tb.dram.user_port0_rdata_data[65] top.core_dram_tb.dram.user_port0_rdata_data[64] top.core_dram_tb.dram.user_port0_rdata_data[63] top.core_dram_tb.dram.user_port0_rdata_data[62] top.core_dram_tb.dram.user_port0_rdata_data[61] top.core_dram_tb.dram.user_port0_rdata_data[60] top.core_dram_tb.dram.user_port0_rdata_data[59] top.core_dram_tb.dram.user_port0_rdata_data[58] top.core_dram_tb.dram.user_port0_rdata_data[57] top.core_dram_tb.dram.user_port0_rdata_data[56] top.core_dram_tb.dram.user_port0_rdata_data[55] top.core_dram_tb.dram.user_port0_rdata_data[54] top.core_dram_tb.dram.user_port0_rdata_data[53] top.core_dram_tb.dram.user_port0_rdata_data[52] top.core_dram_tb.dram.user_port0_rdata_data[51] top.core_dram_tb.dram.user_port0_rdata_data[50] top.core_dram_tb.dram.user_port0_rdata_data[49] top.core_dram_tb.dram.user_port0_rdata_data[48] top.core_dram_tb.dram.user_port0_rdata_data[47] top.core_dram_tb.dram.user_port0_rdata_data[46] top.core_dram_tb.dram.user_port0_rdata_data[45] top.core_dram_tb.dram.user_port0_rdata_data[44] top.core_dram_tb.dram.user_port0_rdata_data[43] top.core_dram_tb.dram.user_port0_rdata_data[42] top.core_dram_tb.dram.user_port0_rdata_data[41] top.core_dram_tb.dram.user_port0_rdata_data[40] top.core_dram_tb.dram.user_port0_rdata_data[39] top.core_dram_tb.dram.user_port0_rdata_data[38] top.core_dram_tb.dram.user_port0_rdata_data[37] top.core_dram_tb.dram.user_port0_rdata_data[36] top.core_dram_tb.dram.user_port0_rdata_data[35] top.core_dram_tb.dram.user_port0_rdata_data[34] top.core_dram_tb.dram.user_port0_rdata_data[33] top.core_dram_tb.dram.user_port0_rdata_data[32] top.core_dram_tb.dram.user_port0_rdata_data[31] top.core_dram_tb.dram.user_port0_rdata_data[30] top.core_dram_tb.dram.user_port0_rdata_data[29] top.core_dram_tb.dram.user_port0_rdata_data[28] top.core_dram_tb.dram.user_port0_rdata_data[27] top.core_dram_tb.dram.user_port0_rdata_data[26] top.core_dram_tb.dram.user_port0_rdata_data[25] top.core_dram_tb.dram.user_port0_rdata_data[24] top.core_dram_tb.dram.user_port0_rdata_data[23] top.core_dram_tb.dram.user_port0_rdata_data[22] top.core_dram_tb.dram.user_port0_rdata_data[21] top.core_dram_tb.dram.user_port0_rdata_data[20] top.core_dram_tb.dram.user_port0_rdata_data[19] top.core_dram_tb.dram.user_port0_rdata_data[18] top.core_dram_tb.dram.user_port0_rdata_data[17] top.core_dram_tb.dram.user_port0_rdata_data[16] top.core_dram_tb.dram.user_port0_rdata_data[15] top.core_dram_tb.dram.user_port0_rdata_data[14] top.core_dram_tb.dram.user_port0_rdata_data[13] top.core_dram_tb.dram.user_port0_rdata_data[12] top.core_dram_tb.dram.user_port0_rdata_data[11] top.core_dram_tb.dram.user_port0_rdata_data[10] top.core_dram_tb.dram.user_port0_rdata_data[9] top.core_dram_tb.dram.user_port0_rdata_data[8] top.core_dram_tb.dram.user_port0_rdata_data[7] top.core_dram_tb.dram.user_port0_rdata_data[6] top.core_dram_tb.dram.user_port0_rdata_data[5] top.core_dram_tb.dram.user_port0_rdata_data[4] top.core_dram_tb.dram.user_port0_rdata_data[3] top.core_dram_tb.dram.user_port0_rdata_data[2] top.core_dram_tb.dram.user_port0_rdata_data[1] top.core_dram_tb.dram.user_port0_rdata_data[0]
+#{top.core_dram_tb.dram.user_port0_wdata_data[127:0]} top.core_dram_tb.dram.user_port0_wdata_data[127] top.core_dram_tb.dram.user_port0_wdata_data[126] top.core_dram_tb.dram.user_port0_wdata_data[125] top.core_dram_tb.dram.user_port0_wdata_data[124] top.core_dram_tb.dram.user_port0_wdata_data[123] top.core_dram_tb.dram.user_port0_wdata_data[122] top.core_dram_tb.dram.user_port0_wdata_data[121] top.core_dram_tb.dram.user_port0_wdata_data[120] top.core_dram_tb.dram.user_port0_wdata_data[119] top.core_dram_tb.dram.user_port0_wdata_data[118] top.core_dram_tb.dram.user_port0_wdata_data[117] top.core_dram_tb.dram.user_port0_wdata_data[116] top.core_dram_tb.dram.user_port0_wdata_data[115] top.core_dram_tb.dram.user_port0_wdata_data[114] top.core_dram_tb.dram.user_port0_wdata_data[113] top.core_dram_tb.dram.user_port0_wdata_data[112] top.core_dram_tb.dram.user_port0_wdata_data[111] top.core_dram_tb.dram.user_port0_wdata_data[110] top.core_dram_tb.dram.user_port0_wdata_data[109] top.core_dram_tb.dram.user_port0_wdata_data[108] top.core_dram_tb.dram.user_port0_wdata_data[107] top.core_dram_tb.dram.user_port0_wdata_data[106] top.core_dram_tb.dram.user_port0_wdata_data[105] top.core_dram_tb.dram.user_port0_wdata_data[104] top.core_dram_tb.dram.user_port0_wdata_data[103] top.core_dram_tb.dram.user_port0_wdata_data[102] top.core_dram_tb.dram.user_port0_wdata_data[101] top.core_dram_tb.dram.user_port0_wdata_data[100] top.core_dram_tb.dram.user_port0_wdata_data[99] top.core_dram_tb.dram.user_port0_wdata_data[98] top.core_dram_tb.dram.user_port0_wdata_data[97] top.core_dram_tb.dram.user_port0_wdata_data[96] top.core_dram_tb.dram.user_port0_wdata_data[95] top.core_dram_tb.dram.user_port0_wdata_data[94] top.core_dram_tb.dram.user_port0_wdata_data[93] top.core_dram_tb.dram.user_port0_wdata_data[92] top.core_dram_tb.dram.user_port0_wdata_data[91] top.core_dram_tb.dram.user_port0_wdata_data[90] top.core_dram_tb.dram.user_port0_wdata_data[89] top.core_dram_tb.dram.user_port0_wdata_data[88] top.core_dram_tb.dram.user_port0_wdata_data[87] top.core_dram_tb.dram.user_port0_wdata_data[86] top.core_dram_tb.dram.user_port0_wdata_data[85] top.core_dram_tb.dram.user_port0_wdata_data[84] top.core_dram_tb.dram.user_port0_wdata_data[83] top.core_dram_tb.dram.user_port0_wdata_data[82] top.core_dram_tb.dram.user_port0_wdata_data[81] top.core_dram_tb.dram.user_port0_wdata_data[80] top.core_dram_tb.dram.user_port0_wdata_data[79] top.core_dram_tb.dram.user_port0_wdata_data[78] top.core_dram_tb.dram.user_port0_wdata_data[77] top.core_dram_tb.dram.user_port0_wdata_data[76] top.core_dram_tb.dram.user_port0_wdata_data[75] top.core_dram_tb.dram.user_port0_wdata_data[74] top.core_dram_tb.dram.user_port0_wdata_data[73] top.core_dram_tb.dram.user_port0_wdata_data[72] top.core_dram_tb.dram.user_port0_wdata_data[71] top.core_dram_tb.dram.user_port0_wdata_data[70] top.core_dram_tb.dram.user_port0_wdata_data[69] top.core_dram_tb.dram.user_port0_wdata_data[68] top.core_dram_tb.dram.user_port0_wdata_data[67] top.core_dram_tb.dram.user_port0_wdata_data[66] top.core_dram_tb.dram.user_port0_wdata_data[65] top.core_dram_tb.dram.user_port0_wdata_data[64] top.core_dram_tb.dram.user_port0_wdata_data[63] top.core_dram_tb.dram.user_port0_wdata_data[62] top.core_dram_tb.dram.user_port0_wdata_data[61] top.core_dram_tb.dram.user_port0_wdata_data[60] top.core_dram_tb.dram.user_port0_wdata_data[59] top.core_dram_tb.dram.user_port0_wdata_data[58] top.core_dram_tb.dram.user_port0_wdata_data[57] top.core_dram_tb.dram.user_port0_wdata_data[56] top.core_dram_tb.dram.user_port0_wdata_data[55] top.core_dram_tb.dram.user_port0_wdata_data[54] top.core_dram_tb.dram.user_port0_wdata_data[53] top.core_dram_tb.dram.user_port0_wdata_data[52] top.core_dram_tb.dram.user_port0_wdata_data[51] top.core_dram_tb.dram.user_port0_wdata_data[50] top.core_dram_tb.dram.user_port0_wdata_data[49] top.core_dram_tb.dram.user_port0_wdata_data[48] top.core_dram_tb.dram.user_port0_wdata_data[47] top.core_dram_tb.dram.user_port0_wdata_data[46] top.core_dram_tb.dram.user_port0_wdata_data[45] top.core_dram_tb.dram.user_port0_wdata_data[44] top.core_dram_tb.dram.user_port0_wdata_data[43] top.core_dram_tb.dram.user_port0_wdata_data[42] top.core_dram_tb.dram.user_port0_wdata_data[41] top.core_dram_tb.dram.user_port0_wdata_data[40] top.core_dram_tb.dram.user_port0_wdata_data[39] top.core_dram_tb.dram.user_port0_wdata_data[38] top.core_dram_tb.dram.user_port0_wdata_data[37] top.core_dram_tb.dram.user_port0_wdata_data[36] top.core_dram_tb.dram.user_port0_wdata_data[35] top.core_dram_tb.dram.user_port0_wdata_data[34] top.core_dram_tb.dram.user_port0_wdata_data[33] top.core_dram_tb.dram.user_port0_wdata_data[32] top.core_dram_tb.dram.user_port0_wdata_data[31] top.core_dram_tb.dram.user_port0_wdata_data[30] top.core_dram_tb.dram.user_port0_wdata_data[29] top.core_dram_tb.dram.user_port0_wdata_data[28] top.core_dram_tb.dram.user_port0_wdata_data[27] top.core_dram_tb.dram.user_port0_wdata_data[26] top.core_dram_tb.dram.user_port0_wdata_data[25] top.core_dram_tb.dram.user_port0_wdata_data[24] top.core_dram_tb.dram.user_port0_wdata_data[23] top.core_dram_tb.dram.user_port0_wdata_data[22] top.core_dram_tb.dram.user_port0_wdata_data[21] top.core_dram_tb.dram.user_port0_wdata_data[20] top.core_dram_tb.dram.user_port0_wdata_data[19] top.core_dram_tb.dram.user_port0_wdata_data[18] top.core_dram_tb.dram.user_port0_wdata_data[17] top.core_dram_tb.dram.user_port0_wdata_data[16] top.core_dram_tb.dram.user_port0_wdata_data[15] top.core_dram_tb.dram.user_port0_wdata_data[14] top.core_dram_tb.dram.user_port0_wdata_data[13] top.core_dram_tb.dram.user_port0_wdata_data[12] top.core_dram_tb.dram.user_port0_wdata_data[11] top.core_dram_tb.dram.user_port0_wdata_data[10] top.core_dram_tb.dram.user_port0_wdata_data[9] top.core_dram_tb.dram.user_port0_wdata_data[8] top.core_dram_tb.dram.user_port0_wdata_data[7] top.core_dram_tb.dram.user_port0_wdata_data[6] top.core_dram_tb.dram.user_port0_wdata_data[5] top.core_dram_tb.dram.user_port0_wdata_data[4] top.core_dram_tb.dram.user_port0_wdata_data[3] top.core_dram_tb.dram.user_port0_wdata_data[2] top.core_dram_tb.dram.user_port0_wdata_data[1] top.core_dram_tb.dram.user_port0_wdata_data[0]
+#{top.core_dram_tb.dram.user_port0_wdata_we[15:0]} top.core_dram_tb.dram.user_port0_wdata_we[15] top.core_dram_tb.dram.user_port0_wdata_we[14] top.core_dram_tb.dram.user_port0_wdata_we[13] top.core_dram_tb.dram.user_port0_wdata_we[12] top.core_dram_tb.dram.user_port0_wdata_we[11] top.core_dram_tb.dram.user_port0_wdata_we[10] top.core_dram_tb.dram.user_port0_wdata_we[9] top.core_dram_tb.dram.user_port0_wdata_we[8] top.core_dram_tb.dram.user_port0_wdata_we[7] top.core_dram_tb.dram.user_port0_wdata_we[6] top.core_dram_tb.dram.user_port0_wdata_we[5] top.core_dram_tb.dram.user_port0_wdata_we[4] top.core_dram_tb.dram.user_port0_wdata_we[3] top.core_dram_tb.dram.user_port0_wdata_we[2] top.core_dram_tb.dram.user_port0_wdata_we[1] top.core_dram_tb.dram.user_port0_wdata_we[0]
+#{top.core_dram_tb.dram.user_port0_cmd_addr[23:0]} top.core_dram_tb.dram.user_port0_cmd_addr[23] top.core_dram_tb.dram.user_port0_cmd_addr[22] top.core_dram_tb.dram.user_port0_cmd_addr[21] top.core_dram_tb.dram.user_port0_cmd_addr[20] top.core_dram_tb.dram.user_port0_cmd_addr[19] top.core_dram_tb.dram.user_port0_cmd_addr[18] top.core_dram_tb.dram.user_port0_cmd_addr[17] top.core_dram_tb.dram.user_port0_cmd_addr[16] top.core_dram_tb.dram.user_port0_cmd_addr[15] top.core_dram_tb.dram.user_port0_cmd_addr[14] top.core_dram_tb.dram.user_port0_cmd_addr[13] top.core_dram_tb.dram.user_port0_cmd_addr[12] top.core_dram_tb.dram.user_port0_cmd_addr[11] top.core_dram_tb.dram.user_port0_cmd_addr[10] top.core_dram_tb.dram.user_port0_cmd_addr[9] top.core_dram_tb.dram.user_port0_cmd_addr[8] top.core_dram_tb.dram.user_port0_cmd_addr[7] top.core_dram_tb.dram.user_port0_cmd_addr[6] top.core_dram_tb.dram.user_port0_cmd_addr[5] top.core_dram_tb.dram.user_port0_cmd_addr[4] top.core_dram_tb.dram.user_port0_cmd_addr[3] top.core_dram_tb.dram.user_port0_cmd_addr[2] top.core_dram_tb.dram.user_port0_cmd_addr[1] top.core_dram_tb.dram.user_port0_cmd_addr[0]
+@200
+-
+-storeq
+@28
+top.core_dram_tb.dram.accept_store
+top.core_dram_tb.dram.storeq_wr_valid
+top.core_dram_tb.dram.storeq_wr_ready
+@22
+#{top.core_dram_tb.dram.storeq_wr_data[79:0]} top.core_dram_tb.dram.storeq_wr_data[79] top.core_dram_tb.dram.storeq_wr_data[78] top.core_dram_tb.dram.storeq_wr_data[77] top.core_dram_tb.dram.storeq_wr_data[76] top.core_dram_tb.dram.storeq_wr_data[75] top.core_dram_tb.dram.storeq_wr_data[74] top.core_dram_tb.dram.storeq_wr_data[73] top.core_dram_tb.dram.storeq_wr_data[72] top.core_dram_tb.dram.storeq_wr_data[71] top.core_dram_tb.dram.storeq_wr_data[70] top.core_dram_tb.dram.storeq_wr_data[69] top.core_dram_tb.dram.storeq_wr_data[68] top.core_dram_tb.dram.storeq_wr_data[67] top.core_dram_tb.dram.storeq_wr_data[66] top.core_dram_tb.dram.storeq_wr_data[65] top.core_dram_tb.dram.storeq_wr_data[64] top.core_dram_tb.dram.storeq_wr_data[63] top.core_dram_tb.dram.storeq_wr_data[62] top.core_dram_tb.dram.storeq_wr_data[61] top.core_dram_tb.dram.storeq_wr_data[60] top.core_dram_tb.dram.storeq_wr_data[59] top.core_dram_tb.dram.storeq_wr_data[58] top.core_dram_tb.dram.storeq_wr_data[57] top.core_dram_tb.dram.storeq_wr_data[56] top.core_dram_tb.dram.storeq_wr_data[55] top.core_dram_tb.dram.storeq_wr_data[54] top.core_dram_tb.dram.storeq_wr_data[53] top.core_dram_tb.dram.storeq_wr_data[52] top.core_dram_tb.dram.storeq_wr_data[51] top.core_dram_tb.dram.storeq_wr_data[50] top.core_dram_tb.dram.storeq_wr_data[49] top.core_dram_tb.dram.storeq_wr_data[48] top.core_dram_tb.dram.storeq_wr_data[47] top.core_dram_tb.dram.storeq_wr_data[46] top.core_dram_tb.dram.storeq_wr_data[45] top.core_dram_tb.dram.storeq_wr_data[44] top.core_dram_tb.dram.storeq_wr_data[43] top.core_dram_tb.dram.storeq_wr_data[42] top.core_dram_tb.dram.storeq_wr_data[41] top.core_dram_tb.dram.storeq_wr_data[40] top.core_dram_tb.dram.storeq_wr_data[39] top.core_dram_tb.dram.storeq_wr_data[38] top.core_dram_tb.dram.storeq_wr_data[37] top.core_dram_tb.dram.storeq_wr_data[36] top.core_dram_tb.dram.storeq_wr_data[35] top.core_dram_tb.dram.storeq_wr_data[34] top.core_dram_tb.dram.storeq_wr_data[33] top.core_dram_tb.dram.storeq_wr_data[32] top.core_dram_tb.dram.storeq_wr_data[31] top.core_dram_tb.dram.storeq_wr_data[30] top.core_dram_tb.dram.storeq_wr_data[29] top.core_dram_tb.dram.storeq_wr_data[28] top.core_dram_tb.dram.storeq_wr_data[27] top.core_dram_tb.dram.storeq_wr_data[26] top.core_dram_tb.dram.storeq_wr_data[25] top.core_dram_tb.dram.storeq_wr_data[24] top.core_dram_tb.dram.storeq_wr_data[23] top.core_dram_tb.dram.storeq_wr_data[22] top.core_dram_tb.dram.storeq_wr_data[21] top.core_dram_tb.dram.storeq_wr_data[20] top.core_dram_tb.dram.storeq_wr_data[19] top.core_dram_tb.dram.storeq_wr_data[18] top.core_dram_tb.dram.storeq_wr_data[17] top.core_dram_tb.dram.storeq_wr_data[16] top.core_dram_tb.dram.storeq_wr_data[15] top.core_dram_tb.dram.storeq_wr_data[14] top.core_dram_tb.dram.storeq_wr_data[13] top.core_dram_tb.dram.storeq_wr_data[12] top.core_dram_tb.dram.storeq_wr_data[11] top.core_dram_tb.dram.storeq_wr_data[10] top.core_dram_tb.dram.storeq_wr_data[9] top.core_dram_tb.dram.storeq_wr_data[8] top.core_dram_tb.dram.storeq_wr_data[7] top.core_dram_tb.dram.storeq_wr_data[6] top.core_dram_tb.dram.storeq_wr_data[5] top.core_dram_tb.dram.storeq_wr_data[4] top.core_dram_tb.dram.storeq_wr_data[3] top.core_dram_tb.dram.storeq_wr_data[2] top.core_dram_tb.dram.storeq_wr_data[1] top.core_dram_tb.dram.storeq_wr_data[0]
+@28
+top.core_dram_tb.dram.storeq_rd_valid
+top.core_dram_tb.dram.storeq_rd_ready
+@22
+#{top.core_dram_tb.dram.storeq_rd_data[79:0]} top.core_dram_tb.dram.storeq_rd_data[79] top.core_dram_tb.dram.storeq_rd_data[78] top.core_dram_tb.dram.storeq_rd_data[77] top.core_dram_tb.dram.storeq_rd_data[76] top.core_dram_tb.dram.storeq_rd_data[75] top.core_dram_tb.dram.storeq_rd_data[74] top.core_dram_tb.dram.storeq_rd_data[73] top.core_dram_tb.dram.storeq_rd_data[72] top.core_dram_tb.dram.storeq_rd_data[71] top.core_dram_tb.dram.storeq_rd_data[70] top.core_dram_tb.dram.storeq_rd_data[69] top.core_dram_tb.dram.storeq_rd_data[68] top.core_dram_tb.dram.storeq_rd_data[67] top.core_dram_tb.dram.storeq_rd_data[66] top.core_dram_tb.dram.storeq_rd_data[65] top.core_dram_tb.dram.storeq_rd_data[64] top.core_dram_tb.dram.storeq_rd_data[63] top.core_dram_tb.dram.storeq_rd_data[62] top.core_dram_tb.dram.storeq_rd_data[61] top.core_dram_tb.dram.storeq_rd_data[60] top.core_dram_tb.dram.storeq_rd_data[59] top.core_dram_tb.dram.storeq_rd_data[58] top.core_dram_tb.dram.storeq_rd_data[57] top.core_dram_tb.dram.storeq_rd_data[56] top.core_dram_tb.dram.storeq_rd_data[55] top.core_dram_tb.dram.storeq_rd_data[54] top.core_dram_tb.dram.storeq_rd_data[53] top.core_dram_tb.dram.storeq_rd_data[52] top.core_dram_tb.dram.storeq_rd_data[51] top.core_dram_tb.dram.storeq_rd_data[50] top.core_dram_tb.dram.storeq_rd_data[49] top.core_dram_tb.dram.storeq_rd_data[48] top.core_dram_tb.dram.storeq_rd_data[47] top.core_dram_tb.dram.storeq_rd_data[46] top.core_dram_tb.dram.storeq_rd_data[45] top.core_dram_tb.dram.storeq_rd_data[44] top.core_dram_tb.dram.storeq_rd_data[43] top.core_dram_tb.dram.storeq_rd_data[42] top.core_dram_tb.dram.storeq_rd_data[41] top.core_dram_tb.dram.storeq_rd_data[40] top.core_dram_tb.dram.storeq_rd_data[39] top.core_dram_tb.dram.storeq_rd_data[38] top.core_dram_tb.dram.storeq_rd_data[37] top.core_dram_tb.dram.storeq_rd_data[36] top.core_dram_tb.dram.storeq_rd_data[35] top.core_dram_tb.dram.storeq_rd_data[34] top.core_dram_tb.dram.storeq_rd_data[33] top.core_dram_tb.dram.storeq_rd_data[32] top.core_dram_tb.dram.storeq_rd_data[31] top.core_dram_tb.dram.storeq_rd_data[30] top.core_dram_tb.dram.storeq_rd_data[29] top.core_dram_tb.dram.storeq_rd_data[28] top.core_dram_tb.dram.storeq_rd_data[27] top.core_dram_tb.dram.storeq_rd_data[26] top.core_dram_tb.dram.storeq_rd_data[25] top.core_dram_tb.dram.storeq_rd_data[24] top.core_dram_tb.dram.storeq_rd_data[23] top.core_dram_tb.dram.storeq_rd_data[22] top.core_dram_tb.dram.storeq_rd_data[21] top.core_dram_tb.dram.storeq_rd_data[20] top.core_dram_tb.dram.storeq_rd_data[19] top.core_dram_tb.dram.storeq_rd_data[18] top.core_dram_tb.dram.storeq_rd_data[17] top.core_dram_tb.dram.storeq_rd_data[16] top.core_dram_tb.dram.storeq_rd_data[15] top.core_dram_tb.dram.storeq_rd_data[14] top.core_dram_tb.dram.storeq_rd_data[13] top.core_dram_tb.dram.storeq_rd_data[12] top.core_dram_tb.dram.storeq_rd_data[11] top.core_dram_tb.dram.storeq_rd_data[10] top.core_dram_tb.dram.storeq_rd_data[9] top.core_dram_tb.dram.storeq_rd_data[8] top.core_dram_tb.dram.storeq_rd_data[7] top.core_dram_tb.dram.storeq_rd_data[6] top.core_dram_tb.dram.storeq_rd_data[5] top.core_dram_tb.dram.storeq_rd_data[4] top.core_dram_tb.dram.storeq_rd_data[3] top.core_dram_tb.dram.storeq_rd_data[2] top.core_dram_tb.dram.storeq_rd_data[1] top.core_dram_tb.dram.storeq_rd_data[0]
+@200
+-
+-misc
+@420
+top.core_dram_tb.dram.req_op
+top.core_dram_tb.dram.state
+@200
+-
+@201
+-sync_fifo
+@28
+top.core_dram_tb.dram.store_queue.empty
+top.core_dram_tb.dram.store_queue.full
+@420
+top.core_dram_tb.dram.store_queue.op_next
+top.core_dram_tb.dram.store_queue.op_prev
+@28
+top.core_dram_tb.dram.store_queue.pop
+top.core_dram_tb.dram.store_queue.push
+@22
+#{top.core_dram_tb.dram.store_queue.rd_data[79:0]} top.core_dram_tb.dram.store_queue.rd_data[79] top.core_dram_tb.dram.store_queue.rd_data[78] top.core_dram_tb.dram.store_queue.rd_data[77] top.core_dram_tb.dram.store_queue.rd_data[76] top.core_dram_tb.dram.store_queue.rd_data[75] top.core_dram_tb.dram.store_queue.rd_data[74] top.core_dram_tb.dram.store_queue.rd_data[73] top.core_dram_tb.dram.store_queue.rd_data[72] top.core_dram_tb.dram.store_queue.rd_data[71] top.core_dram_tb.dram.store_queue.rd_data[70] top.core_dram_tb.dram.store_queue.rd_data[69] top.core_dram_tb.dram.store_queue.rd_data[68] top.core_dram_tb.dram.store_queue.rd_data[67] top.core_dram_tb.dram.store_queue.rd_data[66] top.core_dram_tb.dram.store_queue.rd_data[65] top.core_dram_tb.dram.store_queue.rd_data[64] top.core_dram_tb.dram.store_queue.rd_data[63] top.core_dram_tb.dram.store_queue.rd_data[62] top.core_dram_tb.dram.store_queue.rd_data[61] top.core_dram_tb.dram.store_queue.rd_data[60] top.core_dram_tb.dram.store_queue.rd_data[59] top.core_dram_tb.dram.store_queue.rd_data[58] top.core_dram_tb.dram.store_queue.rd_data[57] top.core_dram_tb.dram.store_queue.rd_data[56] top.core_dram_tb.dram.store_queue.rd_data[55] top.core_dram_tb.dram.store_queue.rd_data[54] top.core_dram_tb.dram.store_queue.rd_data[53] top.core_dram_tb.dram.store_queue.rd_data[52] top.core_dram_tb.dram.store_queue.rd_data[51] top.core_dram_tb.dram.store_queue.rd_data[50] top.core_dram_tb.dram.store_queue.rd_data[49] top.core_dram_tb.dram.store_queue.rd_data[48] top.core_dram_tb.dram.store_queue.rd_data[47] top.core_dram_tb.dram.store_queue.rd_data[46] top.core_dram_tb.dram.store_queue.rd_data[45] top.core_dram_tb.dram.store_queue.rd_data[44] top.core_dram_tb.dram.store_queue.rd_data[43] top.core_dram_tb.dram.store_queue.rd_data[42] top.core_dram_tb.dram.store_queue.rd_data[41] top.core_dram_tb.dram.store_queue.rd_data[40] top.core_dram_tb.dram.store_queue.rd_data[39] top.core_dram_tb.dram.store_queue.rd_data[38] top.core_dram_tb.dram.store_queue.rd_data[37] top.core_dram_tb.dram.store_queue.rd_data[36] top.core_dram_tb.dram.store_queue.rd_data[35] top.core_dram_tb.dram.store_queue.rd_data[34] top.core_dram_tb.dram.store_queue.rd_data[33] top.core_dram_tb.dram.store_queue.rd_data[32] top.core_dram_tb.dram.store_queue.rd_data[31] top.core_dram_tb.dram.store_queue.rd_data[30] top.core_dram_tb.dram.store_queue.rd_data[29] top.core_dram_tb.dram.store_queue.rd_data[28] top.core_dram_tb.dram.store_queue.rd_data[27] top.core_dram_tb.dram.store_queue.rd_data[26] top.core_dram_tb.dram.store_queue.rd_data[25] top.core_dram_tb.dram.store_queue.rd_data[24] top.core_dram_tb.dram.store_queue.rd_data[23] top.core_dram_tb.dram.store_queue.rd_data[22] top.core_dram_tb.dram.store_queue.rd_data[21] top.core_dram_tb.dram.store_queue.rd_data[20] top.core_dram_tb.dram.store_queue.rd_data[19] top.core_dram_tb.dram.store_queue.rd_data[18] top.core_dram_tb.dram.store_queue.rd_data[17] top.core_dram_tb.dram.store_queue.rd_data[16] top.core_dram_tb.dram.store_queue.rd_data[15] top.core_dram_tb.dram.store_queue.rd_data[14] top.core_dram_tb.dram.store_queue.rd_data[13] top.core_dram_tb.dram.store_queue.rd_data[12] top.core_dram_tb.dram.store_queue.rd_data[11] top.core_dram_tb.dram.store_queue.rd_data[10] top.core_dram_tb.dram.store_queue.rd_data[9] top.core_dram_tb.dram.store_queue.rd_data[8] top.core_dram_tb.dram.store_queue.rd_data[7] top.core_dram_tb.dram.store_queue.rd_data[6] top.core_dram_tb.dram.store_queue.rd_data[5] top.core_dram_tb.dram.store_queue.rd_data[4] top.core_dram_tb.dram.store_queue.rd_data[3] top.core_dram_tb.dram.store_queue.rd_data[2] top.core_dram_tb.dram.store_queue.rd_data[1] top.core_dram_tb.dram.store_queue.rd_data[0]
+@420
+top.core_dram_tb.dram.store_queue.rd_idx
+top.core_dram_tb.dram.store_queue.rd_next
+@28
+top.core_dram_tb.dram.store_queue.rd_ready
+top.core_dram_tb.dram.store_queue.rd_valid
+@22
+#{top.core_dram_tb.dram.store_queue.wr_data[79:0]} top.core_dram_tb.dram.store_queue.wr_data[79] top.core_dram_tb.dram.store_queue.wr_data[78] top.core_dram_tb.dram.store_queue.wr_data[77] top.core_dram_tb.dram.store_queue.wr_data[76] top.core_dram_tb.dram.store_queue.wr_data[75] top.core_dram_tb.dram.store_queue.wr_data[74] top.core_dram_tb.dram.store_queue.wr_data[73] top.core_dram_tb.dram.store_queue.wr_data[72] top.core_dram_tb.dram.store_queue.wr_data[71] top.core_dram_tb.dram.store_queue.wr_data[70] top.core_dram_tb.dram.store_queue.wr_data[69] top.core_dram_tb.dram.store_queue.wr_data[68] top.core_dram_tb.dram.store_queue.wr_data[67] top.core_dram_tb.dram.store_queue.wr_data[66] top.core_dram_tb.dram.store_queue.wr_data[65] top.core_dram_tb.dram.store_queue.wr_data[64] top.core_dram_tb.dram.store_queue.wr_data[63] top.core_dram_tb.dram.store_queue.wr_data[62] top.core_dram_tb.dram.store_queue.wr_data[61] top.core_dram_tb.dram.store_queue.wr_data[60] top.core_dram_tb.dram.store_queue.wr_data[59] top.core_dram_tb.dram.store_queue.wr_data[58] top.core_dram_tb.dram.store_queue.wr_data[57] top.core_dram_tb.dram.store_queue.wr_data[56] top.core_dram_tb.dram.store_queue.wr_data[55] top.core_dram_tb.dram.store_queue.wr_data[54] top.core_dram_tb.dram.store_queue.wr_data[53] top.core_dram_tb.dram.store_queue.wr_data[52] top.core_dram_tb.dram.store_queue.wr_data[51] top.core_dram_tb.dram.store_queue.wr_data[50] top.core_dram_tb.dram.store_queue.wr_data[49] top.core_dram_tb.dram.store_queue.wr_data[48] top.core_dram_tb.dram.store_queue.wr_data[47] top.core_dram_tb.dram.store_queue.wr_data[46] top.core_dram_tb.dram.store_queue.wr_data[45] top.core_dram_tb.dram.store_queue.wr_data[44] top.core_dram_tb.dram.store_queue.wr_data[43] top.core_dram_tb.dram.store_queue.wr_data[42] top.core_dram_tb.dram.store_queue.wr_data[41] top.core_dram_tb.dram.store_queue.wr_data[40] top.core_dram_tb.dram.store_queue.wr_data[39] top.core_dram_tb.dram.store_queue.wr_data[38] top.core_dram_tb.dram.store_queue.wr_data[37] top.core_dram_tb.dram.store_queue.wr_data[36] top.core_dram_tb.dram.store_queue.wr_data[35] top.core_dram_tb.dram.store_queue.wr_data[34] top.core_dram_tb.dram.store_queue.wr_data[33] top.core_dram_tb.dram.store_queue.wr_data[32] top.core_dram_tb.dram.store_queue.wr_data[31] top.core_dram_tb.dram.store_queue.wr_data[30] top.core_dram_tb.dram.store_queue.wr_data[29] top.core_dram_tb.dram.store_queue.wr_data[28] top.core_dram_tb.dram.store_queue.wr_data[27] top.core_dram_tb.dram.store_queue.wr_data[26] top.core_dram_tb.dram.store_queue.wr_data[25] top.core_dram_tb.dram.store_queue.wr_data[24] top.core_dram_tb.dram.store_queue.wr_data[23] top.core_dram_tb.dram.store_queue.wr_data[22] top.core_dram_tb.dram.store_queue.wr_data[21] top.core_dram_tb.dram.store_queue.wr_data[20] top.core_dram_tb.dram.store_queue.wr_data[19] top.core_dram_tb.dram.store_queue.wr_data[18] top.core_dram_tb.dram.store_queue.wr_data[17] top.core_dram_tb.dram.store_queue.wr_data[16] top.core_dram_tb.dram.store_queue.wr_data[15] top.core_dram_tb.dram.store_queue.wr_data[14] top.core_dram_tb.dram.store_queue.wr_data[13] top.core_dram_tb.dram.store_queue.wr_data[12] top.core_dram_tb.dram.store_queue.wr_data[11] top.core_dram_tb.dram.store_queue.wr_data[10] top.core_dram_tb.dram.store_queue.wr_data[9] top.core_dram_tb.dram.store_queue.wr_data[8] top.core_dram_tb.dram.store_queue.wr_data[7] top.core_dram_tb.dram.store_queue.wr_data[6] top.core_dram_tb.dram.store_queue.wr_data[5] top.core_dram_tb.dram.store_queue.wr_data[4] top.core_dram_tb.dram.store_queue.wr_data[3] top.core_dram_tb.dram.store_queue.wr_data[2] top.core_dram_tb.dram.store_queue.wr_data[1] top.core_dram_tb.dram.store_queue.wr_data[0]
+@420
+top.core_dram_tb.dram.store_queue.wr_idx
+top.core_dram_tb.dram.store_queue.wr_next
+@28
+top.core_dram_tb.dram.store_queue.wr_ready
+top.core_dram_tb.dram.store_queue.wr_valid
+[pattern_trace] 1
+[pattern_trace] 0
diff --git a/litedram/extras/wave.opt b/litedram/extras/wave.opt
new file mode 100644 (file)
index 0000000..f147269
--- /dev/null
@@ -0,0 +1,84 @@
+$ version 1.1
+
+# Signals in entities :
+/core_dram_tb/dram/rst
+/core_dram_tb/dram/system_clk
+/core_dram_tb/dram/system_reset
+/core_dram_tb/dram/wb_in
+/core_dram_tb/dram/wb_out
+/core_dram_tb/dram/user_port0_cmd_valid
+/core_dram_tb/dram/user_port0_cmd_ready
+/core_dram_tb/dram/user_port0_cmd_we
+/core_dram_tb/dram/user_port0_cmd_addr
+/core_dram_tb/dram/user_port0_wdata_valid
+/core_dram_tb/dram/user_port0_wdata_ready
+/core_dram_tb/dram/user_port0_wdata_we
+/core_dram_tb/dram/user_port0_wdata_data
+/core_dram_tb/dram/user_port0_rdata_valid
+/core_dram_tb/dram/user_port0_rdata_ready
+/core_dram_tb/dram/user_port0_rdata_data
+/core_dram_tb/dram/cache_tags
+/core_dram_tb/dram/cache_valids
+/core_dram_tb/dram/storeq_rd_ready
+/core_dram_tb/dram/storeq_rd_valid
+/core_dram_tb/dram/storeq_rd_data
+/core_dram_tb/dram/storeq_wr_ready
+/core_dram_tb/dram/storeq_wr_valid
+/core_dram_tb/dram/storeq_wr_data
+/core_dram_tb/dram/accept_store
+/core_dram_tb/dram/state
+/core_dram_tb/dram/wb_req
+/core_dram_tb/dram/store_queued
+/core_dram_tb/dram/read_ack_0
+/core_dram_tb/dram/read_ack_1
+/core_dram_tb/dram/read_ad3_0
+/core_dram_tb/dram/read_ad3_1
+/core_dram_tb/dram/read_way_0
+/core_dram_tb/dram/read_way_1
+/core_dram_tb/dram/req_index
+/core_dram_tb/dram/req_row
+/core_dram_tb/dram/req_hit_way
+/core_dram_tb/dram/req_tag
+/core_dram_tb/dram/req_op
+/core_dram_tb/dram/req_laddr
+/core_dram_tb/dram/req_ad3
+/core_dram_tb/dram/req_we
+/core_dram_tb/dram/req_wdata
+/core_dram_tb/dram/store_way
+/core_dram_tb/dram/store_index
+/core_dram_tb/dram/store_row
+/core_dram_tb/dram/cache_out
+/core_dram_tb/dram/plru_victim
+/core_dram_tb/dram/replace_way
+/core_dram_tb/dram/rams/do_read
+/core_dram_tb/dram/rams/do_write
+/core_dram_tb/dram/rams/rd_addr
+/core_dram_tb/dram/rams/wr_addr
+/core_dram_tb/dram/rams/wr_data
+/core_dram_tb/dram/rams/wr_sel
+/core_dram_tb/dram/rams/wr_sel_m
+/core_dram_tb/dram/rams/dout
+/core_dram_tb/dram/rams/way/clk
+/core_dram_tb/dram/rams/way/rd_en
+/core_dram_tb/dram/rams/way/rd_addr
+/core_dram_tb/dram/rams/way/rd_data
+/core_dram_tb/dram/rams/way/wr_sel
+/core_dram_tb/dram/rams/way/wr_addr
+/core_dram_tb/dram/rams/way/wr_data
+/core_dram_tb/dram/rams/way/rd_data0
+/core_dram_tb/dram/store_queue/wr_ready
+/core_dram_tb/dram/store_queue/wr_valid
+/core_dram_tb/dram/store_queue/wr_data
+/core_dram_tb/dram/store_queue/rd_ready
+/core_dram_tb/dram/store_queue/rd_valid
+/core_dram_tb/dram/store_queue/rd_data
+/core_dram_tb/dram/store_queue/rd_idx
+/core_dram_tb/dram/store_queue/rd_next
+/core_dram_tb/dram/store_queue/wr_idx
+/core_dram_tb/dram/store_queue/wr_next
+/core_dram_tb/dram/store_queue/op_prev
+/core_dram_tb/dram/store_queue/op_next
+/core_dram_tb/dram/store_queue/full
+/core_dram_tb/dram/store_queue/empty
+/core_dram_tb/dram/store_queue/push
+/core_dram_tb/dram/store_queue/pop
index 47f0a6ffd87e304c48675d0877ac0f8f4acbf259..6bd3636d113a2adc3d1b6c5af92a93f4c9b643c0 100644 (file)
@@ -5,131 +5,147 @@ use std.textio.all;
 
 library work;
 use work.wishbone_types.all;
+use work.utils.all;
+use work.helpers.all;
 
 entity litedram_wrapper is
     generic (
        DRAM_ABITS     : positive;
        DRAM_ALINES    : positive;
+
         -- Pseudo-ROM payload
         PAYLOAD_SIZE      : natural;    
         PAYLOAD_FILE      : string;
+
+        -- L2 cache --
+
+        -- Line size in bytes
+        LINE_SIZE         : positive := 128;
+        -- Number of lines in a set
+        NUM_LINES         : positive := 32;
+        -- Number of ways
+        NUM_WAYS          : positive := 4;
+        -- Max number of stores in the queue
+        STOREQ_DEPTH      : positive := 8;
+        -- Don't send loads until all pending stores acked in litedram
+        NO_LS_OVERLAP     : boolean  := false;
+
         -- Debug
-        LITEDRAM_TRACE    : boolean  := false
-       );
+        LITEDRAM_TRACE    : boolean  := false;
+        TRACE             : boolean  := false
+        );
     port(
-       -- LiteDRAM generates the system clock and reset
-       -- from the input clkin
-       clk_in          : in std_ulogic;
-       rst             : in std_ulogic;
-       system_clk      : out std_ulogic;
-       system_reset    : out std_ulogic;
-       core_alt_reset  : out std_ulogic;
-       pll_locked      : out std_ulogic;
-
-       -- Wishbone ports:
-       wb_in           : in wishbone_master_out;
-       wb_out          : out wishbone_slave_out;
-       wb_ctrl_in      : in wb_io_master_out;
-       wb_ctrl_out     : out wb_io_slave_out;
-       wb_ctrl_is_csr  : in std_ulogic;
-       wb_ctrl_is_init : in std_ulogic;
-
-       -- Init core serial debug
-       serial_tx     : out std_ulogic;
-       serial_rx     : in std_ulogic;
-
-       -- Misc
-       init_done     : out std_ulogic;
-       init_error    : out std_ulogic;
-
-       -- DRAM wires
-       ddram_a       : out std_ulogic_vector(DRAM_ALINES-1 downto 0);
-       ddram_ba      : out std_ulogic_vector(2 downto 0);
-       ddram_ras_n   : out std_ulogic;
-       ddram_cas_n   : out std_ulogic;
-       ddram_we_n    : out std_ulogic;
-       ddram_cs_n    : out std_ulogic;
-       ddram_dm      : out std_ulogic_vector(1 downto 0);
-       ddram_dq      : inout std_ulogic_vector(15 downto 0);
-       ddram_dqs_p   : inout std_ulogic_vector(1 downto 0);
-       ddram_dqs_n   : inout std_ulogic_vector(1 downto 0);
-       ddram_clk_p   : out std_ulogic;
-       ddram_clk_n   : out std_ulogic;
-       ddram_cke     : out std_ulogic;
-       ddram_odt     : out std_ulogic;
-       ddram_reset_n : out std_ulogic
-       );
+        -- LiteDRAM generates the system clock and reset
+        -- from the input clkin
+        clk_in          : in std_ulogic;
+        rst             : in std_ulogic;
+        system_clk      : out std_ulogic;
+        system_reset    : out std_ulogic;
+        core_alt_reset  : out std_ulogic;
+        pll_locked      : out std_ulogic;
+
+        -- Wishbone ports:
+        wb_in           : in wishbone_master_out;
+        wb_out          : out wishbone_slave_out;
+        wb_ctrl_in      : in wb_io_master_out;
+        wb_ctrl_out     : out wb_io_slave_out;
+        wb_ctrl_is_csr  : in std_ulogic;
+        wb_ctrl_is_init : in std_ulogic;
+
+        -- Init core serial debug
+        serial_tx     : out std_ulogic;
+        serial_rx     : in std_ulogic;
+
+        -- Misc
+        init_done     : out std_ulogic;
+        init_error    : out std_ulogic;
+
+        -- DRAM wires
+        ddram_a       : out std_ulogic_vector(DRAM_ALINES-1 downto 0);
+        ddram_ba      : out std_ulogic_vector(2 downto 0);
+        ddram_ras_n   : out std_ulogic;
+        ddram_cas_n   : out std_ulogic;
+        ddram_we_n    : out std_ulogic;
+        ddram_cs_n    : out std_ulogic;
+        ddram_dm      : out std_ulogic_vector(1 downto 0);
+        ddram_dq      : inout std_ulogic_vector(15 downto 0);
+        ddram_dqs_p   : inout std_ulogic_vector(1 downto 0);
+        ddram_dqs_n   : inout std_ulogic_vector(1 downto 0);
+        ddram_clk_p   : out std_ulogic;
+        ddram_clk_n   : out std_ulogic;
+        ddram_cke     : out std_ulogic;
+        ddram_odt     : out std_ulogic;
+        ddram_reset_n : out std_ulogic
+        );
 end entity litedram_wrapper;
 
 architecture behaviour of litedram_wrapper is
 
     component litedram_core port (
-       clk                            : in std_ulogic;
-       rst                            : in std_ulogic;
-       pll_locked                     : out std_ulogic;
-       ddram_a                        : out std_ulogic_vector(DRAM_ALINES-1 downto 0);
-       ddram_ba                       : out std_ulogic_vector(2 downto 0);
-       ddram_ras_n                    : out std_ulogic;
-       ddram_cas_n                    : out std_ulogic;
-       ddram_we_n                     : out std_ulogic;
-       ddram_cs_n                     : out std_ulogic;
-       ddram_dm                       : out std_ulogic_vector(1 downto 0);
-       ddram_dq                       : inout std_ulogic_vector(15 downto 0);
-       ddram_dqs_p                    : inout std_ulogic_vector(1 downto 0);
-       ddram_dqs_n                    : inout std_ulogic_vector(1 downto 0);
-       ddram_clk_p                    : out std_ulogic;
-       ddram_clk_n                    : out std_ulogic;
-       ddram_cke                      : out std_ulogic;
-       ddram_odt                      : out std_ulogic;
-       ddram_reset_n                  : out std_ulogic;
-       init_done                      : out std_ulogic;
-       init_error                     : out std_ulogic;
-       user_clk                       : out std_ulogic;
-       user_rst                       : out std_ulogic;
-       wb_ctrl_adr                    : in std_ulogic_vector(29 downto 0);
-       wb_ctrl_dat_w                  : in std_ulogic_vector(31 downto 0);
-       wb_ctrl_dat_r                  : out std_ulogic_vector(31 downto 0);
-       wb_ctrl_sel                    : in std_ulogic_vector(3 downto 0);
-       wb_ctrl_cyc                    : in std_ulogic;
-       wb_ctrl_stb                    : in std_ulogic;
-       wb_ctrl_ack                    : out std_ulogic;
-       wb_ctrl_we                     : in std_ulogic;
-       wb_ctrl_cti                    : in std_ulogic_vector(2 downto 0);
-       wb_ctrl_bte                    : in std_ulogic_vector(1 downto 0);
-       wb_ctrl_err                    : out std_ulogic;
-       user_port_native_0_cmd_valid   : in std_ulogic;
-       user_port_native_0_cmd_ready   : out std_ulogic;
-       user_port_native_0_cmd_we      : in std_ulogic;
-       user_port_native_0_cmd_addr    : in std_ulogic_vector(DRAM_ABITS-1 downto 0);
-       user_port_native_0_wdata_valid : in std_ulogic;
-       user_port_native_0_wdata_ready : out std_ulogic;
-       user_port_native_0_wdata_we    : in std_ulogic_vector(15 downto 0);
-       user_port_native_0_wdata_data  : in std_ulogic_vector(127 downto 0);
-       user_port_native_0_rdata_valid : out std_ulogic;
-       user_port_native_0_rdata_ready : in std_ulogic;
-       user_port_native_0_rdata_data  : out std_ulogic_vector(127 downto 0)
-       );
+        clk                            : in std_ulogic;
+        rst                            : in std_ulogic;
+        pll_locked                     : out std_ulogic;
+        ddram_a                        : out std_ulogic_vector(DRAM_ALINES-1 downto 0);
+        ddram_ba                       : out std_ulogic_vector(2 downto 0);
+        ddram_ras_n                    : out std_ulogic;
+        ddram_cas_n                    : out std_ulogic;
+        ddram_we_n                     : out std_ulogic;
+        ddram_cs_n                     : out std_ulogic;
+        ddram_dm                       : out std_ulogic_vector(1 downto 0);
+        ddram_dq                       : inout std_ulogic_vector(15 downto 0);
+        ddram_dqs_p                    : inout std_ulogic_vector(1 downto 0);
+        ddram_dqs_n                    : inout std_ulogic_vector(1 downto 0);
+        ddram_clk_p                    : out std_ulogic;
+        ddram_clk_n                    : out std_ulogic;
+        ddram_cke                      : out std_ulogic;
+        ddram_odt                      : out std_ulogic;
+        ddram_reset_n                  : out std_ulogic;
+        init_done                      : out std_ulogic;
+        init_error                     : out std_ulogic;
+        user_clk                       : out std_ulogic;
+        user_rst                       : out std_ulogic;
+        wb_ctrl_adr                    : in std_ulogic_vector(29 downto 0);
+        wb_ctrl_dat_w                  : in std_ulogic_vector(31 downto 0);
+        wb_ctrl_dat_r                  : out std_ulogic_vector(31 downto 0);
+        wb_ctrl_sel                    : in std_ulogic_vector(3 downto 0);
+        wb_ctrl_cyc                    : in std_ulogic;
+        wb_ctrl_stb                    : in std_ulogic;
+        wb_ctrl_ack                    : out std_ulogic;
+        wb_ctrl_we                     : in std_ulogic;
+        wb_ctrl_cti                    : in std_ulogic_vector(2 downto 0);
+        wb_ctrl_bte                    : in std_ulogic_vector(1 downto 0);
+        wb_ctrl_err                    : out std_ulogic;
+        user_port_native_0_cmd_valid   : in std_ulogic;
+        user_port_native_0_cmd_ready   : out std_ulogic;
+        user_port_native_0_cmd_we      : in std_ulogic;
+        user_port_native_0_cmd_addr    : in std_ulogic_vector(DRAM_ABITS-1 downto 0);
+        user_port_native_0_wdata_valid : in std_ulogic;
+        user_port_native_0_wdata_ready : out std_ulogic;
+        user_port_native_0_wdata_we    : in std_ulogic_vector(15 downto 0);
+        user_port_native_0_wdata_data  : in std_ulogic_vector(127 downto 0);
+        user_port_native_0_rdata_valid : out std_ulogic;
+        user_port_native_0_rdata_ready : in std_ulogic;
+        user_port_native_0_rdata_data  : out std_ulogic_vector(127 downto 0)
+        );
     end component;
     
-    signal user_port0_cmd_valid                : std_ulogic;
-    signal user_port0_cmd_ready                : std_ulogic;
-    signal user_port0_cmd_we           : std_ulogic;
-    signal user_port0_cmd_addr         : std_ulogic_vector(DRAM_ABITS-1 downto 0);
-    signal user_port0_wdata_valid      : std_ulogic;
-    signal user_port0_wdata_ready      : std_ulogic;
-    signal user_port0_wdata_we         : std_ulogic_vector(15 downto 0);
-    signal user_port0_wdata_data       : std_ulogic_vector(127 downto 0);
-    signal user_port0_rdata_valid      : std_ulogic;
-    signal user_port0_rdata_ready      : std_ulogic;
-    signal user_port0_rdata_data       : std_ulogic_vector(127 downto 0);
-
-    signal ad3                          : std_ulogic;
+    signal user_port0_cmd_valid         : std_ulogic;
+    signal user_port0_cmd_ready         : std_ulogic;
+    signal user_port0_cmd_we            : std_ulogic;
+    signal user_port0_cmd_addr          : std_ulogic_vector(DRAM_ABITS-1 downto 0);
+    signal user_port0_wdata_valid       : std_ulogic;
+    signal user_port0_wdata_ready       : std_ulogic;
+    signal user_port0_wdata_we          : std_ulogic_vector(15 downto 0);
+    signal user_port0_wdata_data        : std_ulogic_vector(127 downto 0);
+    signal user_port0_rdata_valid       : std_ulogic;
+    signal user_port0_rdata_ready       : std_ulogic;
+    signal user_port0_rdata_data        : std_ulogic_vector(127 downto 0);
 
     signal wb_ctrl_adr                  : std_ulogic_vector(29 downto 0);
     signal wb_ctrl_dat_w                : std_ulogic_vector(31 downto 0);
     signal wb_ctrl_dat_r                : std_ulogic_vector(31 downto 0);
     signal wb_ctrl_sel                  : std_ulogic_vector(3 downto 0);
-    signal wb_ctrl_cyc                  : std_ulogic;
+    signal wb_ctrl_cyc                  : std_ulogic := '0';
     signal wb_ctrl_stb                  : std_ulogic;
     signal wb_ctrl_ack                  : std_ulogic;
     signal wb_ctrl_we                   : std_ulogic;
@@ -137,11 +153,239 @@ architecture behaviour of litedram_wrapper is
     signal wb_init_in                   : wb_io_master_out;
     signal wb_init_out                  : wb_io_slave_out;
 
-    type state_t is (CMD, MWRITE, MREAD);
+    -- DRAM data port width
+    constant DRAM_DBITS                 : natural := 128;
+    constant DRAM_SBITS                 : natural := (DRAM_DBITS / 8);
+
+    -- BRAM organisation: We never access more than wishbone_data_bits at
+    -- a time so to save resources we make the array only that wide, and
+    -- use consecutive indices for to make a cache "line"
+    --
+    -- ROW_SIZE is the width in bytes of the BRAM (based on litedram, so 128-bits)
+    constant ROW_SIZE      : natural := DRAM_DBITS / 8;
+    -- ROW_PER_LINE is the number of row (litedram transactions) in a line
+    constant ROW_PER_LINE  : natural := LINE_SIZE / ROW_SIZE;
+    -- BRAM_ROWS is the number of rows in BRAM needed to represent the full
+    -- dcache
+    constant BRAM_ROWS     : natural := NUM_LINES * ROW_PER_LINE;
+
+    -- Bit fields counts in the address
+
+    -- ROW_BITS is the number of bits to select a row
+    constant ROW_BITS      : natural := log2(BRAM_ROWS);
+    -- ROW_LINEBITS is the number of bits to select a row within a line
+    constant ROW_LINEBITS  : natural := log2(ROW_PER_LINE);
+    -- LINE_OFF_BITS is the number of bits for the offset in a cache line
+    constant LINE_OFF_BITS : natural := log2(LINE_SIZE);
+    -- ROW_OFF_BITS is the number of bits for the offset in a row
+    constant ROW_OFF_BITS  : natural := log2(ROW_SIZE);
+    -- REAL_ADDR_BITS is the number of real address bits that we store
+    constant REAL_ADDR_BITS : positive := DRAM_ABITS + ROW_OFF_BITS;
+    -- INDEX_BITS is the number if bits to select a cache line
+    constant INDEX_BITS    : natural := log2(NUM_LINES);
+    -- SET_SIZE_BITS is the log base 2 of the set size
+    constant SET_SIZE_BITS : natural := LINE_OFF_BITS + INDEX_BITS;
+    -- TAG_BITS is the number of bits of the tag part of the address
+    constant TAG_BITS      : natural := REAL_ADDR_BITS - SET_SIZE_BITS;
+    -- WAY_BITS is the number of bits to select a way
+    constant WAY_BITS     : natural := log2(NUM_WAYS);
+
+    subtype row_t is integer range 0 to BRAM_ROWS-1;
+    subtype index_t is integer range 0 to NUM_LINES-1;
+    subtype way_t is integer range 0 to NUM_WAYS-1;
+
+    -- The cache data BRAM organized as described above for each way
+    subtype cache_row_t is std_ulogic_vector(DRAM_DBITS-1 downto 0);
+
+    -- The cache tags LUTRAM has a row per set. Vivado is a pain and will
+    -- not handle a clean (commented) definition of the cache tags as a 3d
+    -- memory. For now, work around it by putting all the tags
+    subtype cache_tag_t is std_logic_vector(TAG_BITS-1 downto 0);
+--    type cache_tags_set_t is array(way_t) of cache_tag_t;
+--    type cache_tags_array_t is array(index_t) of cache_tags_set_t;
+    constant TAG_RAM_WIDTH : natural := TAG_BITS * NUM_WAYS;
+    subtype cache_tags_set_t is std_logic_vector(TAG_RAM_WIDTH-1 downto 0);
+    type cache_tags_array_t is array(index_t) of cache_tags_set_t;
+
+    -- The cache valid bits
+    subtype cache_way_valids_t is std_ulogic_vector(NUM_WAYS-1 downto 0);
+    type cache_valids_t is array(index_t) of cache_way_valids_t;
+
+    -- Storage. Hopefully "cache_rows" is a BRAM, the rest is LUTs
+    signal cache_tags   : cache_tags_array_t;
+    signal cache_valids : cache_valids_t;
+
+    attribute ram_style : string;
+    attribute ram_style of cache_tags : signal is "distributed";
+
+    --
+    -- Store queue signals
+    --
+    -- We store a single wishbone dword per entry (64-bit) but all
+    -- 16 sel bits for the DRAM.
+    -- XXX Investigate storing only AD3 and 8 sel bits if it's better
+    constant STOREQ_BITS  : positive := wishbone_data_bits + DRAM_SBITS;
+
+    signal storeq_rd_ready : std_ulogic;
+    signal storeq_rd_valid : std_ulogic;
+    signal storeq_rd_data  : std_ulogic_vector(STOREQ_BITS-1 downto 0);
+    signal storeq_wr_ready : std_ulogic;
+    signal storeq_wr_valid : std_ulogic;
+    signal storeq_wr_data  : std_ulogic_vector(STOREQ_BITS-1 downto 0);
+
+    --
+    -- Cache management signals
+    --
+
+     -- Cache state machine
+    type state_t is (IDLE,             -- Normal load hit processing
+                     REFILL_WAIT_ACK); -- Cache refill wait ack
     signal state : state_t;
 
+    -- Latched WB request.
+    signal wb_req : wishbone_master_out := wishbone_master_out_init;
+
+    -- Read pipeline (to handle cache RAM latency)
+    signal read_ack_0  : std_ulogic;
+    signal read_ack_1  : std_ulogic;
+    signal read_ad3_0  : std_ulogic;
+    signal read_ad3_1  : std_ulogic;
+    signal read_way_0  : way_t;
+    signal read_way_1  : way_t;
+
+    -- Async signals decoding latched request
+    type req_op_t is (OP_NONE,
+                      OP_LOAD_HIT,
+                      OP_LOAD_MISS,
+                      OP_STORE_HIT,
+                      OP_STORE_MISS);
+
+    signal req_index    : index_t;
+    signal req_row      : row_t;
+    signal req_hit_way  : way_t;
+    signal req_tag      : cache_tag_t;
+    signal req_op       : req_op_t;
+    signal req_laddr    : std_ulogic_vector(REAL_ADDR_BITS-1 downto 0);
+    signal req_ad3      : std_ulogic;
+    signal req_we       : std_ulogic_vector(DRAM_SBITS-1 downto 0);
+    signal req_wdata    : std_ulogic_vector(DRAM_DBITS-1 downto 0);
+    signal accept_store : std_ulogic;
+
+    -- Line refill command signals and latches
+    signal refill_cmd_valid : std_ulogic;
+    signal refill_cmd_addr  : std_ulogic_vector(DRAM_ABITS-1 downto 0);
+    signal refill_way       : way_t;
+    signal refill_index     : index_t;
+    signal refill_row       : row_t;
+
+    -- Cache RAM interface
+    type cache_ram_out_t is array(way_t) of cache_row_t;
+    signal cache_out   : cache_ram_out_t;
+
+    -- PLRU output interface
+    type plru_out_t is array(index_t) of std_ulogic_vector(WAY_BITS-1 downto 0);
+    signal plru_victim : plru_out_t;
+
+    --
+    -- Helper functions to decode incoming requests
+    --
+
+    -- Return the cache line index (tag index) for an address
+    function get_index(addr: wishbone_addr_type) return index_t is
+    begin
+        return to_integer(unsigned(addr(SET_SIZE_BITS - 1 downto LINE_OFF_BITS)));
+    end;
+
+    -- Return the cache row index (data memory) for an address
+    function get_row(addr: std_ulogic_vector(REAL_ADDR_BITS-1 downto 0)) return row_t is
+    begin
+        return to_integer(unsigned(addr(SET_SIZE_BITS - 1 downto ROW_OFF_BITS)));
+    end;
+
+    -- Returns whether this is the last row of a line. It takes a DRAM address
+    function is_last_row_addr(addr: std_ulogic_vector(REAL_ADDR_BITS-1 downto ROW_OFF_BITS))
+        return boolean is
+        constant ones : std_ulogic_vector(ROW_LINEBITS-1 downto 0) := (others => '1');
+    begin
+        return addr(LINE_OFF_BITS-1 downto ROW_OFF_BITS) = ones;
+    end;
+
+    -- Returns whether this is the last row of a line
+    function is_last_row(row: row_t) return boolean is
+        variable row_v : std_ulogic_vector(ROW_BITS-1 downto 0);
+        constant ones  : std_ulogic_vector(ROW_LINEBITS-1 downto 0) := (others => '1');
+    begin
+        row_v := std_ulogic_vector(to_unsigned(row, ROW_BITS));
+        return row_v(ROW_LINEBITS-1 downto 0) = ones;
+    end;
+
+    -- Return the address of the next row in the current cache line. It takes a
+    -- DRAM address
+    function next_row_addr(addr: std_ulogic_vector(REAL_ADDR_BITS-1 downto ROW_OFF_BITS))
+        return std_ulogic_vector is
+        variable row_idx : std_ulogic_vector(ROW_LINEBITS-1 downto 0);
+        variable result  : std_ulogic_vector(REAL_ADDR_BITS-1 downto ROW_OFF_BITS);
+    begin
+        -- Is there no simpler way in VHDL to generate that 3 bits adder ?
+        row_idx := addr(LINE_OFF_BITS-1 downto ROW_OFF_BITS);
+        row_idx := std_ulogic_vector(unsigned(row_idx) + 1);
+        result := addr;
+        result(LINE_OFF_BITS-1 downto ROW_OFF_BITS) := row_idx;
+        return result;
+    end;
+
+    -- Return the next row in the current cache line. We use a dedicated
+    -- function in order to limit the size of the generated adder to be
+    -- only the bits within a cache line (3 bits with default settings)
+    --
+    function next_row(row: row_t) return row_t is
+       variable row_v  : std_ulogic_vector(ROW_BITS-1 downto 0);
+       variable row_idx : std_ulogic_vector(ROW_LINEBITS-1 downto 0);
+       variable result : std_ulogic_vector(ROW_BITS-1 downto 0);
+    begin
+       row_v := std_ulogic_vector(to_unsigned(row, ROW_BITS));
+       row_idx := row_v(ROW_LINEBITS-1 downto 0);
+       row_v(ROW_LINEBITS-1 downto 0) := std_ulogic_vector(unsigned(row_idx) + 1);
+       return to_integer(unsigned(row_v));
+    end;
+
+    -- Get the tag value from the address
+    function get_tag(addr: wishbone_addr_type) return cache_tag_t is
+    begin
+        return addr(REAL_ADDR_BITS - 1 downto SET_SIZE_BITS);
+    end;
+
+    -- Read a tag from a tag memory row
+    function read_tag(way: way_t; tagset: cache_tags_set_t) return cache_tag_t is
+    begin
+        return tagset((way+1) * TAG_BITS - 1 downto way * TAG_BITS);
+    end;
+
+    -- Write a tag to tag memory row
+    procedure write_tag(way: in way_t; tagset: inout cache_tags_set_t;
+                        tag: cache_tag_t) is
+    begin
+        tagset((way+1) * TAG_BITS - 1 downto way * TAG_BITS) := tag;
+    end;
+
 begin
 
+    -- Sanity checks
+    assert LINE_SIZE mod ROW_SIZE = 0 report "LINE_SIZE not multiple of ROW_SIZE" severity FAILURE;
+    assert ispow2(LINE_SIZE)    report "LINE_SIZE not power of 2" severity FAILURE;
+    assert ispow2(NUM_LINES)    report "NUM_LINES not power of 2" severity FAILURE;
+    assert ispow2(ROW_PER_LINE) report "ROW_PER_LINE not power of 2" severity FAILURE;
+    assert (ROW_BITS = INDEX_BITS + ROW_LINEBITS)
+        report "geometry bits don't add up" severity FAILURE;
+    assert (LINE_OFF_BITS = ROW_OFF_BITS + ROW_LINEBITS)
+        report "geometry bits don't add up" severity FAILURE;
+    assert (REAL_ADDR_BITS = TAG_BITS + INDEX_BITS + LINE_OFF_BITS)
+        report "geometry bits don't add up" severity FAILURE;
+    assert (REAL_ADDR_BITS = TAG_BITS + ROW_BITS + ROW_OFF_BITS)
+        report "geometry bits don't add up" severity FAILURE;
+    assert (128 = DRAM_DBITS)
+        report "Can't yet handle a DRAM width that isn't 128-bits" severity FAILURE;
+
     -- alternate core reset address set when DRAM is not initialized.
     core_alt_reset <= not init_done;
 
@@ -170,15 +414,35 @@ begin
     wb_init_in.stb <= wb_ctrl_in.stb;
     wb_init_in.cyc <= wb_ctrl_in.cyc and wb_ctrl_is_init;
 
-    -- DRAM CSR IN signals
-    wb_ctrl_adr   <= x"0000" & wb_ctrl_in.adr(15 downto 2);
-    wb_ctrl_dat_w <= wb_ctrl_in.dat;
-    wb_ctrl_sel   <= wb_ctrl_in.sel;
-    wb_ctrl_we    <= wb_ctrl_in.we;
-    wb_ctrl_cyc   <= wb_ctrl_in.cyc and wb_ctrl_is_csr;
-    wb_ctrl_stb   <= wb_ctrl_in.stb and wb_ctrl_is_csr;
+    -- DRAM CSR IN signals. Extra latch to help with timing
+    csr_latch: process(system_clk)
+    begin
+        if rising_edge(system_clk) then
+            if system_reset = '1' then
+                wb_ctrl_cyc <= '0';
+                wb_ctrl_stb <= '0';
+            else
+                -- XXX Maybe only update addr when cyc = '1' to save power ?
+                wb_ctrl_adr   <= x"0000" & wb_ctrl_in.adr(15 downto 2);
+                wb_ctrl_dat_w <= wb_ctrl_in.dat;
+                wb_ctrl_sel   <= wb_ctrl_in.sel;
+                wb_ctrl_we    <= wb_ctrl_in.we;
+                wb_ctrl_cyc   <= wb_ctrl_in.cyc and wb_ctrl_is_csr;
+                wb_ctrl_stb   <= wb_ctrl_in.stb and wb_ctrl_is_csr;
+
+                -- Clear stb on ack otherwise the memory will latch
+                -- the write twice which breaks levelling. On the next
+                -- cycle we will latch an updated stb that takes the
+                -- ack into account.
+                if wb_ctrl_ack = '1' then
+                    wb_ctrl_stb <= '0';
+                end if;
+            end if;
+        end if;
+    end process;
 
-    -- Ctrl bus wishbone OUT signals
+    -- Ctrl bus wishbone OUT signals. XXX Consider adding latch on
+    -- CSR response to help timing
     wb_ctrl_out.ack   <= wb_ctrl_ack when wb_ctrl_is_csr = '1'
                          else wb_init_out.ack;
     wb_ctrl_out.dat   <= wb_ctrl_dat_r when wb_ctrl_is_csr = '1'
@@ -186,60 +450,535 @@ begin
     wb_ctrl_out.stall <= wb_init_out.stall when wb_ctrl_is_init else
                          '0' when wb_ctrl_in.cyc = '0' else not wb_ctrl_ack;
 
+
+    -- Generate a cache RAM for each way
+    rams: for i in 0 to NUM_WAYS-1 generate
+        signal do_read  : std_ulogic;
+        signal do_write : std_ulogic;
+        signal rd_addr  : std_ulogic_vector(ROW_BITS-1 downto 0);
+        signal wr_addr  : std_ulogic_vector(ROW_BITS-1 downto 0);
+        signal wr_data  : std_ulogic_vector(DRAM_DBITS-1 downto 0);
+        signal wr_sel   : std_ulogic_vector(ROW_SIZE-1 downto 0);
+        signal wr_sel_m : std_ulogic_vector(ROW_SIZE-1 downto 0);
+        signal dout     : cache_row_t;
+   begin
+        way: entity work.cache_ram
+            generic map (
+                ROW_BITS => ROW_BITS,
+                WIDTH    => DRAM_DBITS,
+                ADD_BUF  => true
+                )
+            port map (
+                clk     => system_clk,
+                rd_en   => do_read,
+                rd_addr => rd_addr,
+                rd_data => dout,
+                wr_sel  => wr_sel_m,
+                wr_addr => wr_addr,
+                wr_data => wr_data
+                );
+        process(all)
+        begin
+            --
+            -- Read port
+            --
+            do_read <= '1';
+            cache_out(i) <= dout;
+            rd_addr <= std_ulogic_vector(to_unsigned(req_row, ROW_BITS));
+
+            --
+            -- Write mux: cache refills from DRAM or writes from Wishbone
+            --
+            if state = IDLE then
+                -- Write from wishbone
+                wr_addr <= std_ulogic_vector(to_unsigned(req_row, ROW_BITS));
+                wr_data <= req_wdata;
+                wr_sel  <= req_we;
+            else
+                -- Refill from DRAM
+                wr_data <= user_port0_rdata_data;
+                wr_sel  <= (others => '1');
+                wr_addr <= std_ulogic_vector(to_unsigned(refill_row, ROW_BITS));
+            end if;
+
+            --
+            -- Write enable logic
+            --
+            do_write <= '0';
+            if req_op = OP_STORE_HIT and req_hit_way = i then
+                do_write <= '1';
+            elsif user_port0_rdata_valid = '1' and refill_way = i then
+                do_write <= '1';
+            end if;
+
+            -- Mask write selects with do_write since BRAM doesn't always
+            -- have a global write-enable (Vivado generates TDP instead
+            -- of SDP when using one, thus doubling cache BRAM usage).
+            for i in 0 to ROW_SIZE-1 loop
+                wr_sel_m(i) <= wr_sel(i) and do_write;
+            end loop;
+
+            if TRACE and rising_edge(system_clk) then
+                if do_write = '1' then
+                    report "cache write way:" & integer'image(i) &
+                        " addr:" & to_hstring(wr_addr) &
+                        " sel:" & to_hstring(wr_sel_m) &
+                        " data:" & to_hstring(wr_data);
+                end if;
+            end if;
+        end process;
+    end generate;
+
+    -- Generate PLRUs
+    maybe_plrus: if NUM_WAYS > 1 generate
+    begin
+        plrus: for i in 0 to NUM_LINES-1 generate
+            -- PLRU interface
+            signal plru_acc    : std_ulogic_vector(WAY_BITS-1 downto 0);
+            signal plru_acc_en : std_ulogic;
+            signal plru_out    : std_ulogic_vector(WAY_BITS-1 downto 0);
+        begin
+            plru : entity work.plru
+                generic map (
+                    BITS => WAY_BITS
+                    )
+                port map (
+                    clk => system_clk,
+                    rst => system_reset,
+                    acc => plru_acc,
+                    acc_en => plru_acc_en,
+                    lru => plru_out
+                    );
+
+            process(req_index, req_op, req_hit_way, plru_out)
+            begin
+                -- PLRU interface
+                if (req_op = OP_LOAD_HIT or
+                    req_op = OP_STORE_HIT) and req_index = i then
+                    plru_acc_en <= '1';
+                else
+                    plru_acc_en <= '0';
+                end if;
+                plru_acc <= std_ulogic_vector(to_unsigned(req_hit_way, WAY_BITS));
+                plru_victim(i) <= plru_out;
+            end process;
+        end generate;
+    end generate;
+
+    --
+    -- Wishbone interface:
+    --
+    --  - Incoming wishbone request latch (to help with timing)
+    --  - Read response pipeline (to match BRAM output buffer delay)
+    --  - Stall generation
+    --
+    -- XXX TODO: Properly handle cyc drops before all acks are sent...
+    --
+    request_latch: process(system_clk)
+    begin
+        if rising_edge(system_clk) then
+            -- We can latch a new request if we are idle (for now). We also
+            -- latch the absence of request. This is a pipeline that takes
+            -- one per-cycle unless non-IDLE.
+            --
+            if wb_out.stall = '0' then
+                -- Avoid constantly updating addr/data for unrelated requests
+                if wb_in.cyc = '1' then
+                    wb_req <= wb_in;
+                else
+                    wb_req.cyc <= wb_in.cyc;
+                    wb_req.stb <= wb_in.stb;
+                end if;
+
+                if TRACE then
+                    if wb_in.cyc = '1' and wb_in.stb = '1' then
+                        report "latch new wb req ! addr:" & to_hstring(wb_in.adr) &
+                            " we:" & std_ulogic'image(wb_in.we) &
+                            " sel:" & to_hstring(wb_in.sel);
+                    end if;
+                end if;
+            end if;
+        end if;
+    end process;
+
+    --
+    --
+    -- Read response pipeline
+    --
+    -- XXX Might have to put store acks in there too (see comment in wb_response)
+    read_pipe: process(system_clk)
+    begin
+        if rising_edge(system_clk) then
+            read_ack_0 <= '1' when req_op = OP_LOAD_HIT else '0';
+            read_ad3_0 <= req_ad3;
+            read_way_0 <= req_hit_way;
+
+            read_ack_1 <= read_ack_0;
+            read_ad3_1 <= read_ad3_0;
+            read_way_1 <= read_way_0;
+
+            if TRACE then
+                if req_op = OP_LOAD_HIT then
+                    report "Load hit addr:" & to_hstring(wb_req.adr) &
+                        " idx:" & integer'image(req_index) &
+                        " tag:" & to_hstring(req_tag) &
+                        " way:" & integer'image(req_hit_way);
+                elsif req_op = OP_LOAD_MISS then
+                    report "Load miss addr:" & to_hstring(wb_req.adr);
+                end if;
+                if read_ack_0 = '1' then
+                    report "read data:" & to_hstring(cache_out(read_way_0));
+                end if;
+            end if;
+        end if;
+    end process;
+
+    wb_reponse: process(all)
+        variable rdata      : std_ulogic_vector(DRAM_DBITS-1 downto 0);
+        variable store_done : std_ulogic;
+    begin
+        -- Can we accept a store ? This is set when IDLE and the store
+        -- queue & command queue are not full.
+        --
+        -- Note: This is only used to control the WB request latch, stall
+        -- and store "early complete". We don't want to use this to control
+        -- cmd_valid to DRAM as this would create a circular dependency inside
+        -- LiteDRAM as cmd_ready I think is driven from cmd_valid.
+        --
+        -- The state machine that controls the command queue must thus
+        -- reproduce this logic at least partially.
+        --
+        -- Note also that user_port0_cmd_ready from LiteDRAM is combinational
+        -- from user_port0_cmd_valid. IE. we won't know that LiteDRAM cannot
+        -- accept a command until we try to send one.
+        --
+        if state = IDLE then
+            accept_store <= user_port0_cmd_ready and storeq_wr_ready;
+
+            -- Corner case !!! The read acks pipeline takes two extra cycles
+            -- which means a store ack can collide with a previous load hit
+            -- ack. Thus we stall stores if we have a load ack pending.
+            if read_ack_0 = '1' or read_ack_1 = '1' then
+                accept_store <= '0';
+            end if;
+        else
+            accept_store <= '0';
+        end if;
+
+        -- Generate stalls. For loads, we stall if we are going to take a load
+        -- miss or are in the middle of a refill. For stores, if we can't
+        -- accept it.
+        case state is
+        when IDLE =>
+            case req_op is
+            when OP_LOAD_MISS =>
+                wb_out.stall <= '1';
+            when OP_STORE_MISS | OP_STORE_HIT =>
+                wb_out.stall <= not accept_store;
+            when others =>
+                wb_out.stall <= '0';
+            end case;
+        when REFILL_WAIT_ACK =>
+            wb_out.stall <= '1';
+        end case;
+        
+        -- Data out mux
+        rdata := cache_out(read_way_1);
+        wb_out.dat <= rdata(127 downto 64) when read_ad3_1 = '1' else rdata(63 downto 0);
+
+        -- Early-complete stores on wishbone.
+        if req_op = OP_STORE_HIT or req_op = OP_STORE_MISS then
+            store_done := accept_store;
+        else
+            store_done := '0';
+        end if;
+
+        -- Generate ACKs on read hits and store complete
+        --
+        -- XXXX TODO: This can happen on store right behind loads !
+        -- This probably need to be fixed by putting store acks in
+        -- the same pipeline as the read acks. TOOD: Create a testbench
+        -- to exercise those corner cases as the core can't yet.
+        --
+        wb_out.ack <= read_ack_1 or store_done;
+        assert read_ack_0 = '0' or store_done = '0' report
+            "Read ack and store ack collision !"
+            severity failure;
+    end process;
+
+    --
+    -- Cache request decode
+    --
+    request_decode: process(all)
+        variable valid   : std_ulogic;
+        variable is_hit  : std_ulogic;
+        variable hit_way : way_t;
+    begin
+        -- Extract line, row and tag from request
+        req_index <= get_index(wb_req.adr);
+        req_row <= get_row(wb_req.adr(REAL_ADDR_BITS-1 downto 0));
+        req_tag <= get_tag(wb_req.adr);
+
+        -- Calculate address of beginning of cache line, will be
+        -- used for cache miss processing if needed
+        req_laddr <= wb_req.adr(REAL_ADDR_BITS - 1 downto LINE_OFF_BITS) &
+                     (LINE_OFF_BITS-1 downto 0 => '0');
+
+
+        -- Do we have a valid request in the WB latch ?
+        if state = IDLE then
+            valid := wb_req.cyc and wb_req.stb;
+        else
+            valid := '0';
+        end if;
+
+        -- Store signals
+        req_ad3      <= wb_req.adr(3);
+        req_wdata    <= wb_req.dat & wb_req.dat;
+        req_we       <= wb_req.sel & "00000000" when req_ad3 = '1' else
+                        "00000000" & wb_req.sel;
+
+        -- Test if pending request is a hit on any way
+        hit_way := 0;
+        is_hit := '0';
+        for i in way_t loop
+            if valid = '1' and cache_valids(req_index)(i) = '1' then
+                if read_tag(i, cache_tags(req_index)) = req_tag then
+                    hit_way := i;
+                    is_hit := '1';
+                end if;
+            end if;
+        end loop;
+
+        -- Generate the req op. We only allow OP_LOAD_* when in the
+        -- IDLE state as our PLRU and ACK generation rely on this,
+        -- stores are allowed in IDLE state.
+        --
+        req_op <= OP_NONE;
+        if valid = '1' then
+            if wb_req.we = '1' then
+                if is_hit = '1' then
+                    req_op <= OP_STORE_HIT;
+                else
+                    req_op <= OP_STORE_MISS;
+                end if;
+            else
+                if is_hit = '1' then
+                    req_op <= OP_LOAD_HIT;
+                else
+                    req_op <= OP_LOAD_MISS;
+                end if;
+            end if;
+        end if;
+        req_hit_way <= hit_way;
+   end process;
+
     --
-    -- Data bus wishbone to LiteDRAM native port
+    -- Store queue
     --
-    -- Address bit 3 selects the top or bottom half of the data
-    -- bus (64-bit wishbone vs. 128-bit DRAM interface)
+    -- For now, queue up to 16 stores
+    store_queue: entity work.sync_fifo
+       generic map (
+           DEPTH => STOREQ_DEPTH,
+           WIDTH => STOREQ_BITS
+           )
+        port map (
+            clk      => system_clk,
+            reset    => system_reset,
+            rd_ready => storeq_rd_ready,
+            rd_valid => storeq_rd_valid,
+            rd_data  => storeq_rd_data,
+            wr_ready => storeq_wr_ready,
+            wr_valid => storeq_wr_valid,
+            wr_data  => storeq_wr_data
+            );
+
+    storeq_control : process(all)
+        variable stq_data : wishbone_data_type;
+        variable stq_sel  : std_ulogic_vector(DRAM_SBITS-1 downto 0);
+    begin
+        storeq_wr_data <= wb_req.dat & req_we;
+
+        -- Only accept store if we can send a command
+        if req_op = OP_STORE_HIT or req_op = OP_STORE_MISS then
+            storeq_wr_valid <= user_port0_cmd_ready;
+        else
+            storeq_wr_valid <= '0';
+        end if;
+
+        stq_data := storeq_rd_data(storeq_rd_data'left downto DRAM_SBITS);
+        stq_sel  := storeq_rd_data(DRAM_SBITS-1 downto 0);
+        user_port0_wdata_data  <= stq_data & stq_data;
+        user_port0_wdata_we    <= stq_sel;
+        user_port0_wdata_valid <= storeq_rd_valid;
+        storeq_rd_ready        <= user_port0_wdata_ready;
+
+        if TRACE then
+            if rising_edge(system_clk) then
+                if req_op = OP_STORE_HIT then
+                    report "Store hit to:" &
+                        to_hstring(wb_req.adr(DRAM_ABITS+3 downto 0)) &
+                        " data:" & to_hstring(req_wdata) &
+                        " we:" & to_hstring(req_we) &
+                        " V:" & std_ulogic'image(accept_store);
+                else
+                    report "Store miss to:" &
+                        to_hstring(wb_req.adr(DRAM_ABITS+3 downto 0)) &
+                        " data:" & to_hstring(req_wdata) &
+                        " we:" & to_hstring(req_we) &
+                        " V:" & std_ulogic'image(accept_store);
+                end if;
+                if storeq_wr_valid = '1' and storeq_wr_ready = '1' then
+                    report "storeq push " & to_hstring(storeq_wr_data);
+                end if;
+                if storeq_rd_valid = '1' and storeq_rd_ready = '1' then
+                    report "storeq pop " & to_hstring(storeq_rd_data);
+                end if;
+            end if;
+        end if;
+    end process;
+
+    -- LiteDRAM command mux
+    dram_commands: process(all)
+    begin
+        if state = IDLE and (req_op = OP_STORE_HIT or req_op = OP_STORE_MISS) then
+            -- For stores, forward signals directly. Only send command if
+            -- the FIFO can accept a store
+            user_port0_cmd_addr  <= wb_req.adr(DRAM_ABITS+3 downto 4);
+            user_port0_cmd_we    <= '1';
+            user_port0_cmd_valid <= storeq_wr_ready;
+        else
+            -- For loads, we route via a latch controlled by the refill machine
+            user_port0_cmd_addr  <= refill_cmd_addr;
+            user_port0_cmd_valid <= refill_cmd_valid;
+            user_port0_cmd_we    <= '0';
+        end if;
+        user_port0_rdata_ready <= '1'; -- Always 1
+    end process;
+
+    -- LiteDRAM refill machine
     --
-    -- XXX TODO: Figure out how to pipeline this
+    -- This handles the cache line refills
     --
-    ad3 <= wb_in.adr(3);
-
-    -- Wishbone port IN signals
-    user_port0_cmd_valid   <= wb_in.cyc and wb_in.stb when state = CMD else '0';
-    user_port0_cmd_we      <= wb_in.we when state = CMD else '0';
-    user_port0_wdata_valid <= '1' when state = MWRITE else '0';
-    user_port0_rdata_ready <= '1' when state = MREAD else '0';
-    user_port0_cmd_addr    <= wb_in.adr(DRAM_ABITS+3 downto 4);
-    user_port0_wdata_data  <= wb_in.dat & wb_in.dat;
-    user_port0_wdata_we    <= wb_in.sel & "00000000" when ad3 = '1' else
-                              "00000000" & wb_in.sel;
-
-    -- Wishbone OUT signals
-    wb_out.ack <= user_port0_wdata_ready when state = MWRITE else
-                 user_port0_rdata_valid when state = MREAD else '0';
-
-    wb_out.dat <= user_port0_rdata_data(127 downto 64) when ad3 = '1' else
-                 user_port0_rdata_data(63 downto 0);
-
-    -- We don't do pipelining yet.
-    wb_out.stall <= '0' when wb_in.cyc = '0' else not wb_out.ack;
-
-    -- DRAM user port State machine
-    sm: process(system_clk)
+    refill_machine : process(system_clk)
+        variable tagset      : cache_tags_set_t;
+        variable cmds_done   : boolean;
+        variable replace_way : way_t;
+        variable wait_qdrain : boolean;
     begin
-       
-       if rising_edge(system_clk) then
-           if system_reset = '1' then
-               state <= CMD;
-           else
-               case state is
-               when CMD =>
-                    if (user_port0_cmd_ready and user_port0_cmd_valid) = '1' then
-                       state <= MWRITE when wb_in.we = '1' else MREAD;
-                   end if;
-               when MWRITE =>
-                   if user_port0_wdata_ready = '1' then
-                       state <= CMD;
-                   end if;
-               when MREAD =>
-                   if user_port0_rdata_valid = '1' then
-                       state <= CMD;
-                   end if;
+        if rising_edge(system_clk) then
+            -- On reset, clear all valid bits to force misses
+            if system_reset = '1' then
+                for i in index_t loop
+                    cache_valids(i) <= (others => '0');
+                end loop;
+                state <= IDLE;
+                refill_cmd_valid <= '0';
+            else
+                -- Main state machine
+                case state is
+                when IDLE =>
+                    assert refill_cmd_valid = '0' report "refill cmd valid in IDLE state !"
+                        severity failure;
+
+                    -- If NO_LS_OVERLAP is set, disallow a load miss if the store
+                    -- queue still has data in it.
+                    wait_qdrain := false;
+                    if NO_LS_OVERLAP then
+                        wait_qdrain := storeq_rd_valid = '1';
+                    end if;
+
+                    -- We need to read a cache line
+                    if req_op = OP_LOAD_MISS and not wait_qdrain then
+                        -- Grab way to replace
+                        replace_way := to_integer(unsigned(plru_victim(req_index)));
+
+                        -- Force misses on that way while refilling that line
+                        cache_valids(req_index)(replace_way) <= '0';
+
+                        -- Store new tag in selected way
+                        for i in 0 to NUM_WAYS-1 loop
+                            if i = replace_way then
+                                tagset := cache_tags(req_index);
+                                write_tag(i, tagset, req_tag);
+                                cache_tags(req_index) <= tagset;
+                            end if;
+                        end loop;
+
+                        -- Keep track of our index and way for subsequent stores
+                        refill_index <= req_index;
+                        refill_way   <= replace_way;
+                        refill_row   <= get_row(req_laddr);
+
+                        -- Prep for first DRAM read
+                        --
+                        -- XXX TODO: We could start a cycle early here by using
+                        -- combo logic to generate the first command in
+                        -- "dram_commands". In fact, we could make refill_cmd_addr
+                        -- only contain the "counter" bits and wire it with the
+                        -- other bits from req_laddr.
+                        refill_cmd_addr    <= req_laddr(DRAM_ABITS+3 downto 4);
+                        refill_cmd_valid   <= '1';
+
+                        if TRACE then
+                            report "refill addr " & to_hstring(req_laddr);
+                        end if;
+
+                        -- Track that we had one request sent
+                        state <= REFILL_WAIT_ACK;
+                    end if;
+
+                when REFILL_WAIT_ACK =>
+                    -- Commands are all sent if user_port0_cmd_valid is 0
+                    cmds_done := refill_cmd_valid = '0';
+
+                    -- If we are still sending requests, was one accepted ?
+                    if user_port0_cmd_ready = '1' and not cmds_done then
+                        -- That was the last word ? We are done sending. Clear
+                        -- command valid and set cmds_done so we can handle an
+                        -- eventual last ack on the same cycle.
+                        --
+                        if TRACE then
+                            report "got refill cmd ack !";
+                        end if;
+                        if is_last_row_addr(refill_cmd_addr) then
+                            refill_cmd_valid <= '0';
+                            cmds_done := true;
+                            if TRACE then
+                                report "all refill cmds done !";
+                            end if;
+                        else
+                            -- Calculate the next row address
+                            refill_cmd_addr <= next_row_addr(refill_cmd_addr);
+                            if TRACE then
+                                report "refill addr " &
+                                    to_hstring(next_row_addr(refill_cmd_addr));
+                            end if;
+                        end if;
+                    end if;
+
+                    -- Incoming read data processing
+                    if user_port0_rdata_valid = '1' then
+                        if TRACE then
+                            report "got refill data ack !";
+                        end if;
+                        -- Check for completion
+                        if cmds_done and is_last_row(refill_row) then
+                            if TRACE then
+                                report "all refill data done !";
+                            end if;
+                            -- Cache line is now valid
+                            cache_valids(refill_index)(refill_way) <= '1';
+                            -- We are done
+                            state <= IDLE;
+                        end if;
+
+                        -- Increment store row counter
+                        refill_row <= next_row(refill_row);
+                    end if;
                 end case;
-           end if;
-       end if;
+            end if;
+        end if;
     end process;
 
     may_trace: if LITEDRAM_TRACE generate
@@ -250,29 +989,29 @@ begin
     end generate;
     
     litedram: litedram_core
-       port map(
-           clk => clk_in,
-           rst => rst,
-           pll_locked => pll_locked,
-           ddram_a => ddram_a,
-           ddram_ba => ddram_ba,
-           ddram_ras_n => ddram_ras_n,
-           ddram_cas_n => ddram_cas_n,
-           ddram_we_n => ddram_we_n,
-           ddram_cs_n => ddram_cs_n,
-           ddram_dm => ddram_dm,
-           ddram_dq => ddram_dq,
-           ddram_dqs_p => ddram_dqs_p,
-           ddram_dqs_n => ddram_dqs_n,
-           ddram_clk_p => ddram_clk_p,
-           ddram_clk_n => ddram_clk_n,
-           ddram_cke => ddram_cke,
-           ddram_odt => ddram_odt,
-           ddram_reset_n => ddram_reset_n,
-           init_done => init_done,
-           init_error => init_error,
-           user_clk => system_clk,
-           user_rst => system_reset,
+        port map(
+            clk => clk_in,
+            rst => rst,
+            pll_locked => pll_locked,
+            ddram_a => ddram_a,
+            ddram_ba => ddram_ba,
+            ddram_ras_n => ddram_ras_n,
+            ddram_cas_n => ddram_cas_n,
+            ddram_we_n => ddram_we_n,
+            ddram_cs_n => ddram_cs_n,
+            ddram_dm => ddram_dm,
+            ddram_dq => ddram_dq,
+            ddram_dqs_p => ddram_dqs_p,
+            ddram_dqs_n => ddram_dqs_n,
+            ddram_clk_p => ddram_clk_p,
+            ddram_clk_n => ddram_clk_n,
+            ddram_cke => ddram_cke,
+            ddram_odt => ddram_odt,
+            ddram_reset_n => ddram_reset_n,
+            init_done => init_done,
+            init_error => init_error,
+            user_clk => system_clk,
+            user_rst => system_reset,
             wb_ctrl_adr => wb_ctrl_adr,
             wb_ctrl_dat_w => wb_ctrl_dat_w,
             wb_ctrl_dat_r => wb_ctrl_dat_r,
@@ -284,17 +1023,17 @@ begin
             wb_ctrl_cti => "000",
             wb_ctrl_bte => "00",
             wb_ctrl_err => open,
-           user_port_native_0_cmd_valid => user_port0_cmd_valid,
-           user_port_native_0_cmd_ready => user_port0_cmd_ready,
-           user_port_native_0_cmd_we => user_port0_cmd_we,
-           user_port_native_0_cmd_addr => user_port0_cmd_addr,
-           user_port_native_0_wdata_valid => user_port0_wdata_valid,
-           user_port_native_0_wdata_ready => user_port0_wdata_ready,
-           user_port_native_0_wdata_we => user_port0_wdata_we,
-           user_port_native_0_wdata_data => user_port0_wdata_data,
-           user_port_native_0_rdata_valid => user_port0_rdata_valid,
-           user_port_native_0_rdata_ready => user_port0_rdata_ready,
-           user_port_native_0_rdata_data => user_port0_rdata_data
-           );
+            user_port_native_0_cmd_valid => user_port0_cmd_valid,
+            user_port_native_0_cmd_ready => user_port0_cmd_ready,
+            user_port_native_0_cmd_we => user_port0_cmd_we,
+            user_port_native_0_cmd_addr => user_port0_cmd_addr,
+            user_port_native_0_wdata_valid => user_port0_wdata_valid,
+            user_port_native_0_wdata_ready => user_port0_wdata_ready,
+            user_port_native_0_wdata_we => user_port0_wdata_we,
+            user_port_native_0_wdata_data => user_port0_wdata_data,
+            user_port_native_0_rdata_valid => user_port0_rdata_valid,
+            user_port_native_0_rdata_ready => user_port0_rdata_ready,
+            user_port_native_0_rdata_data => user_port0_rdata_data
+            );
 
 end architecture behaviour;
index b980427fd757db9d3ef206e32c6a78249ce31154..6d4068c7d719f3b4fd34a2f614b682fa379bbaec 100644 (file)
@@ -9,9 +9,9 @@
 #define CONFIG_CPU_NOP         "nop"
 
 #ifdef __SIM__
-#define MEMTEST_BUS_SIZE       16
-#define MEMTEST_DATA_SIZE      16
-#define MEMTEST_ADDR_SIZE      16
+#define MEMTEST_BUS_SIZE       512//16
+#define MEMTEST_DATA_SIZE      1024//16
+#define MEMTEST_ADDR_SIZE      128//16
 #define CONFIG_SIM_DISABLE_DELAYS
 #endif
 
index bbad64d36ddad9694c76fb99a1946998feaf14df..e53fc044974d7e73ee3d8e9e9641bbe801ad1a0d 100644 (file)
@@ -510,7 +510,7 @@ a64b5a7d14004a39
 0000000000000000
 0000000000000000
 0000000000000000
-3842a1003c4c0001
+3842a2003c4c0001
 fbc1fff07c0802a6
 f8010010fbe1fff8
 3be10020f821fe91
@@ -519,11 +519,11 @@ f8c101a838800140
 38c101987c651b78
 7fe3fb78f8e101b0
 f92101c0f90101b8
-48001739f94101c8
+480017a5f94101c8
 7c7e1b7860000000
-480012517fe3fb78
+480012bd7fe3fb78
 3821017060000000
-48001cf87fc3f378
+48001d647fc3f378
 0100000000000000
 4e80002000000280
 0000000000000000
@@ -531,67 +531,67 @@ f92101c0f90101b8
 4e8000204c00012c
 0000000000000000
 3c4c000100000000
-7c0802a63842a05c
+7c0802a63842a15c
 7d800026fbe1fff8
 91810008f8010010
-48001145f821ff91
+480011b1f821ff91
 3c62ffff60000000
-4bffff3538637c78
+4bffff3538637be8
 548400023880ffff
 7c8026ea7c0004ac
 3fe0c0003c62ffff
-63ff000838637c98
+63ff000838637c08
 3c62ffff4bffff11
-38637cb87bff0020
+38637c287bff0020
 7c0004ac4bffff01
 73e900017fe0feea
 3c62ffff41820010
-4bfffee538637cd0
+4bfffee538637c40
 4d80000073e90002
 3c62ffff41820010
-4bfffecd38637cd8
+4bfffecd38637c48
 4e00000073e90004
 3c62ffff41820010
-4bfffeb538637ce0
-3bff7f203fe2ffff
+4bfffeb538637c50
+3bff7f283fe2ffff
 4bfffea57fe3fb78
 3c80c00041920028
 7884002060840010
 7c8026ea7c0004ac
 7884b2823c62ffff
-4bfffe7d38637ce8
+4bfffe7d38637c58
 3c80c000418e004c
 7884002060840018
 7c8026ea7c0004ac
 788465023c62ffff
-4bfffe5538637d08
+4bfffe5538637c78
 608400303c80c000
 7c0004ac78840020
 3c62ffff7c8026ea
-38637d287884b282
+38637c987884b282
 3d20c0004bfffe31
 7929002061290020
 7d204eea7c0004ac
 3c62ffff3c80000f
-38637d4860844240
+38637cb860844240
 4bfffe057c892392
 4bfffdfd7fe3fb78
 3ca2ffff418e0028
 3c62ffff3c82ffff
-38847d7838a57d68
-4bfffddd38637d80
-6000000048000e2d
+38847ce838a57cd8
+4bfffddd38637cf0
+6000000048000e99
 3c62ffff41920020
-4bfffdc538637db0
+4bfffdc538637d20
 8181000838210070
-48001b147d818120
-38637dc83c62ffff
+48001b807d818120
+38637d383c62ffff
 3c80f0004bfffda9
 6084400038a0ffff
 7884002054a50422
-480011e93c604000
+480012553c604000
 3c62ffff60000000
-4bfffd7d38637de8
+4bfffd7d38637d58
 e801001038210070
 ebe1fff881810008
 7d8181207c0803a6
@@ -653,10 +653,10 @@ ebe1fff881810008
 9864000099240001
 000000004e800020
 0000000000000000
-38429c883c4c0001
-480018597c0802a6
+38429d883c4c0001
+480018c57c0802a6
 7c7e1b78f821ff21
-38637eb83c62ffff
+38637ec03c62ffff
 600000004bfffb71
 390100603ca08020
 3940000460a50003
@@ -708,7 +708,7 @@ ebe1fff881810008
 793500203ee2ffff
 7d2907b47ed607b4
 3b0100703be00000
-7f3db2143af77ee0
+7f3db2143af77ee8
 7f5d4a147ebdaa14
 3860000f4bfffd75
 4bfffca93b800000
@@ -749,7 +749,7 @@ ebe1fff881810008
 4bffffcc3b400000
 7fbfe2142f9f0020
 409e006c7fbd0e70
-38637ec83c62ffff
+38637ed03c62ffff
 600000004bfff889
 3be000007fc3f378
 7f9fe8004bfffb8d
@@ -761,698 +761,712 @@ ebe1fff881810008
 7d20572a7c0004ac
 4bfffaed3860000b
 4bfffb213860000f
-48001550382100e0
+480015bc382100e0
 3c62ffff7cbfe050
 7ca501947ca50e70
-38637ed07fa4eb78
+38637ed87fa4eb78
 4bfff80d7ca507b4
 4bffff8460000000
 3bff00017fc3f378
 7fff07b44bfffb59
 000000004bffff7c
 00000b8001000000
-384298d83c4c0001
+384299d83c4c0001
 3d40c0107c0802a6
 3920000e614a0800
 f8010010794a0020
 7c0004acf821ffa1
 3c62ffff7d20572a
-4bfff7ad38637f90
+4bfff7ad38637f98
 3821006060000000
 7c0803a6e8010010
 000000004e800020
 0000008001000000
-384298803c4c0001
+384299803c4c0001
 3d40c0107c0802a6
 39200001614a0800
 f8010010794a0020
 7c0004acf821ffa1
 3c62ffff7d20572a
-4bfff75538637f00
+4bfff75538637f08
 3821006060000000
 7c0803a6e8010010
 000000004e800020
 0000008001000000
-384298283c4c0001
-390000807c0802a6
-3d40aaaa7d0903a6
+384299283c4c0001
+3c62ffff7c0802a6
+4800147538637d70
+4bfff715f821ff71
+3900008060000000
+7d0903a63d40aaaa
 614aaaaa3d204000
-f821ff8148001405
 3929000491490000
-4bfff7714200fff8
-3940008060000000
-7d4903a63d00aaaa
-3be000003d204000
-814900006108aaaa
-419e000c7f8a4000
-7fff07b43bff0001
-4200ffe839290004
-3d40555539000080
-3d2040007d0903a6
-91490000614a5555
-4200fff839290004
-600000004bfff715
-3d00555539400080
-3d2040007d4903a6
-8149000061085555
-419e000c7f8a4000
-7fff07b43bff0001
-4200ffe839290004
-419e001c2fbf0000
-38a001003c62ffff
-38637e007fe4fb78
-600000004bfff651
-3ce080203d000008
-60e700037d0903a6
-392000013d404000
-7928f84278e70020
-7d2900d0792907e0
-7d293838394a0004
-912afffc7d294278
-4bfff6814200ffe4
-3d00000860000000
-7d0903a63ce08020
-3d40400060e70003
-392000013ba00000
-7928f84278e70020
-7d2900d0792907e0
-7d2942787d293838
-7f884840810a0000
-3bbd0001419e000c
-394a00047fbd07b4
-2fbd00004200ffd4
+3f60aaaa4200fff8
+600000004bfff75d
+3f82ffff3fa0aaaa
+3bc00000637baaaa
+63bdaaaa3be00000
+7b7b00203b9c7d80
+7fc407b43d3e1000
+80a9000079291764
+419e001c7f85e800
+7f66db783bff0001
+7fff07b47f83e378
+600000004bfff699
+2bbe00803bde0001
+39000080409effc8
+7d0903a63d405555
+614a55553d204000
+3929000491490000
+4bfff6d94200fff8
+3fa0555560000000
+3f6055553f82ffff
+63bd55553bc00000
+637b55553b9c7da0
+7fc407b43d3e1000
+80a9000079291764
+419e001c7f85e800
+7f66db783bff0001
+7fff07b47f83e378
+600000004bfff619
+2bbe00803bde0001
+2fbf0000409effc8
 3c62ffff419e001c
-7fa4eb783ca00008
-4bfff59d38637e28
-3920200060000000
-7d2903a639400000
-794800203d2a1000
-394a000139290002
-9109000079291764
-4bfff5e14200ffe8
-3920200060000000
-7d2903a639400000
-3d2a10003bc00000
+7fe4fb7838a00100
+4bfff5ed38637dc0
+3c62ffff60000000
+38637de83fc2ffff
+4bfff5d53bde7e00
+3d40000860000000
+7d4903a63d204000
+3948000139000001
+7948002039290004
+4200fff09149fffc
+600000004bfff61d
+392000003d400008
+38c000017d4903a6
+394600013d091000
+7d2407b479081764
+80a8000079460020
+419e001c7f8a2840
+4bfff56d7fc3f378
+3860271060000000
+4bffff904bfff84d
+4200ffc439290001
+38637e203c62ffff
+600000004bfff549
+3940000039202000
+3d2a10007d2903a6
+3929000279480020
+79291764394a0001
+4200ffe891090000
+600000004bfff58d
+3ba000003f82ffff
+3b9c7e383bc00000
+7fa607b43d3d1000
 8129000879291764
-7f8950005529043e
-3bde0001419e000c
-394a00017fde07b4
-2fbe00004200ffdc
+7f8930005529043e
+419e001c7d2507b4
+7cc433783bde0001
+7fde07b47f83e378
+600000004bfff4d1
+2bbd20003bbd0001
+2fbe0000409effc0
 3c62ffff419e001c
 7fc4f37838a02000
-4bfff51538637e50
-7fffea1460000000
-7ffff21438600000
-409e00a82f9f0000
-38637e783c62ffff
-600000004bfff4f1
-3d4000087c9602a6
-7d4903a678840020
-3d49100039200000
-794a176479280020
-910a000039290001
-7ff602a64200ffec
-3fe064007c9f2050
-4bfff5217fff2396
-7bff002060000000
-3d0000087d3602a6
-7d0903a679290020
-810a00003d404000
-4200fff8394a0004
-7d2548507cb602a6
-7ca54b963ca06400
-7fe4fb783c62ffff
-78a5006038637e88
-600000004bfff461
-3821008038600001
-0000000048001194
-0000038001000000
-384295383c4c0001
-480010ed7c0802a6
-3fe0c010f821fec1
-63ff00283bc00001
-4bfffc457bff0020
-4bfff72938600000
-7fc0ff2a7c0004ac
-639c00403f80c010
-7c0004ac7b9c0020
-3ba000007fc0e72a
+4bfff4a538637e58
+7ffff21460000000
+2f9f000038600000
+3c62ffff409e00a8
+4bfff48538637e80
+7c9602a660000000
+788400203d400008
+392000007d4903a6
+792800203d491000
+39290001794a1764
+4200ffec910a0000
+7c9f20507ff602a6
+7fff23963fe06400
+600000004bfff4b5
+7d3602a67bff0020
+792900203d000008
+3d4040007d0903a6
+394a0004810a0000
+7cb602a64200fff8
+3ca064007d254850
+3c62ffff7ca54b96
+38637e907fe4fb78
+4bfff3f578a50060
+3860000160000000
+4800118c38210090
+0100000000000000
+3c4c000100000580
+7c0802a6384295cc
+f821fec1480010ed
+3bc000013fe0c010
+7bff002063ff0028
+386000004bfffbd9
+7c0004ac4bfff6bd
+3f80c0107fc0ff2a
+7b9c0020639c0040
+7fc0e72a7c0004ac
+7c0004ac3ba00000
+386000017fa0ff2a
+392000024bfff68d
+7d20ff2a7c0004ac
+7fc0e72a7c0004ac
 7fa0ff2a7c0004ac
-4bfff6f938600001
-7c0004ac39200002
-7c0004ac7d20ff2a
-7c0004ac7fc0e72a
-3c62ffff7fa0ff2a
-38637f403b810070
-4bfff3b53e02ffff
-3d22ffff60000000
-3de2fffffb810080
-3dc2ffff39297f50
-3ae100633e42ffff
-3ac10061f9210098
-3a107ee03be00000
-39ce7f6839ef7f60
-392100643a527f20
-3e80c0103b200001
-f92100883ea0c010
-7f39f83039210068
-62b5082062940818
-3bc000007b330020
-3b000000f9210090
-7a9400203ba00000
-480000547ab50020
-2f9d000f7fbeeb78
-3d20c010419e029c
-7929002061290028
-7e604f2a7c0004ac
-394000013d00c010
-7908002061080048
-7d40472a7c0004ac
-7c0004ac39400000
-3bbd00017d404f2a
-7fbd07b47f78db78
-3900000439410060
-7d5a53783920002a
-38c0000038e00004
-3ca080207ce903a6
-60a500037927f842
-7d2900d0792907e0
-7d29283878a50020
-78e900207d273a78
-38c600017cea31ae
-3908ffff4200ffd4
-79080021394a0004
-3b6000004082ffb8
-7f60a72a7c0004ac
-7f60af2a7c0004ac
-4bfff51d38600009
-4bfff5513860000f
-7f44d3783c60c010
-7863002060630828
-e88100884bfff63d
-606308583c60c010
-4bfff62978630020
-3c60c010e8810090
-7863002060630888
-3c60c0104bfff615
-606308b83881006c
-4bfff60178630020
-612908a83d20c010
+3b8100703c62ffff
+3e02ffff38637f48
+600000004bfff349
+fb8100803d22ffff
+39297f583de2ffff
+3e42ffff3dc2ffff
+f92100983ae10063
+3be000003ac10061
+39ef7f683a107ee8
+3a527f2839ce7f70
+3b20000139210064
+3ea0c0103e80c010
+39210068f9210088
+629408187f39f830
+7b33002062b50820
+f92100903bc00000
+3ba000003b000000
+7ab500207a940020
+7fbeeb7848000054
+419e029c2f9d000f
+612900283d20c010
 7c0004ac79290020
-3d20c0107f604f2a
-79290020612908b0
+3d00c0107e604f2a
+6108004839400001
+7c0004ac79080020
+394000007d40472a
+7d404f2a7c0004ac
+7f78db783bbd0001
+394100607fbd07b4
+3920002a39000004
+38e000047d5a5378
+7ce903a638c00000
+7927f8423ca08020
+792907e060a50003
+78a500207d2900d0
+7d273a787d292838
+7cea31ae78e90020
+4200ffd438c60001
+394a00043908ffff
+4082ffb879080021
+7c0004ac3b600000
+7c0004ac7f60a72a
+386000097f60af2a
+3860000f4bfff4b1
+3c60c0104bfff4e5
+606308287f44d378
+4bfff5d178630020
+3c60c010e8810088
+7863002060630858
+e88100904bfff5bd
+606308883c60c010
+4bfff5a978630020
+3881006c3c60c010
+78630020606308b8
+3d20c0104bfff595
+79290020612908a8
 7f604f2a7c0004ac
-392000173d40c010
-794a0020614a0898
-7d20572a7c0004ac
-392000013d40c010
-794a0020614a08a0
-7d20572a7c0004ac
-612908783d20c010
+612908b03d20c010
 7c0004ac79290020
-3d20c0107f604f2a
-7929002061290880
+3d40c0107f604f2a
+614a089839200017
+7c0004ac794a0020
+3d40c0107d20572a
+614a08a039200001
+7c0004ac794a0020
+3d20c0107d20572a
+7929002061290878
 7f604f2a7c0004ac
-7fa5eb78e8610098
-3b4000207fe4fb78
-4bfff17d3b600000
-7fe3fb7860000000
-4bfff5194bfff485
-3a2000013860000f
-394000004bfff44d
-e881008079480fa4
-7c70402af94100a0
-e94100a04bfff581
-7d1650ae88fc0001
-409e00a07f883800
-88fc00037d1750ae
-409e00907f883800
-2baa0010394a0004
-7e248b78409effc0
-4bfff10d7de37b78
-3b5affff60000000
-4bfff45d7fe3fb78
-7f7b8a147b5a0021
-4082ff807f7b07b4
-4bfff0e57dc37378
-3920000060000000
-7d20a72a7c0004ac
-7d20af2a7c0004ac
-4bfff3753860000b
-4bfff3a93860000f
-4bfff52d7fe3fb78
-4bfff0ad7e439378
-7f98d80060000000
-7f1bc378419cfd70
-3a2000004bfffd6c
-3c62ffff4bffff70
-7fe4fb787fc5f378
-4bfff07d38637f70
-3d20c01060000000
-7929002061290028
-7f204f2a7c0004ac
-394000013d00c010
-7908002061080040
-7d40472a7c0004ac
-7c0004ac39400000
-7bde00207d404f2a
-38de00013d00c010
-7cc903a661080048
-7908002039400001
-4200003438e00000
-3af7ffff7fe3fb78
-7e4393784bfff489
-4bfff0053b9cffff
-2f9f000160000000
-419e00283ad6ffff
-4bfffc783be00001
-7e604f2a7c0004ac
-7d40472a7c0004ac
-7ce04f2a7c0004ac
-382101404bffffb4
-48000ccc38600001
-0100000000000000
-3c4c000100001280
-7c0802a6384290ac
-38637f283c62ffff
-f821ff7148000c89
-3be000003f60c010
-7b7b0020637b1000
-600000004bffef89
-7fe0df2a7c0004ac
-635a10083f40c010
-7c0004ac7b5a0020
-3fa0c0107fe0d72a
-7bbd002063bd0818
-7fe0ef2a7c0004ac
-63de08203fc0c010
-7c0004ac7bde0020
-3f80c0107fe0f72a
-639c08003920000c
-7c0004ac7b9c0020
-386000007d20e72a
-4bfff2096063c350
-7fe0ef2a7c0004ac
+612908803d20c010
+7c0004ac79290020
+e86100987f604f2a
+7fe4fb787fa5eb78
+3b6000003b400020
+600000004bfff111
+4bfff4197fe3fb78
+3860000f4bfff4ad
+4bfff3e13a200001
+79480fa439400000
+f94100a0e8810080
+4bfff5157c70402a
+88fc0001e94100a0
+7f8838007d1650ae
+7d1750ae409e00a0
+7f88380088fc0003
+394a0004409e0090
+409effc02baa0010
+7de37b787e248b78
+600000004bfff0a1
+7fe3fb783b5affff
+7b5a00214bfff3f1
+7f7b07b47f7b8a14
+7dc373784082ff80
+600000004bfff079
+7c0004ac39200000
+7c0004ac7d20a72a
+3860000b7d20af2a
+3860000f4bfff309
+7fe3fb784bfff33d
+7e4393784bfff4c1
+600000004bfff041
+419cfd707f98d800
+4bfffd6c7f1bc378
+4bffff703a200000
+7fc5f3783c62ffff
+38637f787fe4fb78
+600000004bfff011
+612900283d20c010
+7c0004ac79290020
+3d00c0107f204f2a
+6108004039400001
+7c0004ac79080020
+394000007d40472a
+7d404f2a7c0004ac
+3d00c0107bde0020
+6108004838de0001
+394000017cc903a6
+38e0000079080020
+7fe3fb7842000034
+4bfff41d3af7ffff
+3b9cffff7e439378
+600000004bffef99
+3ad6ffff2f9f0001
+3be00001419e0028
+7c0004ac4bfffc78
+7c0004ac7e604f2a
+7c0004ac7d40472a
+4bffffb47ce04f2a
+3860000138210140
+0000000048000ccc
+0000128001000000
+384291403c4c0001
+3c62ffff7c0802a6
+48000c8938637f30
+3f60c010f821ff71
+637b10003be00000
+4bffef1d7b7b0020
+7c0004ac60000000
+3f40c0107fe0df2a
+7b5a0020635a1008
+7fe0d72a7c0004ac
+63bd08183fa0c010
+7c0004ac7bbd0020
+3fc0c0107fe0ef2a
+7bde002063de0820
 7fe0f72a7c0004ac
-7c0004ac3920000e
-386027107d20e72a
-392002004bfff1e5
-7d20ef2a7c0004ac
-7c0004ac39200002
-3860000f7d20f72a
-7c0004ac4bfff189
-392000037fe0ef2a
+3920000c3f80c010
+7b9c0020639c0800
+7d20e72a7c0004ac
+6063c35038600000
+7c0004ac4bfff19d
+7c0004ac7fe0ef2a
+3920000e7fe0f72a
+7d20e72a7c0004ac
+4bfff17938602710
+7c0004ac39200200
+392000027d20ef2a
 7d20f72a7c0004ac
-4bfff16d3860000f
-7c0004ac39200006
-3b8000017d20ef2a
-7f80f72a7c0004ac
-4bfff14d3860000f
-7c0004ac39200920
-7c0004ac7d20ef2a
-3860000f7fe0f72a
-386000c84bfff131
-392004004bfff165
+4bfff11d3860000f
+7fe0ef2a7c0004ac
+7c0004ac39200003
+3860000f7d20f72a
+392000064bfff101
+7d20ef2a7c0004ac
+7c0004ac3b800001
+3860000f7f80f72a
+392009204bfff0e1
 7d20ef2a7c0004ac
 7fe0f72a7c0004ac
-4bfff10d38600003
-4bfff141386000c8
-4bfff6cd4bfffa19
-2c2300004bfff721
-7c0004ac4082001c
-7c0004ac7f80df2a
-382100907f80d72a
-7c0004ac48000b60
-386000017f80df2a
-000000004bffffec
-0000068001000000
-38428f003c4c0001
-600000003d20c000
-7929002061292000
-3d20c000f9228008
-7929002061290020
+4bfff0c53860000f
+4bfff0f9386000c8
+7c0004ac39200400
+7c0004ac7d20ef2a
+386000037fe0f72a
+386000c84bfff0a1
+4bfffa194bfff0d5
+4bfff6b54bfff661
+4082001c2c230000
+7f80df2a7c0004ac
+7f80d72a7c0004ac
+48000b6038210090
+7f80df2a7c0004ac
+4bffffec38600001
+0100000000000000
+3c4c000100000680
+3d20c00038428f94
+6129200060000000
+f922801079290020
+612900203d20c000
+7c0004ac79290020
+3d40001c7d204eea
+7d295392614a2000
+394a0018e9428010
+7c0004ac3929ffff
+4e8000207d2057ea
+0000000000000000
+3c4c000100000000
+6000000038428f34
+39290010e9228010
 7d204eea7c0004ac
-614a20003d40001c
-e94280087d295392
-3929ffff394a0018
+4082ffe871290008
+e94280105469063e
 7d2057ea7c0004ac
 000000004e800020
 0000000000000000
-38428ea03c4c0001
-e922800860000000
-7c0004ac39290010
-712900087d204eea
-5469063e4082ffe8
-7c0004ace9428008
-4e8000207d2057ea
-0000000000000000
-3c4c000100000000
-7c0802a638428e5c
-fbe1fff8fbc1fff0
-f80100103bc3ffff
-8ffe0001f821ffd1
-409e00102fbf0000
-3860000038210030
-2b9f000a48000a8c
-3860000d409e000c
-7fe3fb784bffff81
-4bffffd04bffff79
-0100000000000000
-2c24000000000280
-3881fff040820008
-f86400002b850024
-4d9d002038600000
-78c683e43cc00001
-e924000060c62600
-2b8a002089490000
-7cc75436419d002c
-4082001470e80001
-409e00542fa50000
-4800005c38a0000a
-f924000039290001
-2fa500004bffffcc
-2b8a0030409e0038
-409e003c38a0000a
-2f8a007889490001
-89490001409e0030
-2f8a007838a00010
-39290002409e0020
-48000014f9240000
-409e000c2f850010
-419effd82b8a0030
-4800003038600000
-54ca063e38c9ffd0
-419d00342b8a0009
-7f8928007cc90734
-38e700014c9c0020
-f8e400007c6519d2
-e8e400007c691a14
-2fa9000089270000
-4e800020409effc8
-554a063e3949ff9f
-419d00102b8a0019
-7d2907343929ffa9
-3949ffbf4bffffbc
+38428ef03c4c0001
+fbc1fff07c0802a6
+3bc3fffffbe1fff8
+f821ffd1f8010010
+2fbf00008ffe0001
+38210030409e0010
+48000a8c38600000
+409e000c2b9f000a
+4bffff813860000d
+4bffff797fe3fb78
+000000004bffffd0
+0000028001000000
+408200082c240000
+2b8500243881fff0
+38600000f8640000
+3cc000014d9d0020
+60c6260078c683e4
+89490000e9240000
+419d002c2b8a0020
+70e800017cc75436
+2fa5000040820014
+38a0000a409e0054
+392900014800005c
+4bffffccf9240000
+409e00382fa50000
+38a0000a2b8a0030
+89490001409e003c
+409e00302f8a0078
+38a0001089490001
+409e00202f8a0078
+f924000039290002
+2f85001048000014
+2b8a0030409e000c
+38600000419effd8
+38c9ffd048000030
+2b8a000954ca063e
+7cc90734419d0034
+4c9c00207f892800
+7c6519d238e70001
+7c691a14f8e40000
+89270000e8e40000
+409effc82fa90000
+3949ff9f4e800020
 2b8a0019554a063e
-3929ffc94d9d0020
-000000004bffffe4
-0000000000000000
-7d4348ae39200000
-409e000c2f8a0000
-4e8000207d234b78
-4bffffe839290001
-0000000000000000
-78aae8c200000000
-392a000139000000
-420000307d2903a6
-792a1f2478a9e8c2
-7d0352141d29fff8
-7ca92a147c845214
-3945000139200000
-420000187d4903a6
-7d24402a4e800020
-390800087d23412a
-7d4448ae4bffffc4
-392900017d4849ae
-000000004bffffdc
-0000000000000000
-2b8900193923ff9f
-3863ffe04d9d0020
-4e8000207c6307b4
+3929ffa9419d0010
+4bffffbc7d290734
+554a063e3949ffbf
+4d9d00202b8a0019
+4bffffe43929ffc9
+0000000000000000
+3920000000000000
+2f8a00007d4348ae
+7d234b78409e000c
+392900014e800020
+000000004bffffe8
+0000000000000000
+3900000078aae8c2
+7d2903a6392a0001
+78a9e8c242000030
+1d29fff8792a1f24
+7c8452147d035214
+392000007ca92a14
+7d4903a639450001
+4e80002042000018
+7d23412a7d24402a
+4bffffc439080008
+7d4849ae7d4448ae
+4bffffdc39290001
+0000000000000000
+3923ff9f00000000
+4d9d00202b890019
+7c6307b43863ffe0
+000000004e800020
 0000000000000000
-3c4c000100000000
-7c0802a638428c0c
-7d9080263d203736
-792907c661293534
-9181000865293332
-480007d961293130
-7c7d1b78f821ffa1
-3be000007cde3378
-3d206665f9210020
-792907c661296463
-6129393865296261
-7ca92b78f9210028
-409e00802fa90000
-409e00082fbf0000
-7fbf20403be00001
-419d005838600000
-3b9fffff2e270000
-7d3bf1d27f65f392
-7ca12a147ca92850
-4192001088650020
-600000004bffff41
-2fbb00005463063e
-7f65db78e93d0000
-3b9cffff7c69e1ae
-e93d0000409effc8
-7fe9fa1438600001
-38210060fbfd0000
-7d90812081810008
-2b9e001048000774
-7929e102409e0014
-7fff07b43bff0001
-7d29f3924bffff68
-000000004bfffff0
-0000058003000000
-38428b003c4c0001
-480006e97c0802a6
-eb630000f821ffb1
-7c9c23787c7f1b78
-3bc000007cbd2b78
-4bfffe0d7fa3eb78
-7fa3f04060000000
-e95f0000409d0014
-7fa9e0407d3b5050
-38210050419c0010
-480006f038600001
-3bde00017d3df0ae
-e93f0000992a0000
-f93f000039290001
-000000004bffffb8
-0000058001000000
-38428a803c4c0001
-480006617c0802a6
-7c7d1b78f821ffa1
-7ca32b787c9b2378
-38a0000a38800000
-eb5d00007cde3378
-7d1943787cfc3b78
-4bfffc497d3f4b78
-3940000060000000
-2fbe00007c6307b4
-2faa0000409e006c
-39400001409e0008
-7f8348007d3f5214
-409d00447d2a07b4
-2f8300007c6a1850
-3929000178690020
-3d408000419c0010
-409e00087f835000
-2c29000139200001
-418200143929ffff
-7d5a3850e8fd0000
-419c00307faad840
-3860000038210060
-2b9c001048000604
-7bdee102409e0014
-7d4a07b4394a0001
-7fdee3924bffff7c
-9b2700004bfffff0
-394a0001e95d0000
-4bffffa8f95d0000
+38428ca03c4c0001
+3d2037367c0802a6
+612935347d908026
+65293332792907c6
+6129313091810008
+f821ffa1480007d9
+7cde33787c7d1b78
+f92100203be00000
+612964633d206665
+65296261792907c6
+f921002861293938
+2fa900007ca92b78
+2fbf0000409e0080
+3be00001409e0008
+386000007fbf2040
+2e270000419d0058
+7f65f3923b9fffff
+7ca928507d3bf1d2
+886500207ca12a14
+4bffff4141920010
+5463063e60000000
+e93d00002fbb0000
+7c69e1ae7f65db78
+409effc83b9cffff
+38600001e93d0000
+fbfd00007fe9fa14
+8181000838210060
+480007747d908120
+409e00142b9e0010
+3bff00017929e102
+4bffff687fff07b4
+4bfffff07d29f392
+0300000000000000
+3c4c000100000580
+7c0802a638428b94
+f821ffb1480006e9
+7c7f1b78eb630000
+7cbd2b787c9c2378
+7fa3eb783bc00000
+600000004bfffe0d
+409d00147fa3f040
+7d3b5050e95f0000
+419c00107fa9e040
+3860000138210050
+7d3df0ae480006f0
+992a00003bde0001
+39290001e93f0000
+4bffffb8f93f0000
 0100000000000000
-3c4c000100000780
-7c0802a638428984
-f821fed148000539
-f86100607c741b79
-4182006838600000
-419e00602fa40000
-3e42ffff39210040
-3b4100203ac4ffff
-60000000f9210070
-392280003ae00000
-3ba100603a527fb8
-89250000f9210078
-2fa90000ebc10060
-7ff4f050419e0010
-419c00207fbfb040
-993e000039200000
-7e941850e8610060
-382101307e8307b4
-2b89002548000508
-409e048839450001
-8925000038e00000
-f8a10068e9010070
-7d2741ae7cea07b4
-8d25000139070001
-2b8900647d0807b4
-2b890069419e0058
-2b890075419e0050
-2b890078419e0048
-2b890058419e0040
-2b890070419e0038
-2b890063419e0030
-2b890073419e0028
-2b890025419e0020
-2b89004f419e0018
-2b89006f419e0010
-409eff8838e70001
-2b890025394a0002
-7d1a42147d4a07b4
-992800207d5a5214
-409e00209aea0020
-f9210060393e0001
-993e000039200025
-38a90002e9210068
-892100414bffff04
-3a2600087fffb050
-3a600030eb660000
-3929ffd23b010042
-4082039c712900fd
-3b2000043aa00000
-3a0000013b800000
-7ddb00d039e0002d
-2b89006c48000108
-88f8000138d80001
-419d0118419e033c
-419e02402b890063
-2b89004f419d0038
-2b890058419e01e8
-3949ffd0419e0188
-2b8a0009554a063e
-395c0001419d00c4
-993c00207f81e214
-480000b0795c0020
-419e03042b890068
-419e000c2b890069
-409effc82b890064
-7d41e2142b890075
-7f6adb789aea0020
-57291838419e0034
-7e0948363929ffff
-418200207f694839
-e921006099e80000
-f921006039290001
-7d52482a7b291f24
-e88100607dca5038
-38e0000a7d465378
-7f45d378f9410080
-7e689b7839200000
-7c9e20507fa3eb78
-4bfffc9d7c84f850
-e9410080e8810060
-38c0000a7ea7ab78
-7d4553787c9e2050
-7fa3eb787c84f850
-3b1800014bfffaed
-e901006089380000
+3c4c000100000580
+7c0802a638428b14
+f821ffa148000661
+7c9b23787c7d1b78
+388000007ca32b78
+7cde337838a0000a
+7cfc3b78eb5d0000
+7d3f4b787d194378
+600000004bfffc49
+7c6307b439400000
+409e006c2fbe0000
+409e00082faa0000
+7d3f521439400001
+7d2a07b47f834800
+7c6a1850409d0044
+786900202f830000
+419c001039290001
+7f8350003d408000
+39200001409e0008
+3929ffff2c290001
+e8fd000041820014
+7faad8407d5a3850
+38210060419c0030
+4800060438600000
+409e00142b9c0010
+394a00017bdee102
+4bffff7c7d4a07b4
+4bfffff07fdee392
+e95d00009b270000
+f95d0000394a0001
+000000004bffffa8
+0000078001000000
+38428a183c4c0001
+480005397c0802a6
+7c741b79f821fed1
+38600000f8610060
+2fa4000041820068
+39210040419e0060
+3ac4ffff3e42ffff
+f92100703b410020
+3ae0000060000000
+3a527fc039228008
+f92100783ba10060
+ebc1006089250000
 419e00102fa90000
-7fbf50407d5e4050
-7e268b78419dfee4
-2b8900734bfffe90
-419d006c419e016c
-419e00d42b89006f
-409efef02b890070
-38e000107d21e214
-7c8af8507f66db78
-390000209ae90020
-7f45d37839200002
-4bfffc0d7fa3eb78
-e8a10078e8810060
-7c9e20507fa3eb78
-4bfffb757c84f850
-7ea7ab78e8810060
-7f65db7838c00010
-4bffff5c7c9e2050
-419e00182b890078
-419e01cc2b89007a
-4bfffeb82b890075
-7d21e2143aa00001
-7c8af85038e00010
-9ae900207e689b78
-7f45d3787b291f24
-7d72482a7fa3eb78
-7f6b583839200000
-f96100807d665b78
-e88100604bfffb89
+7fbfb0407ff4f050
+39200000419c0020
+e8610060993e0000
+7e8307b47e941850
+4800050838210130
+394500012b890025
+38e00000409e0488
+e901007089250000
+7cea07b4f8a10068
+390700017d2741ae
+7d0807b48d250001
+419e00582b890064
+419e00502b890069
+419e00482b890075
+419e00402b890078
+419e00382b890058
+419e00302b890070
+419e00282b890063
+419e00202b890073
+419e00182b890025
+419e00102b89004f
+38e700012b89006f
+394a0002409eff88
+7d4a07b42b890025
+7d5a52147d1a4214
+9aea002099280020
+393e0001409e0020
+39200025f9210060
+e9210068993e0000
+4bffff0438a90002
+7fffb05089210041
+eb6600003a260008
+3b0100423a600030
+712900fd3929ffd2
+3aa000004082039c
+3b8000003b200004
+39e0002d3a000001
+480001087ddb00d0
+38d800012b89006c
+419e033c88f80001
+2b890063419d0118
+419d0038419e0240
+419e01e82b89004f
+419e01882b890058
+554a063e3949ffd0
+419d00c42b8a0009
+7f81e214395c0001
+795c0020993c0020
+2b890068480000b0
+2b890069419e0304
+2b890064419e000c
+2b890075409effc8
+9aea00207d41e214
+419e00347f6adb78
+3929ffff57291838
+7f6948397e094836
+99e8000041820020
+39290001e9210060
+7b291f24f9210060
+7dca50387d52482a
+7d465378e8810060
+f941008038e0000a
+392000007f45d378
+7fa3eb787e689b78
+7c84f8507c9e2050
+e88100604bfffc9d
+7ea7ab78e9410080
+7c9e205038c0000a
+7c84f8507d455378
+4bfffaed7fa3eb78
+893800003b180001
+2fa90000e9010060
+7d5e4050419e0010
+419dfee47fbf5040
+4bfffe907e268b78
+419e016c2b890073
+2b89006f419d006c
+2b890070419e00d4
+7d21e214409efef0
+7f66db7838e00010
+9ae900207c8af850
+3920000239000020
+7fa3eb787f45d378
+e88100604bfffc0d
+7fa3eb78e8a10078
+7c84f8507c9e2050
+e88100604bfffb75
 38c000107ea7ab78
-e96100807c9e2050
-4bfffeec7d655b78
-38e000087d21e214
+7c9e20507f65db78
+2b8900784bffff5c
+2b89007a419e0018
+2b890075419e01cc
+3aa000014bfffeb8
+38e000107d21e214
 7e689b787c8af850
 7b291f249ae90020
 7fa3eb787f45d378
 392000007d72482a
 7d665b787f6b5838
-4bfffb35f9610080
+4bfffb89f9610080
 7ea7ab78e8810060
-7c9e205038c00008
-7d21e2144bffffac
-38e0000a39000020
-9ae9002038c00001
-392000007f45d378
-7fa3eb787c8af850
-e92100604bfffaf9
-e92100609b690000
-f921006039290001
-7d21e2144bfffe6c
-f901009038a0000a
-38800000f9410088
-9ae900207f43d378
-600000004bfff73d
-7f63db78f8610080
-600000004bfff861
-7fa91840e9210080
-7c634850409d0040
-e9010090e9410088
-392300012fa30000
-409e00087d4af850
-2c29000139200001
-3929ffffe8c10060
-7ce8305041820010
-419d00207faa3840
-7f65db78e8810060
-7c9e20507fa3eb78
-4bfff9cd7c84f850
-38e000204bfffdd4
-e8e1006098e60000
-f8e1006038e70001
-2b87006c4bffffb4
-409efdb03b200008
-4bfffda87cd83378
-3b2000022b870068
-7cd83378409efd9c
-4bfffd903b200001
-4bfffd883b200008
-3b0100413a600020
-993e00004bfffc60
-e92100607d455378
-f921006039290001
-000000004bfffb24
-0000128001000000
-f9e1ff78f9c1ff70
-fa21ff88fa01ff80
-fa61ff98fa41ff90
-faa1ffa8fa81ffa0
-fae1ffb8fac1ffb0
-fb21ffc8fb01ffc0
-fb61ffd8fb41ffd0
-fba1ffe8fb81ffe0
-fbe1fff8fbc1fff0
-4e800020f8010010
-e9e1ff78e9c1ff70
-ea21ff88ea01ff80
-ea61ff98ea41ff90
-eaa1ffa8ea81ffa0
-eae1ffb8eac1ffb0
-eb21ffc8eb01ffc0
-eb61ffd8eb41ffd0
-e8010010eb81ffe0
-7c0803a6eba1ffe8
-ebe1fff8ebc1fff0
-ebc1fff04e800020
-ebe1fff8e8010010
-4e8000207c0803a6
+7c9e205038c00010
+7d655b78e9610080
+7d21e2144bfffeec
+7c8af85038e00008
+9ae900207e689b78
+7f45d3787b291f24
+7d72482a7fa3eb78
+7f6b583839200000
+f96100807d665b78
+e88100604bfffb35
+38c000087ea7ab78
+4bffffac7c9e2050
+390000207d21e214
+38c0000138e0000a
+7f45d3789ae90020
+7c8af85039200000
+4bfffaf97fa3eb78
+9b690000e9210060
+39290001e9210060
+4bfffe6cf9210060
+38a0000a7d21e214
+f9410088f9010090
+7f43d37838800000
+4bfff73d9ae90020
+f861008060000000
+4bfff8617f63db78
+e921008060000000
+409d00407fa91840
+e94100887c634850
+2fa30000e9010090
+7d4af85039230001
+39200001409e0008
+e8c100602c290001
+418200103929ffff
+7faa38407ce83050
+e8810060419d0020
+7fa3eb787f65db78
+7c84f8507c9e2050
+4bfffdd44bfff9cd
+98e6000038e00020
+38e70001e8e10060
+4bffffb4f8e10060
+3b2000082b87006c
+7cd83378409efdb0
+2b8700684bfffda8
+409efd9c3b200002
+3b2000017cd83378
+3b2000084bfffd90
+3a6000204bfffd88
+4bfffc603b010041
+7d455378993e0000
+39290001e9210060
+4bfffb24f9210060
+0100000000000000
+f9c1ff7000001280
+fa01ff80f9e1ff78
+fa41ff90fa21ff88
+fa81ffa0fa61ff98
+fac1ffb0faa1ffa8
+fb01ffc0fae1ffb8
+fb41ffd0fb21ffc8
+fb81ffe0fb61ffd8
+fbc1fff0fba1ffe8
+f8010010fbe1fff8
+e9c1ff704e800020
+ea01ff80e9e1ff78
+ea41ff90ea21ff88
+ea81ffa0ea61ff98
+eac1ffb0eaa1ffa8
+eb01ffc0eae1ffb8
+eb41ffd0eb21ffc8
+eb81ffe0eb61ffd8
+eba1ffe8e8010010
+ebc1fff07c0803a6
+4e800020ebe1fff8
+e8010010ebc1fff0
+7c0803a6ebe1fff8
+000000004e800020
 6d6f636c65570a0a
 63694d206f742065
 2120747461776f72
@@ -1502,16 +1516,35 @@ ebe1fff8e8010010
 20676e69746f6f42
 415244206d6f7266
 0000000a2e2e2e4d
+20747365746d656d
+000a2e2e2e737562
+7830203a7375625b
+7830203a5d783025
+2073762078383025
+000a783830257830
+257830207375625b
+257830203a5d7830
+3020737620783830
+00000a7838302578
 20747365746d654d
 6c69616620737562
 252f6425203a6465
 73726f7272652064
 000000000000000a
-20747365746d654d
-6961662061746164
-2f6425203a64656c
-726f727265206425
-0000000000000a73
+20747365746d656d
+0a2e2e2e61746164
+0000000000000000
+783020617461645b
+7830203a5d783025
+2073762078383025
+000a783830257830
+20747365746d656d
+0a2e2e2e72646461
+0000000000000000
+783020726464615b
+7830203a5d783025
+2073762078383025
+000a783830257830
 20747365746d654d
 6961662072646461
 2f6425203a64656c
index 48af9e20f06fc3015cd20014c7e49fe9e9e8898a..ec4273698c1cbe587fccaf4f464022e3470bd41b 100644 (file)
@@ -1,5 +1,5 @@
 //--------------------------------------------------------------------------------
-// Auto-generated by Migen (0d16e03) & LiteX (564d731a) on 2020-05-26 20:37:38
+// Auto-generated by Migen (0d16e03) & LiteX (564d731a) on 2020-05-30 20:25:53
 //--------------------------------------------------------------------------------
 module litedram_core(
        input wire clk,
index bbad64d36ddad9694c76fb99a1946998feaf14df..e53fc044974d7e73ee3d8e9e9641bbe801ad1a0d 100644 (file)
@@ -510,7 +510,7 @@ a64b5a7d14004a39
 0000000000000000
 0000000000000000
 0000000000000000
-3842a1003c4c0001
+3842a2003c4c0001
 fbc1fff07c0802a6
 f8010010fbe1fff8
 3be10020f821fe91
@@ -519,11 +519,11 @@ f8c101a838800140
 38c101987c651b78
 7fe3fb78f8e101b0
 f92101c0f90101b8
-48001739f94101c8
+480017a5f94101c8
 7c7e1b7860000000
-480012517fe3fb78
+480012bd7fe3fb78
 3821017060000000
-48001cf87fc3f378
+48001d647fc3f378
 0100000000000000
 4e80002000000280
 0000000000000000
@@ -531,67 +531,67 @@ f92101c0f90101b8
 4e8000204c00012c
 0000000000000000
 3c4c000100000000
-7c0802a63842a05c
+7c0802a63842a15c
 7d800026fbe1fff8
 91810008f8010010
-48001145f821ff91
+480011b1f821ff91
 3c62ffff60000000
-4bffff3538637c78
+4bffff3538637be8
 548400023880ffff
 7c8026ea7c0004ac
 3fe0c0003c62ffff
-63ff000838637c98
+63ff000838637c08
 3c62ffff4bffff11
-38637cb87bff0020
+38637c287bff0020
 7c0004ac4bffff01
 73e900017fe0feea
 3c62ffff41820010
-4bfffee538637cd0
+4bfffee538637c40
 4d80000073e90002
 3c62ffff41820010
-4bfffecd38637cd8
+4bfffecd38637c48
 4e00000073e90004
 3c62ffff41820010
-4bfffeb538637ce0
-3bff7f203fe2ffff
+4bfffeb538637c50
+3bff7f283fe2ffff
 4bfffea57fe3fb78
 3c80c00041920028
 7884002060840010
 7c8026ea7c0004ac
 7884b2823c62ffff
-4bfffe7d38637ce8
+4bfffe7d38637c58
 3c80c000418e004c
 7884002060840018
 7c8026ea7c0004ac
 788465023c62ffff
-4bfffe5538637d08
+4bfffe5538637c78
 608400303c80c000
 7c0004ac78840020
 3c62ffff7c8026ea
-38637d287884b282
+38637c987884b282
 3d20c0004bfffe31
 7929002061290020
 7d204eea7c0004ac
 3c62ffff3c80000f
-38637d4860844240
+38637cb860844240
 4bfffe057c892392
 4bfffdfd7fe3fb78
 3ca2ffff418e0028
 3c62ffff3c82ffff
-38847d7838a57d68
-4bfffddd38637d80
-6000000048000e2d
+38847ce838a57cd8
+4bfffddd38637cf0
+6000000048000e99
 3c62ffff41920020
-4bfffdc538637db0
+4bfffdc538637d20
 8181000838210070
-48001b147d818120
-38637dc83c62ffff
+48001b807d818120
+38637d383c62ffff
 3c80f0004bfffda9
 6084400038a0ffff
 7884002054a50422
-480011e93c604000
+480012553c604000
 3c62ffff60000000
-4bfffd7d38637de8
+4bfffd7d38637d58
 e801001038210070
 ebe1fff881810008
 7d8181207c0803a6
@@ -653,10 +653,10 @@ ebe1fff881810008
 9864000099240001
 000000004e800020
 0000000000000000
-38429c883c4c0001
-480018597c0802a6
+38429d883c4c0001
+480018c57c0802a6
 7c7e1b78f821ff21
-38637eb83c62ffff
+38637ec03c62ffff
 600000004bfffb71
 390100603ca08020
 3940000460a50003
@@ -708,7 +708,7 @@ ebe1fff881810008
 793500203ee2ffff
 7d2907b47ed607b4
 3b0100703be00000
-7f3db2143af77ee0
+7f3db2143af77ee8
 7f5d4a147ebdaa14
 3860000f4bfffd75
 4bfffca93b800000
@@ -749,7 +749,7 @@ ebe1fff881810008
 4bffffcc3b400000
 7fbfe2142f9f0020
 409e006c7fbd0e70
-38637ec83c62ffff
+38637ed03c62ffff
 600000004bfff889
 3be000007fc3f378
 7f9fe8004bfffb8d
@@ -761,698 +761,712 @@ ebe1fff881810008
 7d20572a7c0004ac
 4bfffaed3860000b
 4bfffb213860000f
-48001550382100e0
+480015bc382100e0
 3c62ffff7cbfe050
 7ca501947ca50e70
-38637ed07fa4eb78
+38637ed87fa4eb78
 4bfff80d7ca507b4
 4bffff8460000000
 3bff00017fc3f378
 7fff07b44bfffb59
 000000004bffff7c
 00000b8001000000
-384298d83c4c0001
+384299d83c4c0001
 3d40c0107c0802a6
 3920000e614a0800
 f8010010794a0020
 7c0004acf821ffa1
 3c62ffff7d20572a
-4bfff7ad38637f90
+4bfff7ad38637f98
 3821006060000000
 7c0803a6e8010010
 000000004e800020
 0000008001000000
-384298803c4c0001
+384299803c4c0001
 3d40c0107c0802a6
 39200001614a0800
 f8010010794a0020
 7c0004acf821ffa1
 3c62ffff7d20572a
-4bfff75538637f00
+4bfff75538637f08
 3821006060000000
 7c0803a6e8010010
 000000004e800020
 0000008001000000
-384298283c4c0001
-390000807c0802a6
-3d40aaaa7d0903a6
+384299283c4c0001
+3c62ffff7c0802a6
+4800147538637d70
+4bfff715f821ff71
+3900008060000000
+7d0903a63d40aaaa
 614aaaaa3d204000
-f821ff8148001405
 3929000491490000
-4bfff7714200fff8
-3940008060000000
-7d4903a63d00aaaa
-3be000003d204000
-814900006108aaaa
-419e000c7f8a4000
-7fff07b43bff0001
-4200ffe839290004
-3d40555539000080
-3d2040007d0903a6
-91490000614a5555
-4200fff839290004
-600000004bfff715
-3d00555539400080
-3d2040007d4903a6
-8149000061085555
-419e000c7f8a4000
-7fff07b43bff0001
-4200ffe839290004
-419e001c2fbf0000
-38a001003c62ffff
-38637e007fe4fb78
-600000004bfff651
-3ce080203d000008
-60e700037d0903a6
-392000013d404000
-7928f84278e70020
-7d2900d0792907e0
-7d293838394a0004
-912afffc7d294278
-4bfff6814200ffe4
-3d00000860000000
-7d0903a63ce08020
-3d40400060e70003
-392000013ba00000
-7928f84278e70020
-7d2900d0792907e0
-7d2942787d293838
-7f884840810a0000
-3bbd0001419e000c
-394a00047fbd07b4
-2fbd00004200ffd4
+3f60aaaa4200fff8
+600000004bfff75d
+3f82ffff3fa0aaaa
+3bc00000637baaaa
+63bdaaaa3be00000
+7b7b00203b9c7d80
+7fc407b43d3e1000
+80a9000079291764
+419e001c7f85e800
+7f66db783bff0001
+7fff07b47f83e378
+600000004bfff699
+2bbe00803bde0001
+39000080409effc8
+7d0903a63d405555
+614a55553d204000
+3929000491490000
+4bfff6d94200fff8
+3fa0555560000000
+3f6055553f82ffff
+63bd55553bc00000
+637b55553b9c7da0
+7fc407b43d3e1000
+80a9000079291764
+419e001c7f85e800
+7f66db783bff0001
+7fff07b47f83e378
+600000004bfff619
+2bbe00803bde0001
+2fbf0000409effc8
 3c62ffff419e001c
-7fa4eb783ca00008
-4bfff59d38637e28
-3920200060000000
-7d2903a639400000
-794800203d2a1000
-394a000139290002
-9109000079291764
-4bfff5e14200ffe8
-3920200060000000
-7d2903a639400000
-3d2a10003bc00000
+7fe4fb7838a00100
+4bfff5ed38637dc0
+3c62ffff60000000
+38637de83fc2ffff
+4bfff5d53bde7e00
+3d40000860000000
+7d4903a63d204000
+3948000139000001
+7948002039290004
+4200fff09149fffc
+600000004bfff61d
+392000003d400008
+38c000017d4903a6
+394600013d091000
+7d2407b479081764
+80a8000079460020
+419e001c7f8a2840
+4bfff56d7fc3f378
+3860271060000000
+4bffff904bfff84d
+4200ffc439290001
+38637e203c62ffff
+600000004bfff549
+3940000039202000
+3d2a10007d2903a6
+3929000279480020
+79291764394a0001
+4200ffe891090000
+600000004bfff58d
+3ba000003f82ffff
+3b9c7e383bc00000
+7fa607b43d3d1000
 8129000879291764
-7f8950005529043e
-3bde0001419e000c
-394a00017fde07b4
-2fbe00004200ffdc
+7f8930005529043e
+419e001c7d2507b4
+7cc433783bde0001
+7fde07b47f83e378
+600000004bfff4d1
+2bbd20003bbd0001
+2fbe0000409effc0
 3c62ffff419e001c
 7fc4f37838a02000
-4bfff51538637e50
-7fffea1460000000
-7ffff21438600000
-409e00a82f9f0000
-38637e783c62ffff
-600000004bfff4f1
-3d4000087c9602a6
-7d4903a678840020
-3d49100039200000
-794a176479280020
-910a000039290001
-7ff602a64200ffec
-3fe064007c9f2050
-4bfff5217fff2396
-7bff002060000000
-3d0000087d3602a6
-7d0903a679290020
-810a00003d404000
-4200fff8394a0004
-7d2548507cb602a6
-7ca54b963ca06400
-7fe4fb783c62ffff
-78a5006038637e88
-600000004bfff461
-3821008038600001
-0000000048001194
-0000038001000000
-384295383c4c0001
-480010ed7c0802a6
-3fe0c010f821fec1
-63ff00283bc00001
-4bfffc457bff0020
-4bfff72938600000
-7fc0ff2a7c0004ac
-639c00403f80c010
-7c0004ac7b9c0020
-3ba000007fc0e72a
+4bfff4a538637e58
+7ffff21460000000
+2f9f000038600000
+3c62ffff409e00a8
+4bfff48538637e80
+7c9602a660000000
+788400203d400008
+392000007d4903a6
+792800203d491000
+39290001794a1764
+4200ffec910a0000
+7c9f20507ff602a6
+7fff23963fe06400
+600000004bfff4b5
+7d3602a67bff0020
+792900203d000008
+3d4040007d0903a6
+394a0004810a0000
+7cb602a64200fff8
+3ca064007d254850
+3c62ffff7ca54b96
+38637e907fe4fb78
+4bfff3f578a50060
+3860000160000000
+4800118c38210090
+0100000000000000
+3c4c000100000580
+7c0802a6384295cc
+f821fec1480010ed
+3bc000013fe0c010
+7bff002063ff0028
+386000004bfffbd9
+7c0004ac4bfff6bd
+3f80c0107fc0ff2a
+7b9c0020639c0040
+7fc0e72a7c0004ac
+7c0004ac3ba00000
+386000017fa0ff2a
+392000024bfff68d
+7d20ff2a7c0004ac
+7fc0e72a7c0004ac
 7fa0ff2a7c0004ac
-4bfff6f938600001
-7c0004ac39200002
-7c0004ac7d20ff2a
-7c0004ac7fc0e72a
-3c62ffff7fa0ff2a
-38637f403b810070
-4bfff3b53e02ffff
-3d22ffff60000000
-3de2fffffb810080
-3dc2ffff39297f50
-3ae100633e42ffff
-3ac10061f9210098
-3a107ee03be00000
-39ce7f6839ef7f60
-392100643a527f20
-3e80c0103b200001
-f92100883ea0c010
-7f39f83039210068
-62b5082062940818
-3bc000007b330020
-3b000000f9210090
-7a9400203ba00000
-480000547ab50020
-2f9d000f7fbeeb78
-3d20c010419e029c
-7929002061290028
-7e604f2a7c0004ac
-394000013d00c010
-7908002061080048
-7d40472a7c0004ac
-7c0004ac39400000
-3bbd00017d404f2a
-7fbd07b47f78db78
-3900000439410060
-7d5a53783920002a
-38c0000038e00004
-3ca080207ce903a6
-60a500037927f842
-7d2900d0792907e0
-7d29283878a50020
-78e900207d273a78
-38c600017cea31ae
-3908ffff4200ffd4
-79080021394a0004
-3b6000004082ffb8
-7f60a72a7c0004ac
-7f60af2a7c0004ac
-4bfff51d38600009
-4bfff5513860000f
-7f44d3783c60c010
-7863002060630828
-e88100884bfff63d
-606308583c60c010
-4bfff62978630020
-3c60c010e8810090
-7863002060630888
-3c60c0104bfff615
-606308b83881006c
-4bfff60178630020
-612908a83d20c010
+3b8100703c62ffff
+3e02ffff38637f48
+600000004bfff349
+fb8100803d22ffff
+39297f583de2ffff
+3e42ffff3dc2ffff
+f92100983ae10063
+3be000003ac10061
+39ef7f683a107ee8
+3a527f2839ce7f70
+3b20000139210064
+3ea0c0103e80c010
+39210068f9210088
+629408187f39f830
+7b33002062b50820
+f92100903bc00000
+3ba000003b000000
+7ab500207a940020
+7fbeeb7848000054
+419e029c2f9d000f
+612900283d20c010
 7c0004ac79290020
-3d20c0107f604f2a
-79290020612908b0
+3d00c0107e604f2a
+6108004839400001
+7c0004ac79080020
+394000007d40472a
+7d404f2a7c0004ac
+7f78db783bbd0001
+394100607fbd07b4
+3920002a39000004
+38e000047d5a5378
+7ce903a638c00000
+7927f8423ca08020
+792907e060a50003
+78a500207d2900d0
+7d273a787d292838
+7cea31ae78e90020
+4200ffd438c60001
+394a00043908ffff
+4082ffb879080021
+7c0004ac3b600000
+7c0004ac7f60a72a
+386000097f60af2a
+3860000f4bfff4b1
+3c60c0104bfff4e5
+606308287f44d378
+4bfff5d178630020
+3c60c010e8810088
+7863002060630858
+e88100904bfff5bd
+606308883c60c010
+4bfff5a978630020
+3881006c3c60c010
+78630020606308b8
+3d20c0104bfff595
+79290020612908a8
 7f604f2a7c0004ac
-392000173d40c010
-794a0020614a0898
-7d20572a7c0004ac
-392000013d40c010
-794a0020614a08a0
-7d20572a7c0004ac
-612908783d20c010
+612908b03d20c010
 7c0004ac79290020
-3d20c0107f604f2a
-7929002061290880
+3d40c0107f604f2a
+614a089839200017
+7c0004ac794a0020
+3d40c0107d20572a
+614a08a039200001
+7c0004ac794a0020
+3d20c0107d20572a
+7929002061290878
 7f604f2a7c0004ac
-7fa5eb78e8610098
-3b4000207fe4fb78
-4bfff17d3b600000
-7fe3fb7860000000
-4bfff5194bfff485
-3a2000013860000f
-394000004bfff44d
-e881008079480fa4
-7c70402af94100a0
-e94100a04bfff581
-7d1650ae88fc0001
-409e00a07f883800
-88fc00037d1750ae
-409e00907f883800
-2baa0010394a0004
-7e248b78409effc0
-4bfff10d7de37b78
-3b5affff60000000
-4bfff45d7fe3fb78
-7f7b8a147b5a0021
-4082ff807f7b07b4
-4bfff0e57dc37378
-3920000060000000
-7d20a72a7c0004ac
-7d20af2a7c0004ac
-4bfff3753860000b
-4bfff3a93860000f
-4bfff52d7fe3fb78
-4bfff0ad7e439378
-7f98d80060000000
-7f1bc378419cfd70
-3a2000004bfffd6c
-3c62ffff4bffff70
-7fe4fb787fc5f378
-4bfff07d38637f70
-3d20c01060000000
-7929002061290028
-7f204f2a7c0004ac
-394000013d00c010
-7908002061080040
-7d40472a7c0004ac
-7c0004ac39400000
-7bde00207d404f2a
-38de00013d00c010
-7cc903a661080048
-7908002039400001
-4200003438e00000
-3af7ffff7fe3fb78
-7e4393784bfff489
-4bfff0053b9cffff
-2f9f000160000000
-419e00283ad6ffff
-4bfffc783be00001
-7e604f2a7c0004ac
-7d40472a7c0004ac
-7ce04f2a7c0004ac
-382101404bffffb4
-48000ccc38600001
-0100000000000000
-3c4c000100001280
-7c0802a6384290ac
-38637f283c62ffff
-f821ff7148000c89
-3be000003f60c010
-7b7b0020637b1000
-600000004bffef89
-7fe0df2a7c0004ac
-635a10083f40c010
-7c0004ac7b5a0020
-3fa0c0107fe0d72a
-7bbd002063bd0818
-7fe0ef2a7c0004ac
-63de08203fc0c010
-7c0004ac7bde0020
-3f80c0107fe0f72a
-639c08003920000c
-7c0004ac7b9c0020
-386000007d20e72a
-4bfff2096063c350
-7fe0ef2a7c0004ac
+612908803d20c010
+7c0004ac79290020
+e86100987f604f2a
+7fe4fb787fa5eb78
+3b6000003b400020
+600000004bfff111
+4bfff4197fe3fb78
+3860000f4bfff4ad
+4bfff3e13a200001
+79480fa439400000
+f94100a0e8810080
+4bfff5157c70402a
+88fc0001e94100a0
+7f8838007d1650ae
+7d1750ae409e00a0
+7f88380088fc0003
+394a0004409e0090
+409effc02baa0010
+7de37b787e248b78
+600000004bfff0a1
+7fe3fb783b5affff
+7b5a00214bfff3f1
+7f7b07b47f7b8a14
+7dc373784082ff80
+600000004bfff079
+7c0004ac39200000
+7c0004ac7d20a72a
+3860000b7d20af2a
+3860000f4bfff309
+7fe3fb784bfff33d
+7e4393784bfff4c1
+600000004bfff041
+419cfd707f98d800
+4bfffd6c7f1bc378
+4bffff703a200000
+7fc5f3783c62ffff
+38637f787fe4fb78
+600000004bfff011
+612900283d20c010
+7c0004ac79290020
+3d00c0107f204f2a
+6108004039400001
+7c0004ac79080020
+394000007d40472a
+7d404f2a7c0004ac
+3d00c0107bde0020
+6108004838de0001
+394000017cc903a6
+38e0000079080020
+7fe3fb7842000034
+4bfff41d3af7ffff
+3b9cffff7e439378
+600000004bffef99
+3ad6ffff2f9f0001
+3be00001419e0028
+7c0004ac4bfffc78
+7c0004ac7e604f2a
+7c0004ac7d40472a
+4bffffb47ce04f2a
+3860000138210140
+0000000048000ccc
+0000128001000000
+384291403c4c0001
+3c62ffff7c0802a6
+48000c8938637f30
+3f60c010f821ff71
+637b10003be00000
+4bffef1d7b7b0020
+7c0004ac60000000
+3f40c0107fe0df2a
+7b5a0020635a1008
+7fe0d72a7c0004ac
+63bd08183fa0c010
+7c0004ac7bbd0020
+3fc0c0107fe0ef2a
+7bde002063de0820
 7fe0f72a7c0004ac
-7c0004ac3920000e
-386027107d20e72a
-392002004bfff1e5
-7d20ef2a7c0004ac
-7c0004ac39200002
-3860000f7d20f72a
-7c0004ac4bfff189
-392000037fe0ef2a
+3920000c3f80c010
+7b9c0020639c0800
+7d20e72a7c0004ac
+6063c35038600000
+7c0004ac4bfff19d
+7c0004ac7fe0ef2a
+3920000e7fe0f72a
+7d20e72a7c0004ac
+4bfff17938602710
+7c0004ac39200200
+392000027d20ef2a
 7d20f72a7c0004ac
-4bfff16d3860000f
-7c0004ac39200006
-3b8000017d20ef2a
-7f80f72a7c0004ac
-4bfff14d3860000f
-7c0004ac39200920
-7c0004ac7d20ef2a
-3860000f7fe0f72a
-386000c84bfff131
-392004004bfff165
+4bfff11d3860000f
+7fe0ef2a7c0004ac
+7c0004ac39200003
+3860000f7d20f72a
+392000064bfff101
+7d20ef2a7c0004ac
+7c0004ac3b800001
+3860000f7f80f72a
+392009204bfff0e1
 7d20ef2a7c0004ac
 7fe0f72a7c0004ac
-4bfff10d38600003
-4bfff141386000c8
-4bfff6cd4bfffa19
-2c2300004bfff721
-7c0004ac4082001c
-7c0004ac7f80df2a
-382100907f80d72a
-7c0004ac48000b60
-386000017f80df2a
-000000004bffffec
-0000068001000000
-38428f003c4c0001
-600000003d20c000
-7929002061292000
-3d20c000f9228008
-7929002061290020
+4bfff0c53860000f
+4bfff0f9386000c8
+7c0004ac39200400
+7c0004ac7d20ef2a
+386000037fe0f72a
+386000c84bfff0a1
+4bfffa194bfff0d5
+4bfff6b54bfff661
+4082001c2c230000
+7f80df2a7c0004ac
+7f80d72a7c0004ac
+48000b6038210090
+7f80df2a7c0004ac
+4bffffec38600001
+0100000000000000
+3c4c000100000680
+3d20c00038428f94
+6129200060000000
+f922801079290020
+612900203d20c000
+7c0004ac79290020
+3d40001c7d204eea
+7d295392614a2000
+394a0018e9428010
+7c0004ac3929ffff
+4e8000207d2057ea
+0000000000000000
+3c4c000100000000
+6000000038428f34
+39290010e9228010
 7d204eea7c0004ac
-614a20003d40001c
-e94280087d295392
-3929ffff394a0018
+4082ffe871290008
+e94280105469063e
 7d2057ea7c0004ac
 000000004e800020
 0000000000000000
-38428ea03c4c0001
-e922800860000000
-7c0004ac39290010
-712900087d204eea
-5469063e4082ffe8
-7c0004ace9428008
-4e8000207d2057ea
-0000000000000000
-3c4c000100000000
-7c0802a638428e5c
-fbe1fff8fbc1fff0
-f80100103bc3ffff
-8ffe0001f821ffd1
-409e00102fbf0000
-3860000038210030
-2b9f000a48000a8c
-3860000d409e000c
-7fe3fb784bffff81
-4bffffd04bffff79
-0100000000000000
-2c24000000000280
-3881fff040820008
-f86400002b850024
-4d9d002038600000
-78c683e43cc00001
-e924000060c62600
-2b8a002089490000
-7cc75436419d002c
-4082001470e80001
-409e00542fa50000
-4800005c38a0000a
-f924000039290001
-2fa500004bffffcc
-2b8a0030409e0038
-409e003c38a0000a
-2f8a007889490001
-89490001409e0030
-2f8a007838a00010
-39290002409e0020
-48000014f9240000
-409e000c2f850010
-419effd82b8a0030
-4800003038600000
-54ca063e38c9ffd0
-419d00342b8a0009
-7f8928007cc90734
-38e700014c9c0020
-f8e400007c6519d2
-e8e400007c691a14
-2fa9000089270000
-4e800020409effc8
-554a063e3949ff9f
-419d00102b8a0019
-7d2907343929ffa9
-3949ffbf4bffffbc
+38428ef03c4c0001
+fbc1fff07c0802a6
+3bc3fffffbe1fff8
+f821ffd1f8010010
+2fbf00008ffe0001
+38210030409e0010
+48000a8c38600000
+409e000c2b9f000a
+4bffff813860000d
+4bffff797fe3fb78
+000000004bffffd0
+0000028001000000
+408200082c240000
+2b8500243881fff0
+38600000f8640000
+3cc000014d9d0020
+60c6260078c683e4
+89490000e9240000
+419d002c2b8a0020
+70e800017cc75436
+2fa5000040820014
+38a0000a409e0054
+392900014800005c
+4bffffccf9240000
+409e00382fa50000
+38a0000a2b8a0030
+89490001409e003c
+409e00302f8a0078
+38a0001089490001
+409e00202f8a0078
+f924000039290002
+2f85001048000014
+2b8a0030409e000c
+38600000419effd8
+38c9ffd048000030
+2b8a000954ca063e
+7cc90734419d0034
+4c9c00207f892800
+7c6519d238e70001
+7c691a14f8e40000
+89270000e8e40000
+409effc82fa90000
+3949ff9f4e800020
 2b8a0019554a063e
-3929ffc94d9d0020
-000000004bffffe4
-0000000000000000
-7d4348ae39200000
-409e000c2f8a0000
-4e8000207d234b78
-4bffffe839290001
-0000000000000000
-78aae8c200000000
-392a000139000000
-420000307d2903a6
-792a1f2478a9e8c2
-7d0352141d29fff8
-7ca92a147c845214
-3945000139200000
-420000187d4903a6
-7d24402a4e800020
-390800087d23412a
-7d4448ae4bffffc4
-392900017d4849ae
-000000004bffffdc
-0000000000000000
-2b8900193923ff9f
-3863ffe04d9d0020
-4e8000207c6307b4
+3929ffa9419d0010
+4bffffbc7d290734
+554a063e3949ffbf
+4d9d00202b8a0019
+4bffffe43929ffc9
+0000000000000000
+3920000000000000
+2f8a00007d4348ae
+7d234b78409e000c
+392900014e800020
+000000004bffffe8
+0000000000000000
+3900000078aae8c2
+7d2903a6392a0001
+78a9e8c242000030
+1d29fff8792a1f24
+7c8452147d035214
+392000007ca92a14
+7d4903a639450001
+4e80002042000018
+7d23412a7d24402a
+4bffffc439080008
+7d4849ae7d4448ae
+4bffffdc39290001
+0000000000000000
+3923ff9f00000000
+4d9d00202b890019
+7c6307b43863ffe0
+000000004e800020
 0000000000000000
-3c4c000100000000
-7c0802a638428c0c
-7d9080263d203736
-792907c661293534
-9181000865293332
-480007d961293130
-7c7d1b78f821ffa1
-3be000007cde3378
-3d206665f9210020
-792907c661296463
-6129393865296261
-7ca92b78f9210028
-409e00802fa90000
-409e00082fbf0000
-7fbf20403be00001
-419d005838600000
-3b9fffff2e270000
-7d3bf1d27f65f392
-7ca12a147ca92850
-4192001088650020
-600000004bffff41
-2fbb00005463063e
-7f65db78e93d0000
-3b9cffff7c69e1ae
-e93d0000409effc8
-7fe9fa1438600001
-38210060fbfd0000
-7d90812081810008
-2b9e001048000774
-7929e102409e0014
-7fff07b43bff0001
-7d29f3924bffff68
-000000004bfffff0
-0000058003000000
-38428b003c4c0001
-480006e97c0802a6
-eb630000f821ffb1
-7c9c23787c7f1b78
-3bc000007cbd2b78
-4bfffe0d7fa3eb78
-7fa3f04060000000
-e95f0000409d0014
-7fa9e0407d3b5050
-38210050419c0010
-480006f038600001
-3bde00017d3df0ae
-e93f0000992a0000
-f93f000039290001
-000000004bffffb8
-0000058001000000
-38428a803c4c0001
-480006617c0802a6
-7c7d1b78f821ffa1
-7ca32b787c9b2378
-38a0000a38800000
-eb5d00007cde3378
-7d1943787cfc3b78
-4bfffc497d3f4b78
-3940000060000000
-2fbe00007c6307b4
-2faa0000409e006c
-39400001409e0008
-7f8348007d3f5214
-409d00447d2a07b4
-2f8300007c6a1850
-3929000178690020
-3d408000419c0010
-409e00087f835000
-2c29000139200001
-418200143929ffff
-7d5a3850e8fd0000
-419c00307faad840
-3860000038210060
-2b9c001048000604
-7bdee102409e0014
-7d4a07b4394a0001
-7fdee3924bffff7c
-9b2700004bfffff0
-394a0001e95d0000
-4bffffa8f95d0000
+38428ca03c4c0001
+3d2037367c0802a6
+612935347d908026
+65293332792907c6
+6129313091810008
+f821ffa1480007d9
+7cde33787c7d1b78
+f92100203be00000
+612964633d206665
+65296261792907c6
+f921002861293938
+2fa900007ca92b78
+2fbf0000409e0080
+3be00001409e0008
+386000007fbf2040
+2e270000419d0058
+7f65f3923b9fffff
+7ca928507d3bf1d2
+886500207ca12a14
+4bffff4141920010
+5463063e60000000
+e93d00002fbb0000
+7c69e1ae7f65db78
+409effc83b9cffff
+38600001e93d0000
+fbfd00007fe9fa14
+8181000838210060
+480007747d908120
+409e00142b9e0010
+3bff00017929e102
+4bffff687fff07b4
+4bfffff07d29f392
+0300000000000000
+3c4c000100000580
+7c0802a638428b94
+f821ffb1480006e9
+7c7f1b78eb630000
+7cbd2b787c9c2378
+7fa3eb783bc00000
+600000004bfffe0d
+409d00147fa3f040
+7d3b5050e95f0000
+419c00107fa9e040
+3860000138210050
+7d3df0ae480006f0
+992a00003bde0001
+39290001e93f0000
+4bffffb8f93f0000
 0100000000000000
-3c4c000100000780
-7c0802a638428984
-f821fed148000539
-f86100607c741b79
-4182006838600000
-419e00602fa40000
-3e42ffff39210040
-3b4100203ac4ffff
-60000000f9210070
-392280003ae00000
-3ba100603a527fb8
-89250000f9210078
-2fa90000ebc10060
-7ff4f050419e0010
-419c00207fbfb040
-993e000039200000
-7e941850e8610060
-382101307e8307b4
-2b89002548000508
-409e048839450001
-8925000038e00000
-f8a10068e9010070
-7d2741ae7cea07b4
-8d25000139070001
-2b8900647d0807b4
-2b890069419e0058
-2b890075419e0050
-2b890078419e0048
-2b890058419e0040
-2b890070419e0038
-2b890063419e0030
-2b890073419e0028
-2b890025419e0020
-2b89004f419e0018
-2b89006f419e0010
-409eff8838e70001
-2b890025394a0002
-7d1a42147d4a07b4
-992800207d5a5214
-409e00209aea0020
-f9210060393e0001
-993e000039200025
-38a90002e9210068
-892100414bffff04
-3a2600087fffb050
-3a600030eb660000
-3929ffd23b010042
-4082039c712900fd
-3b2000043aa00000
-3a0000013b800000
-7ddb00d039e0002d
-2b89006c48000108
-88f8000138d80001
-419d0118419e033c
-419e02402b890063
-2b89004f419d0038
-2b890058419e01e8
-3949ffd0419e0188
-2b8a0009554a063e
-395c0001419d00c4
-993c00207f81e214
-480000b0795c0020
-419e03042b890068
-419e000c2b890069
-409effc82b890064
-7d41e2142b890075
-7f6adb789aea0020
-57291838419e0034
-7e0948363929ffff
-418200207f694839
-e921006099e80000
-f921006039290001
-7d52482a7b291f24
-e88100607dca5038
-38e0000a7d465378
-7f45d378f9410080
-7e689b7839200000
-7c9e20507fa3eb78
-4bfffc9d7c84f850
-e9410080e8810060
-38c0000a7ea7ab78
-7d4553787c9e2050
-7fa3eb787c84f850
-3b1800014bfffaed
-e901006089380000
+3c4c000100000580
+7c0802a638428b14
+f821ffa148000661
+7c9b23787c7d1b78
+388000007ca32b78
+7cde337838a0000a
+7cfc3b78eb5d0000
+7d3f4b787d194378
+600000004bfffc49
+7c6307b439400000
+409e006c2fbe0000
+409e00082faa0000
+7d3f521439400001
+7d2a07b47f834800
+7c6a1850409d0044
+786900202f830000
+419c001039290001
+7f8350003d408000
+39200001409e0008
+3929ffff2c290001
+e8fd000041820014
+7faad8407d5a3850
+38210060419c0030
+4800060438600000
+409e00142b9c0010
+394a00017bdee102
+4bffff7c7d4a07b4
+4bfffff07fdee392
+e95d00009b270000
+f95d0000394a0001
+000000004bffffa8
+0000078001000000
+38428a183c4c0001
+480005397c0802a6
+7c741b79f821fed1
+38600000f8610060
+2fa4000041820068
+39210040419e0060
+3ac4ffff3e42ffff
+f92100703b410020
+3ae0000060000000
+3a527fc039228008
+f92100783ba10060
+ebc1006089250000
 419e00102fa90000
-7fbf50407d5e4050
-7e268b78419dfee4
-2b8900734bfffe90
-419d006c419e016c
-419e00d42b89006f
-409efef02b890070
-38e000107d21e214
-7c8af8507f66db78
-390000209ae90020
-7f45d37839200002
-4bfffc0d7fa3eb78
-e8a10078e8810060
-7c9e20507fa3eb78
-4bfffb757c84f850
-7ea7ab78e8810060
-7f65db7838c00010
-4bffff5c7c9e2050
-419e00182b890078
-419e01cc2b89007a
-4bfffeb82b890075
-7d21e2143aa00001
-7c8af85038e00010
-9ae900207e689b78
-7f45d3787b291f24
-7d72482a7fa3eb78
-7f6b583839200000
-f96100807d665b78
-e88100604bfffb89
+7fbfb0407ff4f050
+39200000419c0020
+e8610060993e0000
+7e8307b47e941850
+4800050838210130
+394500012b890025
+38e00000409e0488
+e901007089250000
+7cea07b4f8a10068
+390700017d2741ae
+7d0807b48d250001
+419e00582b890064
+419e00502b890069
+419e00482b890075
+419e00402b890078
+419e00382b890058
+419e00302b890070
+419e00282b890063
+419e00202b890073
+419e00182b890025
+419e00102b89004f
+38e700012b89006f
+394a0002409eff88
+7d4a07b42b890025
+7d5a52147d1a4214
+9aea002099280020
+393e0001409e0020
+39200025f9210060
+e9210068993e0000
+4bffff0438a90002
+7fffb05089210041
+eb6600003a260008
+3b0100423a600030
+712900fd3929ffd2
+3aa000004082039c
+3b8000003b200004
+39e0002d3a000001
+480001087ddb00d0
+38d800012b89006c
+419e033c88f80001
+2b890063419d0118
+419d0038419e0240
+419e01e82b89004f
+419e01882b890058
+554a063e3949ffd0
+419d00c42b8a0009
+7f81e214395c0001
+795c0020993c0020
+2b890068480000b0
+2b890069419e0304
+2b890064419e000c
+2b890075409effc8
+9aea00207d41e214
+419e00347f6adb78
+3929ffff57291838
+7f6948397e094836
+99e8000041820020
+39290001e9210060
+7b291f24f9210060
+7dca50387d52482a
+7d465378e8810060
+f941008038e0000a
+392000007f45d378
+7fa3eb787e689b78
+7c84f8507c9e2050
+e88100604bfffc9d
+7ea7ab78e9410080
+7c9e205038c0000a
+7c84f8507d455378
+4bfffaed7fa3eb78
+893800003b180001
+2fa90000e9010060
+7d5e4050419e0010
+419dfee47fbf5040
+4bfffe907e268b78
+419e016c2b890073
+2b89006f419d006c
+2b890070419e00d4
+7d21e214409efef0
+7f66db7838e00010
+9ae900207c8af850
+3920000239000020
+7fa3eb787f45d378
+e88100604bfffc0d
+7fa3eb78e8a10078
+7c84f8507c9e2050
+e88100604bfffb75
 38c000107ea7ab78
-e96100807c9e2050
-4bfffeec7d655b78
-38e000087d21e214
+7c9e20507f65db78
+2b8900784bffff5c
+2b89007a419e0018
+2b890075419e01cc
+3aa000014bfffeb8
+38e000107d21e214
 7e689b787c8af850
 7b291f249ae90020
 7fa3eb787f45d378
 392000007d72482a
 7d665b787f6b5838
-4bfffb35f9610080
+4bfffb89f9610080
 7ea7ab78e8810060
-7c9e205038c00008
-7d21e2144bffffac
-38e0000a39000020
-9ae9002038c00001
-392000007f45d378
-7fa3eb787c8af850
-e92100604bfffaf9
-e92100609b690000
-f921006039290001
-7d21e2144bfffe6c
-f901009038a0000a
-38800000f9410088
-9ae900207f43d378
-600000004bfff73d
-7f63db78f8610080
-600000004bfff861
-7fa91840e9210080
-7c634850409d0040
-e9010090e9410088
-392300012fa30000
-409e00087d4af850
-2c29000139200001
-3929ffffe8c10060
-7ce8305041820010
-419d00207faa3840
-7f65db78e8810060
-7c9e20507fa3eb78
-4bfff9cd7c84f850
-38e000204bfffdd4
-e8e1006098e60000
-f8e1006038e70001
-2b87006c4bffffb4
-409efdb03b200008
-4bfffda87cd83378
-3b2000022b870068
-7cd83378409efd9c
-4bfffd903b200001
-4bfffd883b200008
-3b0100413a600020
-993e00004bfffc60
-e92100607d455378
-f921006039290001
-000000004bfffb24
-0000128001000000
-f9e1ff78f9c1ff70
-fa21ff88fa01ff80
-fa61ff98fa41ff90
-faa1ffa8fa81ffa0
-fae1ffb8fac1ffb0
-fb21ffc8fb01ffc0
-fb61ffd8fb41ffd0
-fba1ffe8fb81ffe0
-fbe1fff8fbc1fff0
-4e800020f8010010
-e9e1ff78e9c1ff70
-ea21ff88ea01ff80
-ea61ff98ea41ff90
-eaa1ffa8ea81ffa0
-eae1ffb8eac1ffb0
-eb21ffc8eb01ffc0
-eb61ffd8eb41ffd0
-e8010010eb81ffe0
-7c0803a6eba1ffe8
-ebe1fff8ebc1fff0
-ebc1fff04e800020
-ebe1fff8e8010010
-4e8000207c0803a6
+7c9e205038c00010
+7d655b78e9610080
+7d21e2144bfffeec
+7c8af85038e00008
+9ae900207e689b78
+7f45d3787b291f24
+7d72482a7fa3eb78
+7f6b583839200000
+f96100807d665b78
+e88100604bfffb35
+38c000087ea7ab78
+4bffffac7c9e2050
+390000207d21e214
+38c0000138e0000a
+7f45d3789ae90020
+7c8af85039200000
+4bfffaf97fa3eb78
+9b690000e9210060
+39290001e9210060
+4bfffe6cf9210060
+38a0000a7d21e214
+f9410088f9010090
+7f43d37838800000
+4bfff73d9ae90020
+f861008060000000
+4bfff8617f63db78
+e921008060000000
+409d00407fa91840
+e94100887c634850
+2fa30000e9010090
+7d4af85039230001
+39200001409e0008
+e8c100602c290001
+418200103929ffff
+7faa38407ce83050
+e8810060419d0020
+7fa3eb787f65db78
+7c84f8507c9e2050
+4bfffdd44bfff9cd
+98e6000038e00020
+38e70001e8e10060
+4bffffb4f8e10060
+3b2000082b87006c
+7cd83378409efdb0
+2b8700684bfffda8
+409efd9c3b200002
+3b2000017cd83378
+3b2000084bfffd90
+3a6000204bfffd88
+4bfffc603b010041
+7d455378993e0000
+39290001e9210060
+4bfffb24f9210060
+0100000000000000
+f9c1ff7000001280
+fa01ff80f9e1ff78
+fa41ff90fa21ff88
+fa81ffa0fa61ff98
+fac1ffb0faa1ffa8
+fb01ffc0fae1ffb8
+fb41ffd0fb21ffc8
+fb81ffe0fb61ffd8
+fbc1fff0fba1ffe8
+f8010010fbe1fff8
+e9c1ff704e800020
+ea01ff80e9e1ff78
+ea41ff90ea21ff88
+ea81ffa0ea61ff98
+eac1ffb0eaa1ffa8
+eb01ffc0eae1ffb8
+eb41ffd0eb21ffc8
+eb81ffe0eb61ffd8
+eba1ffe8e8010010
+ebc1fff07c0803a6
+4e800020ebe1fff8
+e8010010ebc1fff0
+7c0803a6ebe1fff8
+000000004e800020
 6d6f636c65570a0a
 63694d206f742065
 2120747461776f72
@@ -1502,16 +1516,35 @@ ebe1fff8e8010010
 20676e69746f6f42
 415244206d6f7266
 0000000a2e2e2e4d
+20747365746d656d
+000a2e2e2e737562
+7830203a7375625b
+7830203a5d783025
+2073762078383025
+000a783830257830
+257830207375625b
+257830203a5d7830
+3020737620783830
+00000a7838302578
 20747365746d654d
 6c69616620737562
 252f6425203a6465
 73726f7272652064
 000000000000000a
-20747365746d654d
-6961662061746164
-2f6425203a64656c
-726f727265206425
-0000000000000a73
+20747365746d656d
+0a2e2e2e61746164
+0000000000000000
+783020617461645b
+7830203a5d783025
+2073762078383025
+000a783830257830
+20747365746d656d
+0a2e2e2e72646461
+0000000000000000
+783020726464615b
+7830203a5d783025
+2073762078383025
+000a783830257830
 20747365746d654d
 6961662072646461
 2f6425203a64656c
index e42fa0dcd850cbe4afa860bfff2e5fb95a8e9644..5be02b629916b842c9f065584d75cd4a9222fa58 100644 (file)
@@ -1,5 +1,5 @@
 //--------------------------------------------------------------------------------
-// Auto-generated by Migen (0d16e03) & LiteX (564d731a) on 2020-05-26 20:37:40
+// Auto-generated by Migen (0d16e03) & LiteX (564d731a) on 2020-05-30 20:25:55
 //--------------------------------------------------------------------------------
 module litedram_core(
        input wire clk,
index 8cd34d7ded9d0ebc462c3681430841aef99d3c56..e257d322dddd47475c75898cf4fcb006e78df618 100644 (file)
@@ -510,7 +510,7 @@ a64b5a7d14004a39
 0000000000000000
 0000000000000000
 0000000000000000
-384296003c4c0001
+384297003c4c0001
 fbc1fff07c0802a6
 f8010010fbe1fff8
 3be10020f821fe91
@@ -519,11 +519,11 @@ f8c101a838800140
 38c101987c651b78
 7fe3fb78f8e101b0
 f92101c0f90101b8
-48000da5f94101c8
+48000d65f94101c8
 7c7e1b7860000000
-480008bd7fe3fb78
+4800087d7fe3fb78
 3821017060000000
-480013647fc3f378
+480013247fc3f378
 0100000000000000
 4e80002000000280
 0000000000000000
@@ -531,67 +531,67 @@ f92101c0f90101b8
 4e8000204c00012c
 0000000000000000
 3c4c000100000000
-7c0802a63842955c
+7c0802a63842965c
 7d800026fbe1fff8
 91810008f8010010
-480007b1f821ff91
+48000771f821ff91
 3c62ffff60000000
-4bffff3538637de8
+4bffff3538637ca8
 548400023880ffff
 7c8026ea7c0004ac
 3fe0c0003c62ffff
-63ff000838637e08
+63ff000838637cc8
 3c62ffff4bffff11
-38637e287bff0020
+38637ce87bff0020
 7c0004ac4bffff01
 73e900017fe0feea
 3c62ffff41820010
-4bfffee538637e40
+4bfffee538637d00
 4d80000073e90002
 3c62ffff41820010
-4bfffecd38637e48
+4bfffecd38637d08
 4e00000073e90004
 3c62ffff41820010
-4bfffeb538637e50
-3be2804860000000
+4bfffeb538637d10
+3bff7fa03fe2ffff
 4bfffea57fe3fb78
 3c80c00041920028
 7884002060840010
 7c8026ea7c0004ac
 7884b2823c62ffff
-4bfffe7d38637e58
+4bfffe7d38637d18
 3c80c000418e004c
 7884002060840018
 7c8026ea7c0004ac
 788465023c62ffff
-4bfffe5538637e78
+4bfffe5538637d38
 608400303c80c000
 7c0004ac78840020
 3c62ffff7c8026ea
-38637e987884b282
+38637d587884b282
 3d20c0004bfffe31
 7929002061290020
 7d204eea7c0004ac
 3c62ffff3c80000f
-38637eb860844240
+38637d7860844240
 4bfffe057c892392
 4bfffdfd7fe3fb78
 3ca2ffff418e0028
 3c62ffff3c82ffff
-38847ee838a57ed8
-4bfffddd38637ef0
-60000000480004c1
+38847da838a57d98
+4bfffddd38637db0
+6000000048000481
 3c62ffff41920020
-4bfffdc538637f20
+4bfffdc538637de0
 8181000838210070
-480011807d818120
-38637f383c62ffff
+480011407d818120
+38637df83c62ffff
 3c80f0004bfffda9
 6084400038a0ffff
 7884002054a50422
-480008553c604000
+480008153c604000
 3c62ffff60000000
-4bfffd7d38637f58
+4bfffd7d38637e18
 e801001038210070
 ebe1fff881810008
 7d8181207c0803a6
@@ -605,138 +605,130 @@ ebe1fff881810008
 4e8000207d20572a
 0000000000000000
 3c4c000100000000
-7c0802a63842930c
+7c0802a63842940c
 614a08003d40c010
 794a002039200001
 f821ffa1f8010010
 7d20572a7c0004ac
-3862802860000000
+38637f803c62ffff
 600000004bfffce1
 e801001038210060
 4e8000207c0803a6
 0100000000000000
 3c4c000100000080
-7c0802a6384292b4
-6129000c3d204000
-3fc0aaaa48000ffd
-f821ff713f804000
-63deaaaa3fa04000
-639c00043fe04000
-93df000063bd0008
-93dd000093dc0000
-4bfffce993c90000
-813f000060000000
-7d29f278815c0000
-7d2900347f8af000
-692900015529d97e
-7fff07b43be90001
-7d3f07b4409e0008
-7f89f000813d0000
-3bff0001419e000c
-3d2040007fff07b4
-812900006129000c
-2f8aaaaa6d2a5555
-3bff0001419e000c
-3fc055557fff07b4
-3d2040003fa04000
-3f80400063de5555
-63bd000461290008
-93dd000093dc0000
-3d20400093c90000
-93c900006129000c
-600000004bfffc4d
-7f89f000813c0000
-3bff0001419e000c
-813d00007fff07b4
-2f8a55556d2a5555
-3bff0001419e000c
-3d2040007fff07b4
-8129000061290008
-2f8a55556d2a5555
-3bff0001419e000c
-3d2040007fff07b4
-812900006129000c
-2f8a55556d2a5555
-3bff0001419e0028
-3c62ffff7fff07b4
-7fe4fb7838a00100
-4bfffb5538637f70
-4800000c60000000
-409effe02fbf0000
-3ce0802039000004
-60e700037d0903a6
-392000013d404000
-7928f84278e70020
-7d2900d0792907e0
-7d293838394a0004
-912afffc7d294278
-4bfffb794200ffe4
-3900000460000000
-7d0903a63ce08020
-3d40400060e70003
-392000013bc00000
-7928f84278e70020
-7d2900d0792907e0
-7d2942787d293838
-7f884840810a0000
-3bde0001419e000c
-394a00047fde07b4
-2fbe00004200ffd4
-3c62ffff419e001c
-7fc4f37838a00004
-4bfffa9538637f98
-3d20400060000000
-6129000839400000
-914900003ba00000
-394000013d204000
-914900006129000c
-394000023d204000
-9149000061290010
-394000033d204000
-9149000061290014
-600000004bfffabd
-3940000039200004
-3d2a10007d2903a6
-8129000879291764
-7f8950005529043e
-3bbd0001419e000c
-394a00017fbd07b4
-2fbd00004200ffdc
-3c62ffff419e001c
-7fa4eb7838a00004
-4bfff9f538637fc0
-7ffefa1460000000
-7fffea143bc00000
-409e00a42f9f0000
-38637fe83c62ffff
-600000004bfff9d1
-3f8040007f5602a6
-639c00043f604000
-3fa0400039200001
-3fc0400093db0000
-63bd0008913c0000
-63de000c39200002
-39200003913d0000
-7ff602a6913e0000
-600000004bfff9fd
-815b00007d3602a6
-815d0000815c0000
-7cb602a6815e0000
-7ca5485038803200
-7ca42b967d3fd050
-3c62ffff7c844b96
-788404a078a504a0
-3bc0000138637ff8
-600000004bfff941
-7fc3f37838210090
-0000000048000cd4
-0000068001000000
-38428f183c4c0001
-600000007c0802a6
-48000c6138628050
+7c0802a6384293b4
+38637e303c62ffff
+f821ff7148000fc1
+600000004bfffca1
+3d40aaaa39000080
+3d2040007d0903a6
+91490000614aaaaa
+4200fff839290004
+4bfffce93f60aaaa
+3fa0aaaa60000000
+637baaaa3f82ffff
+3be000003bc00000
+3b9c7e4063bdaaaa
+3d3e10007b7b0020
+792917647fc407b4
+7f85e80080a90000
+3bff0001419e001c
+7f83e3787f66db78
+4bfffc257fff07b4
+3bde000160000000
+409effc82bbe0080
+3d40555539000080
+3d2040007d0903a6
+91490000614a5555
+4200fff839290004
+600000004bfffc65
+3f82ffff3fa05555
+3bc000003f605555
+3b9c7e6063bd5555
+3d3e1000637b5555
+792917647fc407b4
+7f85e80080a90000
+3bff0001419e001c
+7f83e3787f66db78
+4bfffba57fff07b4
+3bde000160000000
+409effc82bbe0080
+419e001c2fbf0000
+38a001003c62ffff
+38637e807fe4fb78
+600000004bfffb79
+3fc2ffff3c62ffff
+3bde7ec038637ea8
+600000004bfffb61
+3d20400039400100
+390000017d4903a6
+3929000439480001
+9149fffc79480020
+4bfffba94200fff0
+3940010060000000
+7d4903a639200000
+3d09100038c00001
+7908176439460001
+794600207d2407b4
+7f8a284080a80000
+7fc3f378419e0014
+600000004bfffaf9
+392900014bffff98
+3c62ffff4200ffcc
+4bfffadd38637ee0
+3920002060000000
+7d2903a639400000
+794800203d2a1000
+394a000139290002
+9109000079291764
+4bfffb214200ffe8
+3f82ffff60000000
+3bc000003ba00000
+3d3d10003b9c7ef8
+792917647fa607b4
+5529043e81290008
+7d2507b47f893000
+3bde0001419e001c
+7f83e3787cc43378
+4bfffa657fde07b4
+3bbd000160000000
+409effc02bbd0020
+419e001c2fbe0000
+38a000203c62ffff
+38637f187fc4f378
+600000004bfffa39
+386000007ffff214
+409e00b02f9f0000
+38637f403c62ffff
+600000004bfffa19
+394001007c9602a6
+7d4903a678840020
+3d49100039200000
+794a176479280020
+910a000039290001
+7ff602a64200ffec
+3fe0000c7c9f2050
+7fff239663ff8000
+600000004bfffa45
+7d3602a67bff0020
+7929002039000100
+3d4040007d0903a6
+394a0004810a0000
+7cb602a64200fff8
+3ca0000c7d254850
+3c62ffff60a58000
+7fe4fb787ca54b96
+78a5032038637f50
+600000004bfff981
+3821009038600001
+0000000048000cd8
+0000058001000000
+384290583c4c0001
+3c62ffff7c0802a6
+48000c6138637fa8
 3f60c010f821ff71
 637b10003be00000
-4bfff8f57b7b0020
+4bfff9357b7b0020
 7c0004ac60000000
 3f40c0107fe0df2a
 7b5a0020635a1008
@@ -756,22 +748,22 @@ f821ff713f804000
 7d20ef2a7c0004ac
 7c0004ac39200002
 3860000f7d20f72a
-7c0004ac4bfffb09
+7c0004ac4bfffb49
 392000037fe0ef2a
 7d20f72a7c0004ac
-4bfffaed3860000f
+4bfffb2d3860000f
 7c0004ac39200006
 3b8000017d20ef2a
 7f80f72a7c0004ac
-4bfffacd3860000f
+4bfffb0d3860000f
 7c0004ac39200920
 7c0004ac7d20ef2a
 3860000f7fe0f72a
-392004004bfffab1
+392004004bfffaf1
 7d20ef2a7c0004ac
 7fe0f72a7c0004ac
-4bfffa9538600003
-4bfffb294bfffad5
+4bfffad538600003
+4bfffb694bfffb15
 4082001c2c230000
 7f80df2a7c0004ac
 7f80d72a7c0004ac
@@ -780,27 +772,27 @@ f821ff713f804000
 4bffffec38600001
 0100000000000000
 3c4c000100000680
-3d20c00038428d94
+3d20c00038428ed4
 6129200060000000
-f92280b879290020
+f922801079290020
 612900203d20c000
 7c0004ac79290020
 3d40001c7d204eea
 7d295392614a2000
-394a0018e94280b8
+394a0018e9428010
 7c0004ac3929ffff
 4e8000207d2057ea
 0000000000000000
 3c4c000100000000
-6000000038428d34
-39290010e92280b8
+6000000038428e74
+39290010e9228010
 7d204eea7c0004ac
 4082ffe871290008
-e94280b85469063e
+e94280105469063e
 7d2057ea7c0004ac
 000000004e800020
 0000000000000000
-38428cf03c4c0001
+38428e303c4c0001
 fbc1fff07c0802a6
 3bc3fffffbe1fff8
 f821ffd1f8010010
@@ -874,7 +866,7 @@ f924000039290002
 7c6307b43863ffe0
 000000004e800020
 0000000000000000
-38428aa03c4c0001
+38428be03c4c0001
 3d2037367c0802a6
 612935347d908026
 65293332792907c6
@@ -908,7 +900,7 @@ fbfd00007fe9fa14
 4bfffff07d29f392
 0300000000000000
 3c4c000100000580
-7c0802a638428994
+7c0802a638428ad4
 f821ffb1480006e9
 7c7f1b78eb630000
 7cbd2b787c9c2378
@@ -924,7 +916,7 @@ f821ffb1480006e9
 4bffffb8f93f0000
 0100000000000000
 3c4c000100000580
-7c0802a638428914
+7c0802a638428a54
 f821ffa148000661
 7c9b23787c7d1b78
 388000007ca32b78
@@ -955,16 +947,16 @@ e95d00009b270000
 f95d0000394a0001
 000000004bffffa8
 0000078001000000
-384288183c4c0001
+384289583c4c0001
 480005397c0802a6
 7c741b79f821fed1
 38600000f8610060
 2fa4000041820068
 39210040419e0060
-3ac4ffff60000000
+3ac4ffff3e42ffff
 f92100703b410020
 3ae0000060000000
-3a428068392280b0
+3a527fc039228008
 f92100783ba10060
 ebc1006089250000
 419e00102fa90000
@@ -1196,16 +1188,35 @@ e8010010ebc1fff0
 20676e69746f6f42
 415244206d6f7266
 0000000a2e2e2e4d
+20747365746d656d
+000a2e2e2e737562
+7830203a7375625b
+7830203a5d783025
+2073762078383025
+000a783830257830
+257830207375625b
+257830203a5d7830
+3020737620783830
+00000a7838302578
 20747365746d654d
 6c69616620737562
 252f6425203a6465
 73726f7272652064
 000000000000000a
-20747365746d654d
-6961662061746164
-2f6425203a64656c
-726f727265206425
-0000000000000a73
+20747365746d656d
+0a2e2e2e61746164
+0000000000000000
+783020617461645b
+7830203a5d783025
+2073762078383025
+000a783830257830
+20747365746d656d
+0a2e2e2e72646461
+0000000000000000
+783020726464615b
+7830203a5d783025
+2073762078383025
+000a783830257830
 20747365746d654d
 6961662072646461
 2f6425203a64656c
index b92a59c2274b3e9d0166ce7c572e11b74b9956cc..bdb7dff6249615da14a9f2d7e73be597132411c3 100644 (file)
@@ -1,5 +1,5 @@
 //--------------------------------------------------------------------------------
-// Auto-generated by Migen (0d16e03) & LiteX (564d731a) on 2020-05-26 20:37:42
+// Auto-generated by Migen (0d16e03) & LiteX (564d731a) on 2020-05-30 20:25:57
 //--------------------------------------------------------------------------------
 module litedram_core(
        input wire clk,
index 8dc5a125b2265583229913887b3d212097df7043..fb26f63cc40e42469367820966525c314df7ad22 100644 (file)
@@ -48,6 +48,7 @@ filesets:
       - soc.vhdl
       - xics.vhdl
       - syscon.vhdl
+      - sync_fifo.vhdl
     file_type : vhdlSource-2008
 
   fpga:
diff --git a/sync_fifo.vhdl b/sync_fifo.vhdl
new file mode 100644 (file)
index 0000000..79a4deb
--- /dev/null
@@ -0,0 +1,163 @@
+-- Synchronous FIFO with a protocol similar to AXI
+--
+-- The outputs are generated combinationally from the inputs
+-- in order to allow for back-to-back transfers with the type
+-- of flow control used by busses lite AXI, pipelined WB or
+-- LiteDRAM native port when the FIFO is full.
+--
+-- That means that care needs to be taken by the user not to
+-- generate the inputs combinationally from the outputs otherwise
+-- it would create a logic loop.
+--
+-- If breaking that loop is required, a stash buffer could be
+-- added to break the flow control "loop" between the read and
+-- the write port.
+--
+library ieee;
+use ieee.std_logic_1164.all;
+
+library work;
+use work.utils.all;
+
+entity sync_fifo is
+    generic(
+        -- Fifo depth in entries
+        DEPTH     : natural := 64;
+
+        -- Fifo width in bits
+        WIDTH     : natural := 32;
+
+        -- When INIT_ZERO is set, the memory is pre-initialized to 0's
+        INIT_ZERO : boolean := false
+        );
+    port(
+        -- Control lines:
+        clk      : in std_ulogic;
+        reset    : in std_ulogic;
+
+        -- Write port
+        wr_ready : out std_ulogic;
+        wr_valid : in std_ulogic;
+        wr_data  : in std_ulogic_vector(WIDTH - 1 downto 0);
+
+        -- Read port
+        rd_ready : in std_ulogic;
+        rd_valid : out std_ulogic;
+        rd_data  : out std_ulogic_vector(WIDTH - 1 downto 0)
+        );
+end entity sync_fifo;
+
+architecture behaviour of sync_fifo is
+
+    subtype data_t is std_ulogic_vector(WIDTH - 1 downto 0);    
+    type memory_t is array(0 to DEPTH - 1) of data_t;
+
+    function init_mem return memory_t is
+        variable m : memory_t;
+    begin
+        if INIT_ZERO then
+            for i in 0 to DEPTH - 1 loop
+                m(i) := (others => '0');
+            end loop;
+        end if;
+        return m;
+    end function;
+
+    signal memory : memory_t := init_mem;
+
+    subtype index_t is integer range 0 to DEPTH - 1;
+    signal rd_idx  : index_t;
+    signal rd_next : index_t;
+    signal wr_idx  : index_t;
+    signal wr_next : index_t;
+
+    function next_index(idx : index_t) return index_t is
+        variable r : index_t;
+    begin
+        if ispow2(DEPTH) then
+            r := (idx + 1) mod DEPTH;
+        else
+            r := idx + 1;
+            if r = DEPTH then
+                r := 0;
+            end if;
+        end if;
+        return r;
+    end function;
+    
+    type op_t is (OP_POP, OP_PUSH);
+    signal op_prev : op_t := OP_POP;
+    signal op_next : op_t;
+
+    signal full, empty : std_ulogic;
+    signal push, pop   : std_ulogic;
+begin
+
+    -- Current state at last clock edge
+    empty <= '1' when rd_idx = wr_idx and op_prev = OP_POP  else '0';
+    full  <= '1' when rd_idx = wr_idx and op_prev = OP_PUSH else '0';
+
+    -- We can accept new data if we aren't full or we are but
+    -- the read port is going to accept data this cycle    
+    wr_ready <= rd_ready or not full;
+
+    -- We can provide data if we aren't empty or we are but
+    -- the write port is going to provide data this cycle
+    rd_valid <= wr_valid or not empty;
+
+    -- Internal control signals
+    push <= wr_ready and wr_valid;
+    pop  <= rd_ready and rd_valid;
+
+    -- Next state
+    rd_next <= next_index(rd_idx) when pop  = '1' else rd_idx;
+    wr_next <= next_index(wr_idx) when push = '1' else wr_idx;
+    with push & pop select op_next <=
+        OP_PUSH when "10",
+        OP_POP  when "01",
+        op_prev when others;
+
+    -- Read port output
+    rd_data <= memory(rd_idx) when empty = '0' else wr_data;
+
+    -- Read counter
+    reader: process(clk)
+    begin
+        if rising_edge(clk) then
+            if reset = '1' then
+                rd_idx <= 0;
+            else
+                rd_idx <= rd_next;
+            end if;
+        end if;
+    end process;
+
+    -- Write counter and memory write
+    producer: process(clk)
+    begin
+        if rising_edge(clk) then
+            if reset = '1' then
+                wr_idx <= 0;
+            else
+                wr_idx <= wr_next;
+
+                if push = '1' then
+                    memory(wr_idx) <= wr_data;
+                end if;
+            end if;
+        end if;
+    end process;
+
+    -- Previous op latch used for generating empty/full
+    op: process(clk)
+    begin
+        if rising_edge(clk) then
+            if reset = '1' then
+                op_prev <= OP_POP;
+            else
+                op_prev <= op_next;
+            end if;
+        end if;
+    end process;
+
+end architecture behaviour;