From 066289f8aa5eba545684fd1ae7da3b2da9b6a38f Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Thu, 10 Nov 2022 13:51:12 +0000 Subject: [PATCH 01/44] Work in progress. Wd_Data is moved to 512 bits, and LLC_AXI4_Adapter is updated. Lots of build errors now; a few have been resolved. --- src_Core/CPU/LLC_AXI4_Adapter.bsv | 97 ++++++++++-------------------- src_Core/CPU/MMIO_AXI4_Adapter.bsv | 4 +- src_Core/Core/Fabric_Defs.bsv | 2 +- src_Core/PLIC/PLIC.bsv | 6 +- 4 files changed, 39 insertions(+), 70 deletions(-) diff --git a/src_Core/CPU/LLC_AXI4_Adapter.bsv b/src_Core/CPU/LLC_AXI4_Adapter.bsv index 3a03154..d4496e6 100644 --- a/src_Core/CPU/LLC_AXI4_Adapter.bsv +++ b/src_Core/CPU/LLC_AXI4_Adapter.bsv @@ -70,7 +70,7 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) Add#(SizeOf#(Line), 0, TAdd#(512, 4))); // assert Line sz = 512 + 4 tags // Verbosity: 0: quiet; 1: LLC transactions; 2: loop detail - Integer verbosity = 0; + Integer verbosity = 2; Reg #(Bit #(4)) cfg_verbosity <- mkConfigReg (fromInteger (verbosity)); // ================================================================ @@ -87,11 +87,10 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) // Send a read-request into the fabric function Action fa_fabric_send_read_req (Fabric_Addr addr); action - AXI4_Size size = 8; let mem_req_rd_addr = AXI4_ARFlit {arid: fabric_default_mid, araddr: addr, - arlen: 7, // burst len = arlen+1 - arsize: 8, + arlen: 0, // burst len = arlen+1 + arsize: 64, arburst: INCR, arlock: fabric_default_lock, arcache: fabric_default_arcache, @@ -135,83 +134,53 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) rule rl_handle_read_rsps; let mem_rsp <- get(masterPortShim.slave.r); - if (cfg_verbosity > 1) begin $display ("%0d: LLC_AXI4_Adapter.rl_handle_read_rsps: beat %0d ", cur_cycle, rg_rd_rsp_beat); $display (" ", fshow (mem_rsp)); end - if (mem_rsp.rresp != OKAY) begin // TODO: need to raise a non-maskable interrupt (NMI) here $display ("%0d: LLC_AXI4_Adapter.rl_handle_read_rsp: fabric response error; exit", cur_cycle); $display (" ", fshow (mem_rsp)); $finish (1); end - - // Shift next 64 bits from fabric into the cache line being assembled - let new_cline_tag = { mem_rsp.ruser, pack(rg_cline.tag) [3:1] }; - let new_cline_data = { mem_rsp.rdata, pack(rg_cline.data) [511:64] }; - let new_cline = CLine { tag: rg_rd_rsp_beat[0] == 0 ? unpack(new_cline_tag) : rg_cline.tag - , data: unpack(new_cline_data) }; - - if (mem_rsp.rlast) begin - let ldreq <- pop (f_pending_reads); - MemRsMsg #(idT, childT) resp = MemRsMsg {data: new_cline, - child: ldreq.child, - id: ldreq.id}; - - llc.rsFromM.enq (resp); - - if (cfg_verbosity > 1) - $display (" Response to LLC: ", fshow (resp)); - - rg_rd_rsp_beat <= 0; - rg_cline <= unpack(0); - end else begin - rg_rd_rsp_beat <= rg_rd_rsp_beat + 1; - rg_cline <= new_cline; - end + let new_cline = CLine { tag: unpack(mem_rsp.ruser) + , data: unpack(mem_rsp.rdata) }; + let ldreq <- pop (f_pending_reads); + MemRsMsg #(idT, childT) resp = MemRsMsg {data: new_cline, + child: ldreq.child, + id: ldreq.id}; + llc.rsFromM.enq (resp); + if (cfg_verbosity > 1) + $display (" Response to LLC: ", fshow (resp)); endrule // ================================================================ // Handle write requests and responses - // Each 512b cache line takes 8 beats, each handling 64 bits - Reg #(Bit #(3)) rg_wr_req_beat <- mkReg (0); - rule rl_handle_write_req (llc.toM.first matches tagged Wb .wb); - if ((cfg_verbosity > 0) && (rg_wr_req_beat == 0)) begin + if (cfg_verbosity > 0) begin $display ("%d: LLC_AXI4_Adapter.rl_handle_write_req: Wb request from LLC to memory:", cur_cycle); $display (" ", fshow (wb)); end - // on first flit... - // ================ - if (rg_wr_req_beat == 0) begin - // send AXI4 AW flit - masterPortShim.slave.aw.put (AXI4_AWFlit { - awid: fabric_default_mid, - awaddr: { wb.addr [63:6], 6'h0 }, - awlen: 7, // burst len = awlen+1 - awsize: 8, - awburst: INCR, - awlock: fabric_default_lock, - awcache: fabric_default_awcache, - awprot: fabric_default_prot, - awqos: fabric_default_qos, - awregion: fabric_default_region, - awuser: 0}); - // Expect a fabric response - ctr_wr_rsps_pending.incr; - end + // send AXI4 AW flit + masterPortShim.slave.aw.put (AXI4_AWFlit { + awid: fabric_default_mid, + awaddr: { wb.addr [63:6], 6'h0 }, + awlen: 0, // burst len = awlen+1 + awsize: 64, + awburst: INCR, + awlock: fabric_default_lock, + awcache: fabric_default_awcache, + awprot: fabric_default_prot, + awqos: fabric_default_qos, + awregion: fabric_default_region, + awuser: 0}); + // Expect a fabric response + ctr_wr_rsps_pending.incr; + llc.toM.deq; - // on last flit... - // =============== - if (rg_wr_req_beat == 7) begin - llc.toM.deq; - rg_wr_req_beat <= 0; - end else // increment flit counter - rg_wr_req_beat <= rg_wr_req_beat + 1; // on each flit ... // ================ @@ -219,10 +188,10 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) Vector #(4, MemTaggedData) line_data = clineToMemTaggedDataVector(wb.data); // send AXI4 W flit masterPortShim.slave.w.put(AXI4_WFlit { - wdata: line_data[rg_wr_req_beat[2:1]].data[rg_wr_req_beat[0]], - wstrb: line_strb[rg_wr_req_beat], - wlast: rg_wr_req_beat == 7, - wuser: pack(line_data[rg_wr_req_beat[2:1]].tag)}); + wdata: pack(wb.data.data), + wstrb: pack(wb.byteEn), + wlast: True, + wuser: pack(wb.data.tag)}); endrule // ---------------- diff --git a/src_Core/CPU/MMIO_AXI4_Adapter.bsv b/src_Core/CPU/MMIO_AXI4_Adapter.bsv index 694c637..5e148da 100644 --- a/src_Core/CPU/MMIO_AXI4_Adapter.bsv +++ b/src_Core/CPU/MMIO_AXI4_Adapter.bsv @@ -66,7 +66,7 @@ interface MMIO_AXI4_Adapter_IFC; interface Server #(MMIOCRq, MMIODataPRs) core_side; // Fabric master interface for IO - interface AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data + interface AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph , Wd_AW_User, Wd_W_User, Wd_B_User , Wd_AR_User, Wd_R_User) mmio_master; endinterface @@ -251,7 +251,7 @@ module mkMMIO_AXI4_Adapter (MMIO_AXI4_Adapter_IFC); // on each flit... // =============== - AXI4_WFlit #(Wd_Data, Wd_W_User) + AXI4_WFlit #(Wd_Data_Periph, Wd_W_User) wflit = AXI4_WFlit {wdata: req.data.data[whichHalf], wstrb: line_strb[whichHalf], wlast: last, diff --git a/src_Core/Core/Fabric_Defs.bsv b/src_Core/Core/Fabric_Defs.bsv index 9443091..51c52dc 100644 --- a/src_Core/Core/Fabric_Defs.bsv +++ b/src_Core/Core/Fabric_Defs.bsv @@ -67,7 +67,7 @@ Integer bytes_per_fabric_addr = valueOf (Bytes_per_Fabric_Addr); // | // Periph -typedef 64 Wd_Data; +typedef 512 Wd_Data; // ---------------- // Width of fabric 'user' datapaths. Carry capability tags on data lines. diff --git a/src_Core/PLIC/PLIC.bsv b/src_Core/PLIC/PLIC.bsv index 95670d9..01a5921 100644 --- a/src_Core/PLIC/PLIC.bsv +++ b/src_Core/PLIC/PLIC.bsv @@ -98,7 +98,7 @@ interface PLIC_IFC #(numeric type t_n_external_sources, method Action set_addr_map (Bit #(64) addr_base, Bit #(64) addr_lim); // Memory-mapped access - interface AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data + interface AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data_Periph , 0, 0, 0, 0, 0) axi4_slave; // sources @@ -381,7 +381,7 @@ module mkPLIC (PLIC_IFC #(t_n_external_sources, t_n_targets, t_max_priority)) $display (" ", fshow (rda)); end - if ((valueOf (Wd_Data) == 64) && ((addr_offset & 'h7) == 'h4)) + if ((valueOf (Wd_Data_Periph) == 64) && ((addr_offset & 'h7) == 'h4)) rdata = { rdata [31:0], 32'h0 }; // Send read-response to bus @@ -416,7 +416,7 @@ module mkPLIC (PLIC_IFC #(t_n_external_sources, t_n_targets, t_max_priority)) end let addr_offset = wra.awaddr - rg_addr_base; - let wdata32 = (((valueOf (Wd_Data) == 64) && ((addr_offset & 'h7) == 'h4)) + let wdata32 = (((valueOf (Wd_Data_Periph) == 64) && ((addr_offset & 'h7) == 'h4)) ? wrd.wdata [63:32] : wrd.wdata [31:0]); let bresp = OKAY; From ddf4afaf718d8e095020fae1fa491ddac8eb7e16 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Fri, 11 Nov 2022 17:52:32 +0000 Subject: [PATCH 02/44] Changes to build with a 512-bit main data bus (with all other busses still 64-bits). Also, the top-level SoC_Top exposes a 64-bit bus still, so hopefully the GFE configuration is unchanged. This passes the isa_tests. --- builds/Resources/Include_Common.mk | 4 ++-- src_Core/CPU/Proc_IFC.bsv | 4 ++-- src_Core/Core/CoreW.bsv | 14 +++++++------ src_Core/PLIC/PLIC.bsv | 3 +-- .../RISCY_OOO/procs/lib/LLCDmaConnect.bsv | 2 +- src_Testbench/SoC/Mem_Controller.bsv | 16 +++++++------- src_Testbench/SoC/SoC_Top.bsv | 21 ++++++++++++++----- src_Testbench/SoC/UART_Model.bsv | 6 +++--- 8 files changed, 41 insertions(+), 29 deletions(-) diff --git a/builds/Resources/Include_Common.mk b/builds/Resources/Include_Common.mk index 6c1369c..ab4a0c1 100644 --- a/builds/Resources/Include_Common.mk +++ b/builds/Resources/Include_Common.mk @@ -88,11 +88,11 @@ BSC_COMPILATION_FLAGS += \ -D MULT_SYNTH \ -D Near_Mem_Caches \ -D FABRIC64 \ - -D CheriBusBytes=8 \ + -D CheriBusBytes=64 \ -D CheriMasterIDWidth=1 \ -D CheriTransactionIDWidth=6 \ -D CAP128 -D BLUESIM \ - -D MEM64 \ + -D MEM512 \ -D RISCV \ -D PERFORMANCE_MONITORING \ -D RAS_HIT_TRACING \ diff --git a/src_Core/CPU/Proc_IFC.bsv b/src_Core/CPU/Proc_IFC.bsv index 50c6e09..60e0053 100644 --- a/src_Core/CPU/Proc_IFC.bsv +++ b/src_Core/CPU/Proc_IFC.bsv @@ -79,7 +79,7 @@ interface Proc_IFC; Wd_AR_User, Wd_R_User) master0; // Fabric master interface for IO (from MMIOPlatform) - interface AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data + interface AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph , Wd_AW_User, Wd_W_User, Wd_B_User , Wd_AR_User, Wd_R_User) master1; @@ -106,7 +106,7 @@ interface Proc_IFC; // ---------------- // Coherent port into LLC (used by Debug Module, DMA engines, ... to read/write memory) - interface AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data + interface AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data_Periph , Wd_AW_User, Wd_W_User, Wd_B_User , Wd_AR_User, Wd_R_User) debug_module_mem_server; diff --git a/src_Core/Core/CoreW.bsv b/src_Core/Core/CoreW.bsv index 59eda10..d97a846 100644 --- a/src_Core/Core/CoreW.bsv +++ b/src_Core/Core/CoreW.bsv @@ -124,9 +124,9 @@ typedef WindCoreMid #( // AXI lite subordinate control port parameters // AXI manager 0 port parameters , TAdd #(Wd_MId, 1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0 // AXI manager 1 port parameters - , TAdd #(Wd_MId, 1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0 + , TAdd #(Wd_MId, 1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0 // AXI subordinate 0 port parameters - , Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data + , Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph , Wd_AW_User, Wd_W_User, Wd_B_User , Wd_AR_User, Wd_R_User // Number of interrupt lines @@ -233,8 +233,10 @@ module mkCoreW_reset #(Reset porReset) // handle cached interface // AXI4 tagController TagControllerAXI #(Wd_MId, Wd_Addr, Wd_Data) - tagController <- mkTagControllerAXI (reset_by all_harts_reset); // TODO double check if reseting like this is good enough + // tagController <- mkTagControllerAXI (reset_by all_harts_reset); // TODO double check if reseting like this is good enough + tagController <- mkFakeTagControllerAXI (reset_by all_harts_reset); mkConnection (proc.master0, tagController.slave, reset_by all_harts_reset); +/* `ifdef PERFORMANCE_MONITORING rule report_tagController_events; EventsCacheCore cache_core_evts = tagController.events; @@ -251,7 +253,7 @@ module mkCoreW_reset #(Reset porReset) proc.events_tgc(evts); endrule `endif - +*/ // PLIC (Platform-Level Interrupt Controller) PLIC_IFC_16_CoreNumX2_7 plic <- mkPLIC_16_CoreNumX2_7 (reset_by all_harts_reset); @@ -459,7 +461,7 @@ module mkCoreW_reset #(Reset porReset) // Masters on the local bus Vector #( CoreW_Bus_Num_Masters - , AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data + , AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph , Wd_AW_User, Wd_W_User, Wd_B_User , Wd_AR_User, Wd_R_User)) master_vector = newVector; @@ -470,7 +472,7 @@ module mkCoreW_reset #(Reset porReset) // Slaves on the local bus // default slave is forwarded out directly to the Core interface Vector #( CoreW_Bus_Num_Slaves - , AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data + , AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data_Periph , Wd_AW_User, Wd_W_User, Wd_B_User , Wd_AR_User, Wd_R_User)) slave_vector = newVector; diff --git a/src_Core/PLIC/PLIC.bsv b/src_Core/PLIC/PLIC.bsv index 01a5921..fbfc096 100644 --- a/src_Core/PLIC/PLIC.bsv +++ b/src_Core/PLIC/PLIC.bsv @@ -385,9 +385,8 @@ module mkPLIC (PLIC_IFC #(t_n_external_sources, t_n_targets, t_max_priority)) rdata = { rdata [31:0], 32'h0 }; // Send read-response to bus - Fabric_Data x = truncate (rdata); let rdr = AXI4_RFlit {rid: rda.arid, - rdata: x, + rdata: rdata, rresp: rresp, rlast: True, ruser: rda.aruser}; // XXX This requires that Wd_AR_User == Wd_R_User diff --git a/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv b/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv index 0c9d13f..da0cb3c 100644 --- a/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv +++ b/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv @@ -131,7 +131,7 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc // REPLACED BY AXI4_Slave_interface //, MemLoaderMemClient memLoader , Vector#(CoreNum, TlbMemClient) tlb ) - (AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data + (AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data_Periph , Wd_AW_User, Wd_W_User, Wd_B_User , Wd_AR_User, Wd_R_User)) provisos (Alias #(dmaRqT, DmaRq #(LLCDmaReqId))); diff --git a/src_Testbench/SoC/Mem_Controller.bsv b/src_Testbench/SoC/Mem_Controller.bsv index 09433c4..67e683a 100644 --- a/src_Testbench/SoC/Mem_Controller.bsv +++ b/src_Testbench/SoC/Mem_Controller.bsv @@ -126,7 +126,7 @@ typedef TLog #(Word64s_per_Raw_Mem_Word) Bits_per_Word64_in_Raw_Me // Type of index of a Word64 in a Raw_Mem_Word seen as a vector of Word64s typedef Bit #(Bits_per_Word64_in_Raw_Mem_Word) Word64_in_Raw_Mem_Word; -typedef TDiv #(Bytes_per_Raw_Mem_Word, Bytes_per_Fabric_Data) Fabric_Data_per_Raw_Mem_Word; +typedef TDiv #(Bytes_per_Raw_Mem_Word, TDiv #(Wd_Data_Periph, 8)) Fabric_Data_per_Raw_Mem_Word; // Index of bit that selects a fabric data word in an address `ifdef FABRIC32 @@ -207,7 +207,7 @@ interface Mem_Controller_IFC; method Action set_addr_map (Fabric_Addr addr_base, Fabric_Addr addr_lim); // Main Fabric Reqs/Rsps - interface AXI4_Slave #(Wd_SId, Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + interface AXI4_Slave #(Wd_SId, Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) slave; // To raw memory (outside the SoC) @@ -245,8 +245,8 @@ typedef struct {Req_Op req_op; Bit #(Wd_User) user; // Write data info - Bit #(TDiv #(Wd_Data, 8)) wstrb; - Fabric_Data data; + Bit #(TDiv #(Wd_Data_Periph, 8)) wstrb; + Bit #(Wd_Data_Periph) data; } Req deriving (Bits, FShow); @@ -487,7 +487,7 @@ module mkMem_Controller (Mem_Controller_IFC); // We need to select the fabric data word from the raw mem word that contains the target address. // View the raw mem word as a vector of fabric data words (Wd_Data width words) - Vector #(Fabric_Data_per_Raw_Mem_Word, Bit #(Wd_Data)) raw_mem_word_V_fabric_data = unpack (rg_cached_raw_mem_word); + Vector #(Fabric_Data_per_Raw_Mem_Word, Bit #(Wd_Data_Periph)) raw_mem_word_V_fabric_data = unpack (rg_cached_raw_mem_word); // Get the index into this vector of the fabric word containing the target address. // For this index, use a generous size (here Bit #(16)), and let zeroExtend pad it automaticallly. @@ -496,7 +496,7 @@ module mkMem_Controller (Mem_Controller_IFC); n = (n >> lo_fabric_data); // Select the fabric data word of interest - Bit #(Wd_Data) rdata = raw_mem_word_V_fabric_data [n]; + Bit #(Wd_Data_Periph) rdata = raw_mem_word_V_fabric_data [n]; let rdr = AXI4_RFlit {rid: f_reqs.first.id, rdata: rdata, @@ -529,7 +529,7 @@ module mkMem_Controller (Mem_Controller_IFC); // Lane-adjust the new word64 Bit #(64) word64_new = zeroExtend (f_reqs.first.data); Bit #(8) strobe = zeroExtend (f_reqs.first.wstrb); - if ((valueOf (Wd_Data) == 32) && (f_reqs.first.addr [2] == 1'b1)) begin + if ((valueOf (Wd_Data_Periph) == 32) && (f_reqs.first.addr [2] == 1'b1)) begin // Upper 32b only word64_new = { word64_new [31:0], 0 }; strobe = { strobe [3:0], 0 }; @@ -609,7 +609,7 @@ module mkMem_Controller (Mem_Controller_IFC); rule rl_invalid_rd_address ( (rg_state == STATE_READY) && (! fn_addr_is_ok (rg_addr_base, f_reqs.first.addr, rg_addr_lim, f_reqs.first.size)) && (f_reqs.first.req_op == REQ_OP_RD)); - Fabric_Data rdata = zeroExtend (f_reqs.first.addr); + Bit#(Wd_Data_Periph) rdata = zeroExtend (f_reqs.first.addr); let rdr = AXI4_RFlit {rid: f_reqs.first.id, rdata: rdata, // for debugging only rresp: SLVERR, diff --git a/src_Testbench/SoC/SoC_Top.bsv b/src_Testbench/SoC/SoC_Top.bsv index 74e64a6..78b843d 100644 --- a/src_Testbench/SoC/SoC_Top.bsv +++ b/src_Testbench/SoC/SoC_Top.bsv @@ -153,15 +153,26 @@ module mkSoC_Top #(Reset dm_power_on_reset) // SoC Boot ROM Boot_ROM_IFC boot_rom <- mkBoot_ROM; // AXI4 Deburster in front of Boot_ROM - AXI4_Shim#(Wd_SId, Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + AXI4_Shim#(Wd_SId, Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) boot_rom_axi4_deburster <- mkBurstToNoBurst; // SoC Memory Mem_Controller_IFC mem0_controller <- mkMem_Controller; // AXI4 Deburster in front of SoC Memory - AXI4_Shim#(Wd_SId, Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + AXI4_Shim#(Wd_SId, Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) mem0_controller_axi4_deburster <- mkBurstToNoBurst; + // AXI4 Narrower Master in front of cached memory master + AXI4_Shim#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) + manager_0_narrow <- mkAXI4ShimFF; + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,4), 0, 0, 0, 0, 0) + manager_0_wide_a <- toWider_AXI4_Slave(manager_0_narrow.slave); + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,2), 0, 0, 0, 0, 0) + manager_0_wide_b <- toWider_AXI4_Slave(manager_0_wide_a); + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + manager_0_wide <- toWider_AXI4_Slave(manager_0_wide_b); + mkConnection(corew.manager_0,manager_0_wide); + // SoC IPs UART_IFC uart0 <- mkUART; @@ -174,12 +185,12 @@ module mkSoC_Top #(Reset dm_power_on_reset) // SoC fabric master connections // Note: see 'SoC_Map' for 'master_num' definitions - Vector#(Num_Masters, AXI4_Master #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, + Vector#(Num_Masters, AXI4_Master #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0)) master_vector = newVector; // CPU IMem master to fabric - master_vector[imem_master_num] = corew.manager_0; + master_vector[imem_master_num] = manager_0_narrow.master; // CPU DMem master to fabric master_vector[dmem_master_num] = corew.manager_1; @@ -188,7 +199,7 @@ module mkSoC_Top #(Reset dm_power_on_reset) // SoC fabric slave connections // Note: see 'SoC_Map' for 'slave_num' definitions - Vector#(Num_Slaves, AXI4_Slave #(Wd_SId, Wd_Addr, Wd_Data, + Vector#(Num_Slaves, AXI4_Slave #(Wd_SId, Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0)) slave_vector = newVector; Vector#(Num_Slaves, Range#(Wd_Addr)) route_vector = newVector; diff --git a/src_Testbench/SoC/UART_Model.bsv b/src_Testbench/SoC/UART_Model.bsv index 77a6345..9c760ed 100644 --- a/src_Testbench/SoC/UART_Model.bsv +++ b/src_Testbench/SoC/UART_Model.bsv @@ -130,7 +130,7 @@ interface UART_IFC; method Action set_addr_map (Fabric_Addr addr_base, Fabric_Addr addr_lim); // Main Fabric Reqs/Rsps - interface AXI4_Slave #(Wd_SId, Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) slave; + interface AXI4_Slave #(Wd_SId, Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) slave; // To external console interface Get #(Bit #(8)) get_to_console; @@ -367,8 +367,8 @@ module mkUART (UART_IFC); end // Align data byte for AXI4 data bus based on fabric-width - Fabric_Data rdata = zeroExtend (rdata_byte); - if ((valueOf (Wd_Data) == 64) && (byte_addr [2:0] == 3'b100)) + Bit#(Wd_Data_Periph) rdata = zeroExtend (rdata_byte); + if ((valueOf (Wd_Data_Periph) == 64) && (byte_addr [2:0] == 3'b100)) rdata = rdata << 32; // Send read-response to bus From 01482abb1b3b81772d5d3fb37a82a85071b61a09 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Mon, 14 Nov 2022 13:48:21 +0000 Subject: [PATCH 03/44] Move to new name for null tag controller. --- src_Core/Core/CoreW.bsv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_Core/Core/CoreW.bsv b/src_Core/Core/CoreW.bsv index d97a846..e8af566 100644 --- a/src_Core/Core/CoreW.bsv +++ b/src_Core/Core/CoreW.bsv @@ -234,7 +234,7 @@ module mkCoreW_reset #(Reset porReset) // AXI4 tagController TagControllerAXI #(Wd_MId, Wd_Addr, Wd_Data) // tagController <- mkTagControllerAXI (reset_by all_harts_reset); // TODO double check if reseting like this is good enough - tagController <- mkFakeTagControllerAXI (reset_by all_harts_reset); + tagController <- mkNullTagControllerAXI (reset_by all_harts_reset); mkConnection (proc.master0, tagController.slave, reset_by all_harts_reset); /* `ifdef PERFORMANCE_MONITORING From 2fbe5b6a6bd8bcbefaffaf6b96d413202c6ceb18 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Mon, 14 Nov 2022 14:52:21 +0000 Subject: [PATCH 04/44] Bump subrepos. --- libs/TagController | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/TagController b/libs/TagController index c01eded..f3ce441 160000 --- a/libs/TagController +++ b/libs/TagController @@ -1 +1 @@ -Subproject commit c01eded44999d0a1cabb0470628cbd208fc1984e +Subproject commit f3ce4415bfd7a49a1d45d312110b2484d4d1a5aa From 98e15acb3d4372e4a8db3db9e1a8141bd1e011b8 Mon Sep 17 00:00:00 2001 From: Alexandre Joannou Date: Fri, 18 Nov 2022 12:07:24 +0000 Subject: [PATCH 05/44] Bump BlueStuff + use _Periph versions of parameters where needed --- libs/BlueStuff | 2 +- src_Core/CPU/Proc_IFC.bsv | 5 +-- src_Core/Core/CoreW.bsv | 34 +++++++++++++------ src_Core/Core/Fabric_Defs.bsv | 5 +++ src_Core/Debug_Module/DM_System_Bus.bsv | 10 +++--- src_Core/Debug_Module/Debug_Module.bsv | 4 +-- .../RISCY_OOO/procs/lib/LLCDmaConnect.bsv | 4 +-- 7 files changed, 41 insertions(+), 23 deletions(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 48ca4c3..4dec54b 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 48ca4c33911a86d562804defa4dfebaf28ade54b +Subproject commit 4dec54bc42f1705ecd5066bc0d65cd64ab12e32e diff --git a/src_Core/CPU/Proc_IFC.bsv b/src_Core/CPU/Proc_IFC.bsv index 60e0053..056ffc3 100644 --- a/src_Core/CPU/Proc_IFC.bsv +++ b/src_Core/CPU/Proc_IFC.bsv @@ -107,8 +107,9 @@ interface Proc_IFC; // Coherent port into LLC (used by Debug Module, DMA engines, ... to read/write memory) interface AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data_Periph - , Wd_AW_User, Wd_W_User, Wd_B_User - , Wd_AR_User, Wd_R_User) debug_module_mem_server; + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph) + debug_module_mem_server; `ifdef RVFI_DII interface Toooba_RVFI_DII_Server rvfi_dii_server; diff --git a/src_Core/Core/CoreW.bsv b/src_Core/Core/CoreW.bsv index e8af566..2fbfe97 100644 --- a/src_Core/Core/CoreW.bsv +++ b/src_Core/Core/CoreW.bsv @@ -127,8 +127,8 @@ typedef WindCoreMid #( // AXI lite subordinate control port parameters , TAdd #(Wd_MId, 1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0 // AXI subordinate 0 port parameters , Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph - , Wd_AW_User, Wd_W_User, Wd_B_User - , Wd_AR_User, Wd_R_User + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph // Number of interrupt lines , t_n_irq) CoreW_IFC #(numeric type t_n_irq); @@ -225,8 +225,10 @@ module mkCoreW_reset #(Reset porReset) Proc_IFC proc <- mkProc (reset_by all_harts_reset); // handle uncached interface - let proc_uncached = - prepend_AXI4_Master_id (0, zero_AXI4_Master_user (proc.master1)); + AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph ) proc_uncached = + prepend_AXI4_Master_id (0, zero_AXI4_Master_user (proc.master1)); // Bridge for uncached expernal bus transactions. let uncached_mem_shim <- mkAXI4ShimFF(reset_by all_harts_reset); @@ -364,7 +366,10 @@ module mkCoreW_reset #(Reset porReset) // Create a tap for DM's memory-writes to the bus, and merge-in the trace data. DM_Mem_Tap_IFC dm_mem_tap <- mkDM_Mem_Tap; mkConnection (debug_module.master, dm_mem_tap.slave); - let dm_master_local = dm_mem_tap.master; + AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph ) + dm_master_local = dm_mem_tap.master; rule rl_merge_dm_mem_trace_data; let tmp <- dm_mem_tap.trace_data_out.get; @@ -430,7 +435,10 @@ module mkCoreW_reset #(Reset porReset) mkConnection (debug_module.harts_csr_mem_client, proc.harts_csr_mem_server, reset_by porReset); // DM's bus master is directly the bus master - let dm_master_local = debug_module.master; + AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph ) + dm_master_local = debug_module.master; // END SECTION: DM, no TV // ================================================================ @@ -441,7 +449,10 @@ module mkCoreW_reset #(Reset porReset) // BEGIN SECTION: no DM // No DM, so 'DM bus master' is AXI4 dummy - let dm_master_local = culDeSac; + AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph ) + dm_master_local = culDeSac; `ifdef INCLUDE_TANDEM_VERIF // TV, no DM: stub out the dm input to TV @@ -462,8 +473,9 @@ module mkCoreW_reset #(Reset porReset) // Masters on the local bus Vector #( CoreW_Bus_Num_Masters , AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph - , Wd_AW_User, Wd_W_User, Wd_B_User - , Wd_AR_User, Wd_R_User)) + , Wd_AW_User_Periph, Wd_W_User_Periph + , Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph )) master_vector = newVector; master_vector[cpu_uncached_master_num] = proc_uncached; master_vector[debug_module_sba_master_num] = dm_master_local; @@ -473,8 +485,8 @@ module mkCoreW_reset #(Reset porReset) // default slave is forwarded out directly to the Core interface Vector #( CoreW_Bus_Num_Slaves , AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data_Periph - , Wd_AW_User, Wd_W_User, Wd_B_User - , Wd_AR_User, Wd_R_User)) + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph )) slave_vector = newVector; slave_vector[default_slave_num] = uncached_mem_shim.slave; slave_vector[llc_slave_num] = proc.debug_module_mem_server; diff --git a/src_Core/Core/Fabric_Defs.bsv b/src_Core/Core/Fabric_Defs.bsv index 26de07f..d6255cc 100644 --- a/src_Core/Core/Fabric_Defs.bsv +++ b/src_Core/Core/Fabric_Defs.bsv @@ -118,6 +118,11 @@ Bit#(Wd_W_User) fabric_default_wuser = 0; Bit#(Wd_B_User) fabric_default_buser = 0; Bit#(Wd_AR_User) fabric_default_aruser = 0; Bit#(Wd_R_User) fabric_default_ruser = 0; +Bit#(Wd_AW_User_Periph) fabric_default_awuser_periph = 0; +Bit#(Wd_W_User_Periph) fabric_default_wuser_periph = 0; +Bit#(Wd_B_User_Periph) fabric_default_buser_periph = 0; +Bit#(Wd_AR_User_Periph) fabric_default_aruser_periph = 0; +Bit#(Wd_R_User_Periph) fabric_default_ruser_periph = 0; // ================================================================ diff --git a/src_Core/Debug_Module/DM_System_Bus.bsv b/src_Core/Debug_Module/DM_System_Bus.bsv index bf77653..b04d252 100644 --- a/src_Core/Debug_Module/DM_System_Bus.bsv +++ b/src_Core/Debug_Module/DM_System_Bus.bsv @@ -55,8 +55,8 @@ interface DM_System_Bus_IFC; // ---------------- // Facing System interface AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph - , Wd_AW_User, Wd_W_User, Wd_B_User - , Wd_AR_User, Wd_R_User) master; + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph) master; endinterface // ================================================================ @@ -292,7 +292,7 @@ module mkDM_System_Bus (DM_System_Bus_IFC); arprot: fabric_default_prot, arqos: fabric_default_qos, arregion: fabric_default_region, - aruser: fabric_default_aruser}; + aruser: fabric_default_aruser_periph}; axiShim.slave.ar.put(rda); // Save read-address for byte-lane extraction from later response @@ -333,13 +333,13 @@ module mkDM_System_Bus (DM_System_Bus_IFC); awprot: fabric_default_prot, awqos: fabric_default_qos, awregion: fabric_default_region, - awuser: fabric_default_awuser}; + awuser: fabric_default_awuser_periph}; axiShim.slave.aw.put(wra); let wrd = AXI4_WFlit {wdata: fabric_data, wstrb: fabric_strb, wlast: True, - wuser: fabric_default_wuser}; + wuser: fabric_default_wuser_periph}; axiShim.slave.w.put(wrd); if (verbosity != 0) begin diff --git a/src_Core/Debug_Module/Debug_Module.bsv b/src_Core/Debug_Module/Debug_Module.bsv index d3546cb..dfd73a5 100644 --- a/src_Core/Debug_Module/Debug_Module.bsv +++ b/src_Core/Debug_Module/Debug_Module.bsv @@ -138,8 +138,8 @@ interface Debug_Module_IFC; // Read/Write RISC-V memory interface AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph - , Wd_AW_User, Wd_W_User, Wd_B_User - , Wd_AR_User, Wd_R_User) master; + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph) master; endinterface // ================================================================ diff --git a/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv b/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv index da0cb3c..0f9b2af 100644 --- a/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv +++ b/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv @@ -132,8 +132,8 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc //, MemLoaderMemClient memLoader , Vector#(CoreNum, TlbMemClient) tlb ) (AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data_Periph - , Wd_AW_User, Wd_W_User, Wd_B_User - , Wd_AR_User, Wd_R_User)) + , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph + , Wd_AR_User_Periph, Wd_R_User_Periph )) provisos (Alias #(dmaRqT, DmaRq #(LLCDmaReqId))); Bool verbose = False; From 5f69c657c17f6746765b25d87f747e209f854bb4 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Wed, 23 Nov 2022 10:09:01 +0000 Subject: [PATCH 06/44] Use IDs in cache miss transactions to allow reordering. --- src_Core/CPU/LLC_AXI4_Adapter.bsv | 56 +++++++++++++++---------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src_Core/CPU/LLC_AXI4_Adapter.bsv b/src_Core/CPU/LLC_AXI4_Adapter.bsv index adf771f..e92c7c2 100644 --- a/src_Core/CPU/LLC_AXI4_Adapter.bsv +++ b/src_Core/CPU/LLC_AXI4_Adapter.bsv @@ -61,13 +61,21 @@ endinterface // ================================================================ +typedef struct { + Bool tag_req; // meaningful to upgrade to E if toState is S + idT id; // slot id in child cache + childT child; // from which child +} LLC_AXI_ID#(type idT, type childT) deriving(Bits, Eq, FShow); + module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) (LLC_AXI4_Adapter_IFC) - provisos(Bits#(idT, a__), - Bits#(childT, b__), + provisos(Bits#(idT, idSz), + Bits#(childT, childSz), FShow#(ToMemMsg#(idT, childT)), FShow#(MemRsMsg#(idT, childT)), - Add#(SizeOf#(Line), 0, TAdd#(512, 4))); // assert Line sz = 512 + 4 tags + Add#(SizeOf#(Line), 0, TAdd#(512, 4)), + Add#(c__, TAdd#(1, TAdd#(idSz, childSz)), Wd_MId) // LLC_AXI_ID must fit into the external ID. + ); // assert Line sz = 512 + 4 tags // Verbosity: 0: quiet; 1: LLC transactions; 2: loop detail Integer verbosity = 2; @@ -79,25 +87,26 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) let masterPortShim <- mkAXI4ShimFF; // For discarding write-responses - CreditCounter_IFC #(4) ctr_wr_rsps_pending <- mkCreditCounter; // Max 15 writes outstanding + CreditCounter_IFC #(4) ctr_wr_rsps_pending <- mkCreditCounter; // 16 outstanding writes. // ================================================================ // Functions to interact with the fabric // Send a read-request into the fabric - function Action fa_fabric_send_read_req (Fabric_Addr addr, Bool tag_req); + function Action fa_fabric_send_read_req (Fabric_Addr addr, LLC_AXI_ID#(idT, childT) id); action - let mem_req_rd_addr = AXI4_ARFlit {arid: fabric_default_mid, + Bit#(Wd_MId) arid = zeroExtend(pack(id)); + let mem_req_rd_addr = AXI4_ARFlit {arid: arid, araddr: addr, arlen: 0, // burst len = arlen+1 - arsize: tag_req ? 1 : 64, + arsize: id.tag_req ? 1 : 64, arburst: INCR, arlock: fabric_default_lock, arcache: fabric_default_arcache, arprot: fabric_default_prot, arqos: fabric_default_qos, arregion: fabric_default_region, - aruser: pack(tag_req)}; + aruser: pack(id.tag_req)}; masterPortShim.slave.ar.put(mem_req_rd_addr); @@ -110,16 +119,8 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) // ================================================================ // Handle read requests and responses - // Don't do reads while writes are outstanding. - // Each 512b cache line takes 8 beats, each handling 64 bits - Reg #(Bit #(3)) rg_rd_rsp_beat <- mkReg (0); - - FIFOF #(LdMemRq #(idT, childT)) f_pending_reads <- mkFIFOF; - Reg #(CLine) rg_cline <- mkRegU; - - rule rl_handle_read_req (llc.toM.first matches tagged Ld .ld - &&& (ctr_wr_rsps_pending.value == 0)); + rule rl_handle_read_req (llc.toM.first matches tagged Ld .ld); if ((cfg_verbosity > 0)) begin $display ("%0d: LLC_AXI4_Adapter.rl_handle_read_req: Ld request from LLC to memory", cur_cycle); @@ -127,15 +128,14 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) end Addr line_addr = {ld.addr [63:6], 6'h0 }; // Addr of containing cache line - fa_fabric_send_read_req (line_addr, ld.tag_req); - f_pending_reads.enq (ld); + fa_fabric_send_read_req (line_addr, LLC_AXI_ID{tag_req: ld.tag_req, id: ld.id, child: ld.child}); llc.toM.deq; endrule rule rl_handle_read_rsps; let mem_rsp <- get(masterPortShim.slave.r); if (cfg_verbosity > 1) begin - $display ("%0d: LLC_AXI4_Adapter.rl_handle_read_rsps: beat %0d ", cur_cycle, rg_rd_rsp_beat); + $display ("%0d: LLC_AXI4_Adapter.rl_handle_read_rsps: ", cur_cycle); $display (" ", fshow (mem_rsp)); end if (mem_rsp.rresp != OKAY) begin @@ -146,11 +146,11 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) end let new_cline = CLine { tag: unpack(mem_rsp.ruser) , data: unpack(mem_rsp.rdata) }; - let ldreq <- pop (f_pending_reads); + LLC_AXI_ID#(idT, childT) id = unpack(truncate(mem_rsp.rid)); MemRsMsg #(idT, childT) resp = MemRsMsg {data: new_cline, - child: ldreq.child, - id: ldreq.id}; - if (ldreq.tag_req) begin + child: id.child, + id: id.id}; + if (id.tag_req) begin resp.data = CLine { tag: unpack(truncate(mem_rsp.rdata)), data: ?}; end llc.rsFromM.enq (resp); @@ -160,7 +160,7 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) // ================================================================ // Handle write requests and responses - + Reg#(Bit#(Wd_MId)) wid_reg <- mkRegU; rule rl_handle_write_req (llc.toM.first matches tagged Wb .wb); if (cfg_verbosity > 0) begin $display ("%d: LLC_AXI4_Adapter.rl_handle_write_req: Wb request from LLC to memory:", cur_cycle); @@ -169,7 +169,7 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) // send AXI4 AW flit masterPortShim.slave.aw.put (AXI4_AWFlit { - awid: fabric_default_mid, + awid: wid_reg, awaddr: { wb.addr [63:6], 6'h0 }, awlen: 0, // burst len = awlen+1 awsize: 64, @@ -182,11 +182,9 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) awuser: 0}); // Expect a fabric response ctr_wr_rsps_pending.incr; + wid_reg <= wid_reg + 1; // Best effort to use unique IDs to allow reordering in the fabric. llc.toM.deq; - - // on each flit ... - // ================ Vector #(8, Bit #(8)) line_strb = unpack(pack(wb.byteEn)); Vector #(4, MemTaggedData) line_data = clineToMemTaggedDataVector(wb.data); // send AXI4 W flit From e9d7b85b634f7a5930a3397c39cd0588b99ee128 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Wed, 23 Nov 2022 10:22:04 +0000 Subject: [PATCH 07/44] Use working tag controller; merge with more explicit types. --- src_Core/Core/CoreW.bsv | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src_Core/Core/CoreW.bsv b/src_Core/Core/CoreW.bsv index 2fbfe97..c8a7408 100644 --- a/src_Core/Core/CoreW.bsv +++ b/src_Core/Core/CoreW.bsv @@ -225,20 +225,21 @@ module mkCoreW_reset #(Reset porReset) Proc_IFC proc <- mkProc (reset_by all_harts_reset); // handle uncached interface - AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph - , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph - , Wd_AR_User_Periph, Wd_R_User_Periph ) proc_uncached = - prepend_AXI4_Master_id (0, zero_AXI4_Master_user (proc.master1)); + AXI4_Master #( Wd_CoreW_Bus_MId, Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) + proc_uncached = prepend_AXI4_Master_id (0, zero_AXI4_Master_user (proc.master1)); // Bridge for uncached expernal bus transactions. let uncached_mem_shim <- mkAXI4ShimFF(reset_by all_harts_reset); // handle cached interface // AXI4 tagController TagControllerAXI #(Wd_MId, Wd_Addr, Wd_Data) - // tagController <- mkTagControllerAXI (reset_by all_harts_reset); // TODO double check if reseting like this is good enough - tagController <- mkNullTagControllerAXI (reset_by all_harts_reset); + tagController <- mkTagControllerAXI (reset_by all_harts_reset); // TODO double check if reseting like this is good enough mkConnection (proc.master0, tagController.slave, reset_by all_harts_reset); -/* + AXI4_Shim#(TAdd #(Wd_MId, 1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + tag_controller_deburster <- mkBurstToNoBurst; + mkConnection (tagController.master, tag_controller_deburster.slave, reset_by all_harts_reset); + + `ifdef PERFORMANCE_MONITORING rule report_tagController_events; EventsCacheCore cache_core_evts = tagController.events; @@ -255,7 +256,7 @@ module mkCoreW_reset #(Reset porReset) proc.events_tgc(evts); endrule `endif -*/ + // PLIC (Platform-Level Interrupt Controller) PLIC_IFC_16_CoreNumX2_7 plic <- mkPLIC_16_CoreNumX2_7 (reset_by all_harts_reset); @@ -489,7 +490,7 @@ module mkCoreW_reset #(Reset porReset) , Wd_AR_User_Periph, Wd_R_User_Periph )) slave_vector = newVector; slave_vector[default_slave_num] = uncached_mem_shim.slave; - slave_vector[llc_slave_num] = proc.debug_module_mem_server; + slave_vector[llc_slave_num] = zero_AXI4_Slave_user (proc.debug_module_mem_server); slave_vector[plic_slave_num] = zero_AXI4_Slave_user (plic.axi4_slave); function Vector #(CoreW_Bus_Num_Slaves, Bool) route (Bit #(Wd_Addr) addr); @@ -631,7 +632,7 @@ module mkCoreW_reset #(Reset porReset) // memory interfaces // ----------------- // Cached master to Fabric master interface - interface manager_0 = tagController.master; + interface manager_0 = tag_controller_deburster.master; // Uncached master to Fabric master interface interface manager_1 = prepend_AXI4_Master_id (0, zero_AXI4_Master_user (uncached_mem_shim.master)); From e73d8223ea971d6b27879703e4f992385def54bd Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Wed, 23 Nov 2022 10:10:37 +0000 Subject: [PATCH 08/44] Use working tag controller (at 512-bits wide, so quite wasteful for now...). --- src_Core/Core/CoreW.bsv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src_Core/Core/CoreW.bsv b/src_Core/Core/CoreW.bsv index c8a7408..202b322 100644 --- a/src_Core/Core/CoreW.bsv +++ b/src_Core/Core/CoreW.bsv @@ -314,7 +314,7 @@ module mkCoreW_reset #(Reset porReset) rule rl_dm_harts_reset (rg_harts_reset_delay == 0); let x <- debug_module.harts_reset_client[core].request.get; dm_harts_reset_controller[core].assertReset; - rg_harts_reset_delay <= fromInteger (hart_reset_duration + 200); // NOTE: heuristic + rg_harts_reset_delay <= fromInteger (hart_reset_duration + 200); // NOTE: heuristic rg_harts_reset_running <= x; $display ("%0d: %m.rl_dm_harts_reset: asserting harts reset for %0d cycles", cur_cycle, hart_reset_duration); From 06a9221bb1476ff94507a7536d0029ba803bd175 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Wed, 23 Nov 2022 13:29:46 +0000 Subject: [PATCH 09/44] Changes for GFE hardware build with 512-bit bus. --- libs/BlueStuff | 2 +- libs/TagController | 2 +- src_Core/CPU/LLC_AXI4_Adapter.bsv | 6 +++--- src_SSITH_P3/Makefile | 4 ++-- src_SSITH_P3/src_BSV/P3_Core.bsv | 16 +++++++++++++--- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 4dec54b..b4c948d 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 4dec54bc42f1705ecd5066bc0d65cd64ab12e32e +Subproject commit b4c948d4b4ed670128470b34e2bee184f4843ccc diff --git a/libs/TagController b/libs/TagController index f3ce441..d0fca21 160000 --- a/libs/TagController +++ b/libs/TagController @@ -1 +1 @@ -Subproject commit f3ce4415bfd7a49a1d45d312110b2484d4d1a5aa +Subproject commit d0fca216babe2fcbab4cf63635d1e82384200d2c diff --git a/src_Core/CPU/LLC_AXI4_Adapter.bsv b/src_Core/CPU/LLC_AXI4_Adapter.bsv index e92c7c2..94a3a0c 100644 --- a/src_Core/CPU/LLC_AXI4_Adapter.bsv +++ b/src_Core/CPU/LLC_AXI4_Adapter.bsv @@ -73,9 +73,9 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) Bits#(childT, childSz), FShow#(ToMemMsg#(idT, childT)), FShow#(MemRsMsg#(idT, childT)), - Add#(SizeOf#(Line), 0, TAdd#(512, 4)), - Add#(c__, TAdd#(1, TAdd#(idSz, childSz)), Wd_MId) // LLC_AXI_ID must fit into the external ID. - ); // assert Line sz = 512 + 4 tags + Add#(SizeOf#(Line), 0, TAdd#(512, 4)), // assert Line sz = 512 + 4 tags + Add#(a__, SizeOf#(LLC_AXI_ID#(idT, childT)), Wd_MId) // LLC_AXI_ID must fit into the external ID. + ); // Verbosity: 0: quiet; 1: LLC transactions; 2: loop detail Integer verbosity = 2; diff --git a/src_SSITH_P3/Makefile b/src_SSITH_P3/Makefile index 4df6e47..d86f5e4 100644 --- a/src_SSITH_P3/Makefile +++ b/src_SSITH_P3/Makefile @@ -27,7 +27,7 @@ BSC_COMPILATION_FLAGS += \ -D ISA_PRIV_M -D ISA_PRIV_S -D ISA_PRIV_U \ -D SV39 \ -D ISA_I -D ISA_M -D ISA_A -D ISA_F -D ISA_D -D ISA_FD_DIV -D ISA_C \ - -D CheriBusBytes=8 \ + -D CheriBusBytes=64 \ -D CheriMasterIDWidth=1 \ -D CheriTransactionIDWidth=6 \ -D PERFORMANCE_MONITORING \ @@ -36,7 +36,7 @@ BSC_COMPILATION_FLAGS += \ -D Near_Mem_Caches \ -D FABRIC64 \ -D CAP128 \ - -D MEM64 \ + -D MEM512 \ -D RISCV \ -D NO_SPEC_TRAINING -D NO_SPEC_REDIRECT -D NO_SPEC_STRAIGHT_PATH -D SPEC_RSB_FIXUP -D NO_SPEC_RSB_PUSH -D NO_SPEC_STL \ -D TSO_MM \ diff --git a/src_SSITH_P3/src_BSV/P3_Core.bsv b/src_SSITH_P3/src_BSV/P3_Core.bsv index 7f5ff60..5934091 100644 --- a/src_SSITH_P3/src_BSV/P3_Core.bsv +++ b/src_SSITH_P3/src_BSV/P3_Core.bsv @@ -71,10 +71,10 @@ interface P3_Core_IFC; // Core CPU interfaces // CPU IMem to Fabric master interface - interface AXI4_Master_Sig#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, + interface AXI4_Master_Sig#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) master0; - interface AXI4_Master_Sig#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, + interface AXI4_Master_Sig#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) master1; // External interrupt sources @@ -165,6 +165,16 @@ module mkP3_Core (P3_Core_IFC); , CoreW_IFC #(N_External_Interrupt_Sources)) both <- mkCoreW_reset (dm_power_on_reset, reset_by ndm_reset); match {.otherRst, .corew} = both; + // AXI4 Narrower Master in front of cached memory master + AXI4_Shim#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) + manager_0_narrow <- mkAXI4ShimFF; + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,4), 0, 0, 0, 0, 0) + manager_0_wide_a <- toWider_AXI4_Slave(manager_0_narrow.slave); + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,2), 0, 0, 0, 0, 0) + manager_0_wide_b <- toWider_AXI4_Slave(manager_0_wide_a); + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + manager_0_wide <- toWider_AXI4_Slave(manager_0_wide_b); + mkConnection(corew.manager_0,manager_0_wide); `ifdef INCLUDE_GDB_CONTROL @@ -256,7 +266,7 @@ module mkP3_Core (P3_Core_IFC); // ================================================================ // INTERFACE - let master0_sig <- toAXI4_Master_Sig (corew.manager_0); + let master0_sig <- toAXI4_Master_Sig (manager_0_narrow.master); let master1_sig <- toAXI4_Master_Sig (corew.manager_1); // ---------------------------------------------------------------- // Core CPU interfaces From d67d4fd4bb2ef0fa99203567eefb1235e5a97b2b Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Wed, 23 Nov 2022 15:39:28 +0000 Subject: [PATCH 10/44] Bump submodules. --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index b4c948d..4dec54b 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit b4c948d4b4ed670128470b34e2bee184f4843ccc +Subproject commit 4dec54bc42f1705ecd5066bc0d65cd64ab12e32e From 10c59c9478d6951e1ac1f4ad99e475950c353272 Mon Sep 17 00:00:00 2001 From: Alexandre Joannou Date: Thu, 24 Nov 2022 09:47:28 +0000 Subject: [PATCH 11/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 4dec54b..e4e29d4 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 4dec54bc42f1705ecd5066bc0d65cd64ab12e32e +Subproject commit e4e29d4b23a9ca303ce5567b7dfe87dbee28ac09 From a0ffc16626cdc7ecdb00017f63c460ba0d88abe3 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Thu, 24 Nov 2022 11:59:03 +0000 Subject: [PATCH 12/44] Bump Bluestuff. --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index e4e29d4..b02f4d6 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit e4e29d4b23a9ca303ce5567b7dfe87dbee28ac09 +Subproject commit b02f4d6a5c38114dd0afda982ae73d431cb963c0 From 23adcdc4940eeecf805b691ad3c59eff28e48b8c Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Thu, 24 Nov 2022 12:48:32 +0000 Subject: [PATCH 13/44] Bump BlueStuff. --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index b02f4d6..5cba455 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit b02f4d6a5c38114dd0afda982ae73d431cb963c0 +Subproject commit 5cba455fbb268b7ba110d78cb64485f5fa3c4619 From b9a137bf672c84c5d411c38c781b6f43409ac583 Mon Sep 17 00:00:00 2001 From: Alexandre Joannou Date: Tue, 29 Nov 2022 08:44:21 +0000 Subject: [PATCH 14/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 5cba455..e3c6c79 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 5cba455fbb268b7ba110d78cb64485f5fa3c4619 +Subproject commit e3c6c793b583a92e993961963430aa03d4581553 From ac7ac33fd5d453b1dfa679709e99d5633f7ed82f Mon Sep 17 00:00:00 2001 From: Alexandre Joannou Date: Tue, 29 Nov 2022 10:33:30 +0000 Subject: [PATCH 15/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index e3c6c79..44da96c 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit e3c6c793b583a92e993961963430aa03d4581553 +Subproject commit 44da96c0af75d8aa84ea5fe18d7fcebfed82a3f6 From b3c371e51adbf2d7fd3dd2b4054775c60c9a78e8 Mon Sep 17 00:00:00 2001 From: gameboo Date: Thu, 8 Dec 2022 22:14:16 +0000 Subject: [PATCH 16/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 44da96c..006f6ca 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 44da96c0af75d8aa84ea5fe18d7fcebfed82a3f6 +Subproject commit 006f6ca5723417e0f484673bfa15b31e963bb5cb From 6a109809f3fc607b3c3b660ad9f29687b618b3e7 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Mon, 12 Dec 2022 14:34:11 +0000 Subject: [PATCH 17/44] Bump Bluestuff. --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 006f6ca..f208ada 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 006f6ca5723417e0f484673bfa15b31e963bb5cb +Subproject commit f208ada02e9c4e9d47dffa5a0a77b615fb3612e5 From d29e31b0c0023f3aca914f89e84d11e3ed4e8d82 Mon Sep 17 00:00:00 2001 From: gameboo Date: Fri, 6 Jan 2023 16:07:04 +0000 Subject: [PATCH 18/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index f208ada..dcd5e78 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit f208ada02e9c4e9d47dffa5a0a77b615fb3612e5 +Subproject commit dcd5e785a06a33a42558f701b9d5d7def8742482 From be91801982c21fe75927603093d5b44bdf6939d9 Mon Sep 17 00:00:00 2001 From: gameboo Date: Fri, 6 Jan 2023 16:07:56 +0000 Subject: [PATCH 19/44] Use wide to narrow AXI4 shim --- src_SSITH_P3/src_BSV/P3_Core.bsv | 19 +++++++++---------- src_Testbench/SoC/SoC_Top.bsv | 22 ++++++++++------------ 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src_SSITH_P3/src_BSV/P3_Core.bsv b/src_SSITH_P3/src_BSV/P3_Core.bsv index 5934091..4de67b9 100644 --- a/src_SSITH_P3/src_BSV/P3_Core.bsv +++ b/src_SSITH_P3/src_BSV/P3_Core.bsv @@ -32,6 +32,7 @@ import Vector :: *; import GetPut_Aux :: *; import Routable :: *; +import BlueBasics :: *; import BlueAXI4 :: *; import SourceSink :: *; import WindCoreInterface :: *; @@ -166,15 +167,13 @@ module mkP3_Core (P3_Core_IFC); <- mkCoreW_reset (dm_power_on_reset, reset_by ndm_reset); match {.otherRst, .corew} = both; // AXI4 Narrower Master in front of cached memory master - AXI4_Shim#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) - manager_0_narrow <- mkAXI4ShimFF; - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,4), 0, 0, 0, 0, 0) - manager_0_wide_a <- toWider_AXI4_Slave(manager_0_narrow.slave); - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,2), 0, 0, 0, 0, 0) - manager_0_wide_b <- toWider_AXI4_Slave(manager_0_wide_a); - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) - manager_0_wide <- toWider_AXI4_Slave(manager_0_wide_b); - mkConnection(corew.manager_0,manager_0_wide); + NumProxy #(4) proxyInDepth = error ("don't look inside a proxy"); + NumProxy #(4) proxyOutDepth = error ("don't look inside a proxy"); + Tuple2 #( AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + , AXI4_Master #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) ) + wideS_narrowM <- mkAXI4DataWidthShim_WideToNarrow (proxyInDepth, proxyOutDepth); + match {.wideS, .narrowM} = wideS_narrowM; + mkConnection(corew.manager_0, wideS); `ifdef INCLUDE_GDB_CONTROL @@ -266,7 +265,7 @@ module mkP3_Core (P3_Core_IFC); // ================================================================ // INTERFACE - let master0_sig <- toAXI4_Master_Sig (manager_0_narrow.master); + let master0_sig <- toAXI4_Master_Sig (narrowM); let master1_sig <- toAXI4_Master_Sig (corew.manager_1); // ---------------------------------------------------------------- // Core CPU interfaces diff --git a/src_Testbench/SoC/SoC_Top.bsv b/src_Testbench/SoC/SoC_Top.bsv index 78b843d..af9779c 100644 --- a/src_Testbench/SoC/SoC_Top.bsv +++ b/src_Testbench/SoC/SoC_Top.bsv @@ -46,8 +46,8 @@ import Vector :: *; import Cur_Cycle :: *; import GetPut_Aux :: *; import Routable :: *; -import AXI4 :: *; -import AXI4Lite :: *; +import BlueBasics :: *; +import BlueAXI4 :: *; // ================================================================ // Project imports @@ -163,15 +163,13 @@ module mkSoC_Top #(Reset dm_power_on_reset) mem0_controller_axi4_deburster <- mkBurstToNoBurst; // AXI4 Narrower Master in front of cached memory master - AXI4_Shim#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) - manager_0_narrow <- mkAXI4ShimFF; - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,4), 0, 0, 0, 0, 0) - manager_0_wide_a <- toWider_AXI4_Slave(manager_0_narrow.slave); - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,2), 0, 0, 0, 0, 0) - manager_0_wide_b <- toWider_AXI4_Slave(manager_0_wide_a); - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) - manager_0_wide <- toWider_AXI4_Slave(manager_0_wide_b); - mkConnection(corew.manager_0,manager_0_wide); + NumProxy #(4) proxyInDepth = error ("don't look inside a proxy"); + NumProxy #(4) proxyOutDepth = error ("don't look inside a proxy"); + Tuple2 #( AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + , AXI4_Master #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) ) + wideS_narrowM <- mkAXI4DataWidthShim_WideToNarrow (proxyInDepth, proxyOutDepth); + match {.wideS, .narrowM} = wideS_narrowM; + mkConnection(corew.manager_0, wideS); // SoC IPs UART_IFC uart0 <- mkUART; @@ -190,7 +188,7 @@ module mkSoC_Top #(Reset dm_power_on_reset) master_vector = newVector; // CPU IMem master to fabric - master_vector[imem_master_num] = manager_0_narrow.master; + master_vector[imem_master_num] = narrowM; // CPU DMem master to fabric master_vector[dmem_master_num] = corew.manager_1; From f5450a1c0601b6e55440af0279e3ed13fc6266ad Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Mon, 16 Jan 2023 17:45:07 +0000 Subject: [PATCH 20/44] Extend ID field to match current design. This is likely to be cause of lockup in hardware. --- src_SSITH_P3/xilinx_ip/component.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src_SSITH_P3/xilinx_ip/component.xml b/src_SSITH_P3/xilinx_ip/component.xml index bd8f871..e3eb438 100644 --- a/src_SSITH_P3/xilinx_ip/component.xml +++ b/src_SSITH_P3/xilinx_ip/component.xml @@ -1109,7 +1109,7 @@ out - 5 + 6 0 @@ -1295,7 +1295,7 @@ in - 5 + 6 0 @@ -1391,7 +1391,7 @@ out - 5 + 6 0 @@ -1648,7 +1648,7 @@ in - 5 + 6 0 @@ -1710,7 +1710,7 @@ out - 5 + 6 0 @@ -1896,7 +1896,7 @@ in - 5 + 6 0 From 5c6e34878862dde38d13b69f8ff6ba39a711b18f Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Tue, 17 Jan 2023 16:11:52 +0000 Subject: [PATCH 21/44] Missing width extensions. --- src_SSITH_P3/xilinx_ip/component.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src_SSITH_P3/xilinx_ip/component.xml b/src_SSITH_P3/xilinx_ip/component.xml index e3eb438..a764e79 100644 --- a/src_SSITH_P3/xilinx_ip/component.xml +++ b/src_SSITH_P3/xilinx_ip/component.xml @@ -790,7 +790,7 @@ out - 5 + 6 0 @@ -1047,7 +1047,7 @@ in - 5 + 6 0 From 8ea0e07ce5d307100578998714ec5d8c1d78b672 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Tue, 31 Jan 2023 21:02:17 +0000 Subject: [PATCH 22/44] Avoid wedge on repeated debug resumes (with jdw57 and aj443) ConfigReg avoids a compile error --- src_Core/RISCY_OOO/procs/RV64G_OOO/RenameStage.bsv | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src_Core/RISCY_OOO/procs/RV64G_OOO/RenameStage.bsv b/src_Core/RISCY_OOO/procs/RV64G_OOO/RenameStage.bsv index 0102058..4c0950f 100644 --- a/src_Core/RISCY_OOO/procs/RV64G_OOO/RenameStage.bsv +++ b/src_Core/RISCY_OOO/procs/RV64G_OOO/RenameStage.bsv @@ -63,6 +63,7 @@ import ReservationStationAlu::*; import ReservationStationMem::*; import ReservationStationFpuMulDiv::*; import SplitLSQ::*; +import ConfigReg::*; import CHERICap::*; import CHERICC_Fat::*; import ISA_Decls_CHERI::*; @@ -199,7 +200,7 @@ module mkRenameStage#(RenameInput inIfc)(RenameStage); // Is set to Valid intrDebugStep on dcsr[stepbit]==1 and one instruction has been processed. // Note (step): 1st instruction is guaranteed architectural, cannot possibly be speculative. // Note (step): 1st instruction may trap; we halt pointing at the trap vector - Reg #(Maybe #(Interrupt)) rg_m_halt_req <- mkReg (tagged Invalid); + Reg #(Maybe #(Interrupt)) rg_m_halt_req <- mkConfigReg (tagged Invalid); function Action fa_step_check; action @@ -1234,7 +1235,7 @@ module mkRenameStage#(RenameInput inIfc)(RenameStage); `endif `ifdef INCLUDE_GDB_CONTROL - method Action debug_halt_req () if (rg_m_halt_req == tagged Invalid); + method Action debug_halt_req (); rg_m_halt_req <= tagged Valid intrDebugHalt; if (verbosity >= 1) $display ("%0d: %m.renameStage.renameStage.debug_halt_req", cur_cycle); From 5f5e391e3232d944cddf67f1e769f6ccc45ac4a6 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Thu, 9 Feb 2023 14:20:13 +0000 Subject: [PATCH 23/44] Connect ndm reset up in src_SSITH_P3 build --- src_SSITH_P3/src_BSV/P3_Core.bsv | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src_SSITH_P3/src_BSV/P3_Core.bsv b/src_SSITH_P3/src_BSV/P3_Core.bsv index 4de67b9..a20f371 100644 --- a/src_SSITH_P3/src_BSV/P3_Core.bsv +++ b/src_SSITH_P3/src_BSV/P3_Core.bsv @@ -177,6 +177,11 @@ module mkP3_Core (P3_Core_IFC); `ifdef INCLUDE_GDB_CONTROL + (* no_implicit_conditions, fire_when_enabled *) + rule rl_forward_debug_reset (otherRst); + ndm_reset_controller.assertReset(); + endrule + // ================================================================ // Instantiate JTAG TAP controller, // connect to corew.dmi; From a7c2a556c8c659b7c3950a04e9abe369386548c0 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Wed, 15 Feb 2023 16:15:07 +0000 Subject: [PATCH 24/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index dcd5e78..a0c1fe8 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit dcd5e785a06a33a42558f701b9d5d7def8742482 +Subproject commit a0c1fe8f2fffb7aab4b7c654dd4a3f114e89f488 From ba1ac6892af48e51576b31916fcb29fe2a27bc97 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Thu, 16 Feb 2023 12:22:05 +0000 Subject: [PATCH 25/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index a0c1fe8..0d9f495 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit a0c1fe8f2fffb7aab4b7c654dd4a3f114e89f488 +Subproject commit 0d9f495a564a8d93ff0f484d198ebdbca50b717e From e981b7625fcf9d0d7b81080790abdd6a631be713 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Thu, 16 Feb 2023 16:41:00 +0000 Subject: [PATCH 26/44] Ban illegal JALR and Br encodings --- src_Core/RISCY_OOO/procs/lib/Decode.bsv | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src_Core/RISCY_OOO/procs/lib/Decode.bsv b/src_Core/RISCY_OOO/procs/lib/Decode.bsv index b9d84df..11b2821 100644 --- a/src_Core/RISCY_OOO/procs/lib/Decode.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Decode.bsv @@ -519,6 +519,8 @@ function DecodeResult decode(Instruction inst, Bool cap_mode); dInst.csr = tagged Invalid; dInst.execFunc = tagged Br AT; + if (funct3 != 0) illegalInst = True; + dInst.capChecks.check_enable = True; dInst.capChecks.check_low_src = Src1Addr; dInst.capChecks.check_high_src = Src1AddrPlus2; @@ -542,14 +544,18 @@ function DecodeResult decode(Instruction inst, Bool cap_mode); opcBranch: begin dInst.iType = Br; - dInst.execFunc = tagged Br (case(funct3) - fnBEQ: Eq; - fnBNE: Neq; - fnBLT: Lt; - fnBLTU: Ltu; - fnBGE: Ge; - fnBGEU: Geu; - endcase); + ExecFunc execFunc = ?; + {illegalInst, execFunc} = case(funct3) + fnBEQ: tuple2(False, Br(Eq)); + fnBNE: tuple2(False, Br(Neq)); + fnBLT: tuple2(False, Br(Lt)); + fnBLTU: tuple2(False, Br(Ltu)); + fnBGE: tuple2(False, Br(Ge)); + fnBGEU: tuple2(False, Br(Geu)); + default: tuple2(True, Br(?)); + endcase; + dInst.execFunc = execFunc; + regs.dst = Invalid; regs.src1 = Valid(tagged Gpr rs1); regs.src2 = Valid(tagged Gpr rs2); From 93180fbe252e3436def3c0dfca6d725e5b05d1cc Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Fri, 17 Feb 2023 11:16:20 +0000 Subject: [PATCH 27/44] Revert "Use wide to narrow AXI4 shim" This reverts commit be91801982c21fe75927603093d5b44bdf6939d9. --- src_SSITH_P3/src_BSV/P3_Core.bsv | 19 ++++++++++--------- src_Testbench/SoC/SoC_Top.bsv | 22 ++++++++++++---------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src_SSITH_P3/src_BSV/P3_Core.bsv b/src_SSITH_P3/src_BSV/P3_Core.bsv index a20f371..12b2411 100644 --- a/src_SSITH_P3/src_BSV/P3_Core.bsv +++ b/src_SSITH_P3/src_BSV/P3_Core.bsv @@ -32,7 +32,6 @@ import Vector :: *; import GetPut_Aux :: *; import Routable :: *; -import BlueBasics :: *; import BlueAXI4 :: *; import SourceSink :: *; import WindCoreInterface :: *; @@ -167,13 +166,15 @@ module mkP3_Core (P3_Core_IFC); <- mkCoreW_reset (dm_power_on_reset, reset_by ndm_reset); match {.otherRst, .corew} = both; // AXI4 Narrower Master in front of cached memory master - NumProxy #(4) proxyInDepth = error ("don't look inside a proxy"); - NumProxy #(4) proxyOutDepth = error ("don't look inside a proxy"); - Tuple2 #( AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) - , AXI4_Master #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) ) - wideS_narrowM <- mkAXI4DataWidthShim_WideToNarrow (proxyInDepth, proxyOutDepth); - match {.wideS, .narrowM} = wideS_narrowM; - mkConnection(corew.manager_0, wideS); + AXI4_Shim#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) + manager_0_narrow <- mkAXI4ShimFF; + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,4), 0, 0, 0, 0, 0) + manager_0_wide_a <- toWider_AXI4_Slave(manager_0_narrow.slave); + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,2), 0, 0, 0, 0, 0) + manager_0_wide_b <- toWider_AXI4_Slave(manager_0_wide_a); + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + manager_0_wide <- toWider_AXI4_Slave(manager_0_wide_b); + mkConnection(corew.manager_0,manager_0_wide); `ifdef INCLUDE_GDB_CONTROL @@ -270,7 +271,7 @@ module mkP3_Core (P3_Core_IFC); // ================================================================ // INTERFACE - let master0_sig <- toAXI4_Master_Sig (narrowM); + let master0_sig <- toAXI4_Master_Sig (manager_0_narrow.master); let master1_sig <- toAXI4_Master_Sig (corew.manager_1); // ---------------------------------------------------------------- // Core CPU interfaces diff --git a/src_Testbench/SoC/SoC_Top.bsv b/src_Testbench/SoC/SoC_Top.bsv index af9779c..78b843d 100644 --- a/src_Testbench/SoC/SoC_Top.bsv +++ b/src_Testbench/SoC/SoC_Top.bsv @@ -46,8 +46,8 @@ import Vector :: *; import Cur_Cycle :: *; import GetPut_Aux :: *; import Routable :: *; -import BlueBasics :: *; -import BlueAXI4 :: *; +import AXI4 :: *; +import AXI4Lite :: *; // ================================================================ // Project imports @@ -163,13 +163,15 @@ module mkSoC_Top #(Reset dm_power_on_reset) mem0_controller_axi4_deburster <- mkBurstToNoBurst; // AXI4 Narrower Master in front of cached memory master - NumProxy #(4) proxyInDepth = error ("don't look inside a proxy"); - NumProxy #(4) proxyOutDepth = error ("don't look inside a proxy"); - Tuple2 #( AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) - , AXI4_Master #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) ) - wideS_narrowM <- mkAXI4DataWidthShim_WideToNarrow (proxyInDepth, proxyOutDepth); - match {.wideS, .narrowM} = wideS_narrowM; - mkConnection(corew.manager_0, wideS); + AXI4_Shim#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) + manager_0_narrow <- mkAXI4ShimFF; + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,4), 0, 0, 0, 0, 0) + manager_0_wide_a <- toWider_AXI4_Slave(manager_0_narrow.slave); + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,2), 0, 0, 0, 0, 0) + manager_0_wide_b <- toWider_AXI4_Slave(manager_0_wide_a); + AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + manager_0_wide <- toWider_AXI4_Slave(manager_0_wide_b); + mkConnection(corew.manager_0,manager_0_wide); // SoC IPs UART_IFC uart0 <- mkUART; @@ -188,7 +190,7 @@ module mkSoC_Top #(Reset dm_power_on_reset) master_vector = newVector; // CPU IMem master to fabric - master_vector[imem_master_num] = narrowM; + master_vector[imem_master_num] = manager_0_narrow.master; // CPU DMem master to fabric master_vector[dmem_master_num] = corew.manager_1; From 974171db011540fe78e18d580572e41629243795 Mon Sep 17 00:00:00 2001 From: gameboo Date: Mon, 20 Feb 2023 21:34:17 +0000 Subject: [PATCH 28/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 0d9f495..74b8528 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 0d9f495a564a8d93ff0f484d198ebdbca50b717e +Subproject commit 74b85286a83286bf8dbdda9a45c6552f79a6dcdb From aa68739ab615c084c137560f9c03e912492d8fa0 Mon Sep 17 00:00:00 2001 From: gameboo Date: Thu, 23 Feb 2023 14:51:24 +0000 Subject: [PATCH 29/44] Update imports in CoreW --- src_Core/Core/CoreW.bsv | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src_Core/Core/CoreW.bsv b/src_Core/Core/CoreW.bsv index 202b322..8ddb2a3 100644 --- a/src_Core/Core/CoreW.bsv +++ b/src_Core/Core/CoreW.bsv @@ -66,8 +66,7 @@ import Clocks :: *; import Cur_Cycle :: *; import GetPut_Aux :: *; import Routable :: *; -import AXI4 :: *; -import AXI4Lite :: *; +import BlueAXI4 :: *; import SourceSink :: *; import TagControllerAXI :: *; import CacheCore :: *; From 4187f8be5bf71d10d054343653981ffdf2babbe6 Mon Sep 17 00:00:00 2001 From: gameboo Date: Thu, 23 Feb 2023 14:51:54 +0000 Subject: [PATCH 30/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 74b8528..81a5851 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 74b85286a83286bf8dbdda9a45c6552f79a6dcdb +Subproject commit 81a5851177e780c1a40ce80fdfb27af9eb4085d5 From f2551938414be708d56c9d241054ff7de5766da5 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Tue, 28 Feb 2023 13:28:29 +0000 Subject: [PATCH 31/44] Vastly simplified DMA Connect that does not buffer data at all. This has not been tested yet, but it builds. --- .../RISCY_OOO/procs/lib/LLCDmaConnect.bsv | 223 +++--------------- 1 file changed, 37 insertions(+), 186 deletions(-) diff --git a/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv b/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv index 0f9b2af..6609040 100644 --- a/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv +++ b/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv @@ -79,9 +79,7 @@ import ProcTypes::*; import CacheUtils::*; import CCTypes::*; import L2Tlb::*; -import MemLoader::*; import CrossBar::*; -import MemLoader::*; // ---------------- // From Toooba @@ -101,7 +99,7 @@ typedef struct { } TlbDmaReqId deriving(Bits, Eq, FShow); typedef union tagged { - MemLoaderMemReqId MemLoader; + void Client; TlbDmaReqId Tlb; } LLCDmaReqId deriving(Bits, Eq, FShow); @@ -128,8 +126,6 @@ endfunction // ================================================================ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc - // REPLACED BY AXI4_Slave_interface - //, MemLoaderMemClient memLoader , Vector#(CoreNum, TlbMemClient) tlb ) (AXI4_Slave #( Wd_CoreW_Bus_SId, Wd_Addr, Wd_Data_Periph , Wd_AW_User_Periph, Wd_W_User_Periph, Wd_B_User_Periph @@ -139,68 +135,60 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc Integer verbosity = 0; - // When debugger reads a word, request a line from LLC, and remember dword-in-line here - FIFOF #(Bit #(3)) f_dword_in_line <- mkFIFOF; - // Connector to AXI4 fabric let slavePortShim <- mkAXI4ShimFF; - // ================================================================ - // These regs are a 1-location local cache for an LLC Cache Line, - // to avoid doing a full read-modify-write to the LLC on each transaction. - - Reg #(Cacheline_Cache_State) rg_cacheline_cache_state <- mkReg (CACHELINE_CACHE_CLEAN); - Reg #(Addr) rg_cacheline_cache_addr <- mkReg (1); // never matches an LLC line addr - Reg #(Line) rg_cacheline_cache_data <- mkRegU; - - // Writeback dirty cacheline_cache if no new store requests within n-cycles - Reg #(Bit #(10)) rg_cacheline_cache_dirty_delay <- mkReg (0); - // ================================================================ // Write transactions from the external client (e.g., Debug Module) - // Respond to store-requests from the external client on store-hit - rule rl_handle_MemLoader_st_req ( ( (rg_cacheline_cache_state == CACHELINE_CACHE_CLEAN) - || (rg_cacheline_cache_state == CACHELINE_CACHE_DIRTY)) - && (fn_addr_is_in_line (slavePortShim.master.aw.peek.awaddr, - rg_cacheline_cache_addr))); + rule rl_client_st; let wr_addr <- get (slavePortShim.master.aw); let wr_data <- get (slavePortShim.master.w); - // Modify relevant bytes of relevant dword - let newLine = setDataAtBE( rg_cacheline_cache_data - , getCLineDataSel(wr_addr.awaddr) - , wr_data.wdata, unpack(pack(wr_data.wstrb))); - // Save it - rg_cacheline_cache_data <= newLine; - rg_cacheline_cache_state <= CACHELINE_CACHE_DIRTY; - rg_cacheline_cache_dirty_delay <= '1; // start write-back delay countdown + if (verbosity >= 2) begin + $display ("%0d: %m.rl_client_st for addr %0h", cur_cycle, wr_addr.awaddr); + end + + let line_addr = fn_align_addr_to_line (wr_addr.awaddr); + Vector#(TDiv#(CLineDataNumBytes,8), Bit#(TDiv#(Wd_Data_Periph,8))) line_be = replicate(0); + line_be[getCLineDataSel(wr_addr.awaddr)] = wr_data.wstrb; + dmaRqT req = DmaRq {addr: line_addr, + byteEn: unpack(pack(line_be)), + data: setDataAt(unpack(0), getCLineDataSel(wr_addr.awaddr), wr_data.wdata), + id: tagged Client}; // TODO: change uniformly to wr_addr.awid + llc.memReq.enq (req); // Send response to external client slavePortShim.master.b.put(AXI4_BFlit{ - bid: wr_addr.awid, // TODO: change uniformly to Fabric_id + bid: wr_addr.awid, bresp: OKAY, buser: ? }); - - if (verbosity >= 2) begin - $display ("%0d: %m.rl_handle_MemLoader_st_req: addr %0h data %0h strb %0h", - cur_cycle, wr_addr.awaddr, wr_data.wdata, wr_data.wstrb); - //$display (" old_dword: %0h", old_dword); - //$display (" new_dword: %0h", old_dword); - end endrule // ================================================================ // Read transactions from the external memory client (e.g., Debug Module) - // Responds to load-requests from the external client on load-hit - rule rl_handle_MemLoader_ld_req ( ( (rg_cacheline_cache_state == CACHELINE_CACHE_CLEAN) - || (rg_cacheline_cache_state == CACHELINE_CACHE_DIRTY)) - && (fn_addr_is_in_line (slavePortShim.master.ar.peek.araddr, - rg_cacheline_cache_addr))); + rule rl_client_ld_req; + let line_addr = fn_align_addr_to_line (slavePortShim.master.ar.peek.araddr); + dmaRqT req = DmaRq {addr: line_addr, + byteEn: replicate(replicate(False)), // all False means 'read' + data: ?, + id: tagged Client}; // TODO: change uniformly to wr_addr.awid + llc.memReq.enq (req); + + if (verbosity >= 2) begin + $display ("%0d: %m.rl_client_ld_req: line_addr %0h", cur_cycle, line_addr); + end + endrule + + // Finish reload + rule rl_client_ld_rsp (llc.respLd.first.id matches tagged Client); + let resp = llc.respLd.first; + llc.respLd.deq; + let rd_addr <- get (slavePortShim.master.ar); - let dword = getDataAt( rg_cacheline_cache_data + let dword = getDataAt( resp.data , getCLineDataSel(rd_addr.araddr)); // Send response to external client @@ -213,145 +201,11 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc }); if (verbosity >= 2) begin - $display ("%0d: %m.rl_handle_MemLoader_ld_req: addr %0h", cur_cycle, rd_addr.araddr); + $display ("%0d: %m.rl_client_ld_rsp: addr %0h", cur_cycle, rd_addr.araddr); $display (" dword: %0h", dword); end endrule - // ---------------------------------------------------------------- - // Miss and writeback processing - - // Maintain dirty delay countdown - rule rl_cacheline_cache_writeback_dirty_delay ( (rg_cacheline_cache_state == CACHELINE_CACHE_DIRTY) - && (rg_cacheline_cache_dirty_delay != 0)); - rg_cacheline_cache_dirty_delay <= rg_cacheline_cache_dirty_delay - 1; - endrule - - function Action fa_writeback; - action - dmaRqT req = DmaRq {addr: rg_cacheline_cache_addr, - byteEn: replicate(replicate(True)), // Write all bytes - data: rg_cacheline_cache_data, - id: tagged MemLoader (?) // TODO: use wr_addr.awid? - }; - llc.memReq.enq (req); - // $display ("%0d: %m.fa_writeback line at %0h", cur_cycle, rg_cacheline_cache_addr); - // $display (" data %0128h", rg_cacheline_cache_data); - endaction - endfunction - - // Initiate writeback if dirty for full delay - rule rl_cacheline_cache_writeback_dirty_aged ( (rg_cacheline_cache_state == CACHELINE_CACHE_DIRTY) - && (rg_cacheline_cache_dirty_delay == 0)); - if (verbosity >= 2) begin - $display ("%0d: %m.rl_cacheline_cache_writeback_dirty_aged.", cur_cycle); - $display (" Old line addr %0h", rg_cacheline_cache_addr); - end - - fa_writeback; - rg_cacheline_cache_state <= CACHELINE_CACHE_WRITING_BACK; - endrule - - // Initiate writeback if dirty and next request is store-miss - rule rl_cacheline_cache_writeback_st_miss ( (rg_cacheline_cache_state == CACHELINE_CACHE_DIRTY) - && (! fn_addr_is_in_line (slavePortShim.master.aw.peek.awaddr, - rg_cacheline_cache_addr))); - if (verbosity >= 2) begin - $display ("%0d: %m.rl_cacheline_cache_writeback_st_miss.", cur_cycle); - $display (" Old line addr %0h", rg_cacheline_cache_addr); - $display (" New addr %0h", slavePortShim.master.aw.peek.awaddr); - end - - fa_writeback; - rg_cacheline_cache_state <= CACHELINE_CACHE_WRITING_BACK; - endrule - - // Initiate writeback if dirty and next request is load-miss - rule rl_cacheline_cache_writeback_ld_miss ( (rg_cacheline_cache_state == CACHELINE_CACHE_DIRTY) - && (! fn_addr_is_in_line (slavePortShim.master.ar.peek.araddr, - rg_cacheline_cache_addr))); - if (verbosity >= 2) begin - $display ("%0d: %m.rl_cacheline_cache_writeback_ld_miss.", cur_cycle); - $display (" Old line addr %0h", rg_cacheline_cache_addr); - $display (" New addr %0h", slavePortShim.master.aw.peek.awaddr); - end - - fa_writeback; - rg_cacheline_cache_state <= CACHELINE_CACHE_WRITING_BACK; - endrule - - // Finish writeback - rule rl_cacheline_cache_writeback_finish (llc.respSt.first matches tagged MemLoader .id - &&& (rg_cacheline_cache_state == CACHELINE_CACHE_WRITING_BACK)); - let resp = llc.respSt.first; - llc.respSt.deq; - rg_cacheline_cache_state <= CACHELINE_CACHE_CLEAN; - - if (verbosity >= 2) begin - $display ("%0d: %m.rl_cacheline_cache_writeback_finish. Line addr %0h", - cur_cycle, rg_cacheline_cache_addr); - $display (" Line data %0h", rg_cacheline_cache_data); - end - endrule - - function Action fa_initiate_reload (Addr addr); - action - let line_addr = fn_align_addr_to_line (addr); - dmaRqT req = DmaRq {addr: line_addr, - byteEn: replicate(replicate(False)), // all False means 'read' - data: ?, - id: tagged MemLoader (?)}; // TODO: change uniformly to wr_addr.awid - llc.memReq.enq (req); - rg_cacheline_cache_addr <= line_addr; - - if (verbosity >= 2) begin - $display (" fa_initiate_reload: line_addr %0h", line_addr); - end - endaction - endfunction - - // Initiate reload when cacheline_cache is clean on store-miss - rule rl_cacheline_cache_reload_req_st ( (rg_cacheline_cache_state == CACHELINE_CACHE_CLEAN) - && (! fn_addr_is_in_line (slavePortShim.master.aw.peek.awaddr, - rg_cacheline_cache_addr))); - let addr = slavePortShim.master.aw.peek.awaddr; - - if (verbosity >= 2) begin - $display ("%0d: %m.rl_cacheline_cache_reload_req_st for addr %0h", cur_cycle, addr); - end - - fa_initiate_reload (addr); - rg_cacheline_cache_state <= CACHELINE_CACHE_RELOADING; - endrule - - // Initiate reload when cacheline_cache is clean on load-miss - rule rl_cacheline_cache_reload_req_ld ( (rg_cacheline_cache_state == CACHELINE_CACHE_CLEAN) - && (! fn_addr_is_in_line (slavePortShim.master.ar.peek.araddr, - rg_cacheline_cache_addr))); - let addr = slavePortShim.master.ar.peek.araddr; - - if (verbosity >= 2) begin - $display ("%0d: %m.rl_cacheline_cache_reload_req_ld for addr %0h", cur_cycle, addr); - end - - fa_initiate_reload (addr); - rg_cacheline_cache_state <= CACHELINE_CACHE_RELOADING; - endrule - - // Finish reload - rule rl_cacheline_cache_reload_finish (llc.respLd.first.id matches tagged MemLoader .id - &&& (rg_cacheline_cache_state == CACHELINE_CACHE_RELOADING)); - let resp = llc.respLd.first; - llc.respLd.deq; - rg_cacheline_cache_state <= CACHELINE_CACHE_CLEAN; - rg_cacheline_cache_data <= resp.data; - - if (verbosity >= 2) begin - $display ("%0d: %m.rl_cacheline_cache_reload_finish. Line addr %0h", cur_cycle, rg_cacheline_cache_addr); - $display (" Line data %0h", resp.data); - end - endrule - // ================================================================ // Transactions from the TLB // Expecting only LOAD requests from TLB @@ -384,11 +238,8 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc endfunction // Prioritize external mem client over Tlb - (* descending_urgency = "rl_cacheline_cache_writeback_dirty_aged, sendTlbReqToLLC" *) - (* descending_urgency = "rl_cacheline_cache_writeback_st_miss, sendTlbReqToLLC" *) - (* descending_urgency = "rl_cacheline_cache_writeback_ld_miss, sendTlbReqToLLC" *) - (* descending_urgency = "rl_cacheline_cache_reload_req_st, sendTlbReqToLLC" *) - (* descending_urgency = "rl_cacheline_cache_reload_req_ld, sendTlbReqToLLC" *) + (* descending_urgency = "rl_client_st, sendTlbReqToLLC" *) + (* descending_urgency = "rl_client_ld_req, sendTlbReqToLLC" *) rule sendTlbReqToLLC; let {c, r} <- toGet(tlbQ).get; From 2047a85b27b824227377ad3d3871c7ad809692f7 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Tue, 28 Feb 2023 14:55:20 +0000 Subject: [PATCH 32/44] Fixes for the simplified debug unit DMA port --- src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv b/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv index 6609040..73bc2ab 100644 --- a/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv +++ b/src_Core/RISCY_OOO/procs/lib/LLCDmaConnect.bsv @@ -141,10 +141,14 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc // ================================================================ // Write transactions from the external client (e.g., Debug Module) + let internal_aw_ff <- mkFIFO; + rule rl_client_st; let wr_addr <- get (slavePortShim.master.aw); let wr_data <- get (slavePortShim.master.w); + internal_aw_ff.enq(wr_addr); + if (verbosity >= 2) begin $display ("%0d: %m.rl_client_st for addr %0h", cur_cycle, wr_addr.awaddr); end @@ -157,6 +161,11 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc data: setDataAt(unpack(0), getCLineDataSel(wr_addr.awaddr), wr_data.wdata), id: tagged Client}; // TODO: change uniformly to wr_addr.awid llc.memReq.enq (req); + endrule + + rule rl_client_st_rsp(llc.respSt.first matches tagged Client); + llc.respSt.deq; + let wr_addr <- get (internal_aw_ff); // Send response to external client slavePortShim.master.b.put(AXI4_BFlit{ @@ -169,8 +178,12 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc // ================================================================ // Read transactions from the external memory client (e.g., Debug Module) + let internal_ar_ff <- mkFIFO; + rule rl_client_ld_req; - let line_addr = fn_align_addr_to_line (slavePortShim.master.ar.peek.araddr); + let rd_addr <- get (slavePortShim.master.ar); + internal_ar_ff.enq(rd_addr); + let line_addr = fn_align_addr_to_line (rd_addr.araddr); dmaRqT req = DmaRq {addr: line_addr, byteEn: replicate(replicate(False)), // all False means 'read' data: ?, @@ -187,7 +200,7 @@ module mkLLCDmaConnect #( DmaServer#(LLCDmaReqId) llc let resp = llc.respLd.first; llc.respLd.deq; - let rd_addr <- get (slavePortShim.master.ar); + let rd_addr <- get (internal_ar_ff); let dword = getDataAt( resp.data , getCLineDataSel(rd_addr.araddr)); From ece8955595ef51573e66ed4e91e425d5e5563b27 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Tue, 28 Feb 2023 23:02:08 +0000 Subject: [PATCH 33/44] Prevent reads to addresses with outstanding writes Untested --- src_Core/CPU/LLC_AXI4_Adapter.bsv | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src_Core/CPU/LLC_AXI4_Adapter.bsv b/src_Core/CPU/LLC_AXI4_Adapter.bsv index 94a3a0c..956ea85 100644 --- a/src_Core/CPU/LLC_AXI4_Adapter.bsv +++ b/src_Core/CPU/LLC_AXI4_Adapter.bsv @@ -48,6 +48,10 @@ import SourceSink :: *; import Fabric_Defs :: *; import SoC_Map :: *; +import VnD :: *; +import Bag :: *; +import ProcTypes :: *; + // ================================================================ interface LLC_AXI4_Adapter_IFC; @@ -67,6 +71,9 @@ typedef struct { childT child; // from which child } LLC_AXI_ID#(type idT, type childT) deriving(Bits, Eq, FShow); +typedef 16 OutstandingWrites; +typedef 16 WriteAddressHashW; + module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) (LLC_AXI4_Adapter_IFC) provisos(Bits#(idT, idSz), @@ -87,7 +94,9 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) let masterPortShim <- mkAXI4ShimFF; // For discarding write-responses - CreditCounter_IFC #(4) ctr_wr_rsps_pending <- mkCreditCounter; // 16 outstanding writes. + CreditCounter_IFC #(TLog#(OutstandingWrites)) ctr_wr_rsps_pending <- mkCreditCounter; // 16 outstanding writes. + + Bag#(OutstandingWrites, Bit#(Wd_MId), Bit#(WriteAddressHashW)) outstandingWrites <- mkSmallBag; // ================================================================ // Functions to interact with the fabric @@ -120,7 +129,7 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) // ================================================================ // Handle read requests and responses - rule rl_handle_read_req (llc.toM.first matches tagged Ld .ld); + rule rl_handle_read_req (llc.toM.first matches tagged Ld .ld &&& !outstandingWrites.dataMatch(hash(ld.addr[63:6]))); if ((cfg_verbosity > 0)) begin $display ("%0d: LLC_AXI4_Adapter.rl_handle_read_req: Ld request from LLC to memory", cur_cycle); @@ -161,7 +170,7 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) // ================================================================ // Handle write requests and responses Reg#(Bit#(Wd_MId)) wid_reg <- mkRegU; - rule rl_handle_write_req (llc.toM.first matches tagged Wb .wb); + rule rl_handle_write_req (llc.toM.first matches tagged Wb .wb &&& !outstandingWrites.isMember(wid_reg).v); if (cfg_verbosity > 0) begin $display ("%d: LLC_AXI4_Adapter.rl_handle_write_req: Wb request from LLC to memory:", cur_cycle); $display (" ", fshow (wb)); @@ -182,6 +191,7 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) awuser: 0}); // Expect a fabric response ctr_wr_rsps_pending.incr; + outstandingWrites.insert(wid_reg, hash(wb.addr[63:6])); wid_reg <= wid_reg + 1; // Best effort to use unique IDs to allow reordering in the fabric. llc.toM.deq; @@ -209,6 +219,7 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) end ctr_wr_rsps_pending.decr; + outstandingWrites.remove(wr_resp.bid); if (wr_resp.bresp != OKAY) begin // TODO: need to raise a non-maskable interrupt (NMI) here @@ -222,7 +233,9 @@ module mkLLC_AXi4_Adapter #(MemFifoClient #(idT, childT) llc) // INTERFACE method Action reset; - ctr_wr_rsps_pending.clear; + error("Reset called for LLC AXI4 adapter"); + // XXX resetting this module would cause wedges unless the surrounding + // fabric was also fully reset endmethod // Fabric interface for memory From 43257bf4dcc7188065d63876f627ae298f335047 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Wed, 1 Mar 2023 13:41:01 +0000 Subject: [PATCH 34/44] Bump tag controller. --- libs/TagController | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/TagController b/libs/TagController index d0fca21..720ee78 160000 --- a/libs/TagController +++ b/libs/TagController @@ -1 +1 @@ -Subproject commit d0fca216babe2fcbab4cf63635d1e82384200d2c +Subproject commit 720ee78f5812b511ec8734a8354b79771f37fd4b From eb755801eb87645f2fea29ef3fe48d52028048d8 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Wed, 1 Mar 2023 14:38:13 +0000 Subject: [PATCH 35/44] Revert "Revert "Use wide to narrow AXI4 shim"" This reverts commit 93180fbe252e3436def3c0dfca6d725e5b05d1cc. --- src_SSITH_P3/src_BSV/P3_Core.bsv | 19 +++++++++---------- src_Testbench/SoC/SoC_Top.bsv | 22 ++++++++++------------ 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src_SSITH_P3/src_BSV/P3_Core.bsv b/src_SSITH_P3/src_BSV/P3_Core.bsv index 12b2411..a20f371 100644 --- a/src_SSITH_P3/src_BSV/P3_Core.bsv +++ b/src_SSITH_P3/src_BSV/P3_Core.bsv @@ -32,6 +32,7 @@ import Vector :: *; import GetPut_Aux :: *; import Routable :: *; +import BlueBasics :: *; import BlueAXI4 :: *; import SourceSink :: *; import WindCoreInterface :: *; @@ -166,15 +167,13 @@ module mkP3_Core (P3_Core_IFC); <- mkCoreW_reset (dm_power_on_reset, reset_by ndm_reset); match {.otherRst, .corew} = both; // AXI4 Narrower Master in front of cached memory master - AXI4_Shim#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) - manager_0_narrow <- mkAXI4ShimFF; - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,4), 0, 0, 0, 0, 0) - manager_0_wide_a <- toWider_AXI4_Slave(manager_0_narrow.slave); - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,2), 0, 0, 0, 0, 0) - manager_0_wide_b <- toWider_AXI4_Slave(manager_0_wide_a); - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) - manager_0_wide <- toWider_AXI4_Slave(manager_0_wide_b); - mkConnection(corew.manager_0,manager_0_wide); + NumProxy #(4) proxyInDepth = error ("don't look inside a proxy"); + NumProxy #(4) proxyOutDepth = error ("don't look inside a proxy"); + Tuple2 #( AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + , AXI4_Master #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) ) + wideS_narrowM <- mkAXI4DataWidthShim_WideToNarrow (proxyInDepth, proxyOutDepth); + match {.wideS, .narrowM} = wideS_narrowM; + mkConnection(corew.manager_0, wideS); `ifdef INCLUDE_GDB_CONTROL @@ -271,7 +270,7 @@ module mkP3_Core (P3_Core_IFC); // ================================================================ // INTERFACE - let master0_sig <- toAXI4_Master_Sig (manager_0_narrow.master); + let master0_sig <- toAXI4_Master_Sig (narrowM); let master1_sig <- toAXI4_Master_Sig (corew.manager_1); // ---------------------------------------------------------------- // Core CPU interfaces diff --git a/src_Testbench/SoC/SoC_Top.bsv b/src_Testbench/SoC/SoC_Top.bsv index 78b843d..af9779c 100644 --- a/src_Testbench/SoC/SoC_Top.bsv +++ b/src_Testbench/SoC/SoC_Top.bsv @@ -46,8 +46,8 @@ import Vector :: *; import Cur_Cycle :: *; import GetPut_Aux :: *; import Routable :: *; -import AXI4 :: *; -import AXI4Lite :: *; +import BlueBasics :: *; +import BlueAXI4 :: *; // ================================================================ // Project imports @@ -163,15 +163,13 @@ module mkSoC_Top #(Reset dm_power_on_reset) mem0_controller_axi4_deburster <- mkBurstToNoBurst; // AXI4 Narrower Master in front of cached memory master - AXI4_Shim#(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) - manager_0_narrow <- mkAXI4ShimFF; - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,4), 0, 0, 0, 0, 0) - manager_0_wide_a <- toWider_AXI4_Slave(manager_0_narrow.slave); - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, TDiv#(Wd_Data,2), 0, 0, 0, 0, 0) - manager_0_wide_b <- toWider_AXI4_Slave(manager_0_wide_a); - AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) - manager_0_wide <- toWider_AXI4_Slave(manager_0_wide_b); - mkConnection(corew.manager_0,manager_0_wide); + NumProxy #(4) proxyInDepth = error ("don't look inside a proxy"); + NumProxy #(4) proxyOutDepth = error ("don't look inside a proxy"); + Tuple2 #( AXI4_Slave #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data, 0, 0, 0, 0, 0) + , AXI4_Master #(TAdd#(Wd_MId,1), Wd_Addr, Wd_Data_Periph, 0, 0, 0, 0, 0) ) + wideS_narrowM <- mkAXI4DataWidthShim_WideToNarrow (proxyInDepth, proxyOutDepth); + match {.wideS, .narrowM} = wideS_narrowM; + mkConnection(corew.manager_0, wideS); // SoC IPs UART_IFC uart0 <- mkUART; @@ -190,7 +188,7 @@ module mkSoC_Top #(Reset dm_power_on_reset) master_vector = newVector; // CPU IMem master to fabric - master_vector[imem_master_num] = manager_0_narrow.master; + master_vector[imem_master_num] = narrowM; // CPU DMem master to fabric master_vector[dmem_master_num] = corew.manager_1; From 0a3f8b881c3430feddecf6484b5c4ce35ae98668 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Thu, 2 Mar 2023 17:21:16 +0000 Subject: [PATCH 36/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 81a5851..e5d8f67 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 81a5851177e780c1a40ce80fdfb27af9eb4085d5 +Subproject commit e5d8f67a26bdeaf3934e8895d747ed86764cb058 From 2e2eb0a31d5b36197223cd450730a9bde1cc86fb Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Thu, 2 Mar 2023 21:19:49 +0000 Subject: [PATCH 37/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index e5d8f67..19e05aa 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit e5d8f67a26bdeaf3934e8895d747ed86764cb058 +Subproject commit 19e05aa796ac1e3b5ee2a4ca5c0b6a5651061a4f From c504702019f3fcf9e24c2f3ff594976911e130e5 Mon Sep 17 00:00:00 2001 From: gameboo Date: Mon, 6 Mar 2023 17:33:55 +0000 Subject: [PATCH 38/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 19e05aa..47e898b 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 19e05aa796ac1e3b5ee2a4ca5c0b6a5651061a4f +Subproject commit 47e898b114f9090977782fa49866750e19b14ac7 From 5dfedf5b4cec8e8e02de6e9635cf85cdca54d138 Mon Sep 17 00:00:00 2001 From: Jonathan Woodruff Date: Wed, 8 Mar 2023 11:30:33 +0000 Subject: [PATCH 39/44] Don't build with BSC protection by default. --- src_SSITH_P3/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/src_SSITH_P3/Makefile b/src_SSITH_P3/Makefile index d86f5e4..aad5fed 100644 --- a/src_SSITH_P3/Makefile +++ b/src_SSITH_P3/Makefile @@ -38,7 +38,6 @@ BSC_COMPILATION_FLAGS += \ -D CAP128 \ -D MEM512 \ -D RISCV \ - -D NO_SPEC_TRAINING -D NO_SPEC_REDIRECT -D NO_SPEC_STRAIGHT_PATH -D SPEC_RSB_FIXUP -D NO_SPEC_RSB_PUSH -D NO_SPEC_STL \ -D TSO_MM \ -D INCLUDE_GDB_CONTROL \ -D BRVF_TRACE \ From 08b43033e75c9cbe82d36d7c7369ad3ee205a577 Mon Sep 17 00:00:00 2001 From: gameboo Date: Thu, 9 Mar 2023 16:43:52 +0000 Subject: [PATCH 40/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 47e898b..72a9c55 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 47e898b114f9090977782fa49866750e19b14ac7 +Subproject commit 72a9c55c78b03b94e03cbd55b4b915bbbf0cd417 From 7ebe04af749320f00c0ede541a6556a2db81835c Mon Sep 17 00:00:00 2001 From: gameboo Date: Sat, 11 Mar 2023 09:10:12 +0000 Subject: [PATCH 41/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 72a9c55..87cb65a 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 72a9c55c78b03b94e03cbd55b4b915bbbf0cd417 +Subproject commit 87cb65acfaa0c13986afe19b3ed5c4b2edb23893 From 17e45eb8268af207b93737fd33052be9843f400d Mon Sep 17 00:00:00 2001 From: gameboo Date: Tue, 28 Mar 2023 08:57:34 +0100 Subject: [PATCH 42/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 87cb65a..5732bc2 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 87cb65acfaa0c13986afe19b3ed5c4b2edb23893 +Subproject commit 5732bc25d5089979a6baa35493c40355e6c1f8a7 From b50b1f931e1c127d85235599cb72cbee305b47a6 Mon Sep 17 00:00:00 2001 From: gameboo Date: Tue, 28 Mar 2023 16:48:38 +0100 Subject: [PATCH 43/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index 5732bc2..ddff9f6 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit 5732bc25d5089979a6baa35493c40355e6c1f8a7 +Subproject commit ddff9f6624d6bb07d07c0c1e73964561bdebe084 From e8f7188be0034c5727694c16fb02373149754474 Mon Sep 17 00:00:00 2001 From: gameboo Date: Tue, 4 Apr 2023 17:36:13 +0100 Subject: [PATCH 44/44] Bump BlueStuff --- libs/BlueStuff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/BlueStuff b/libs/BlueStuff index ddff9f6..f4e4e9d 160000 --- a/libs/BlueStuff +++ b/libs/BlueStuff @@ -1 +1 @@ -Subproject commit ddff9f6624d6bb07d07c0c1e73964561bdebe084 +Subproject commit f4e4e9d59fc1c165f6212646a9b4400c7ee57edf