diff --git a/src_Core/Near_Mem_VM/Near_Mem_IO.bsv b/src_Core/Near_Mem_VM/Near_Mem_IO.bsv index 8779da60..8b6461ad 100644 --- a/src_Core/Near_Mem_VM/Near_Mem_IO.bsv +++ b/src_Core/Near_Mem_VM/Near_Mem_IO.bsv @@ -59,7 +59,7 @@ import ByteLane :: *; // ================================================================ // Project imports -// None +import Fabric_Defs :: *; // ================================================================ // Local constants and types @@ -226,8 +226,19 @@ module mkNear_Mem_IO (Near_Mem_IO_IFC); // The following ALIGN4B reads are only needed for 32b fabrics 'h_0004: rdata = 0; - 'h_4004: rdata = zeroExtend (crg_timecmp [0] [63:32]); // extends for 64b fabrics - 'h_BFFC: rdata = zeroExtend (crg_time [0] [63:32]); // extends for 64b fabrics + 'h_4004: begin + if (valueOf (Wd_Data) == 32) + rdata = zeroExtend (crg_timecmp [0] [63:32]); // 32b fabrics + else + rdata = zeroExtend (crg_timecmp [0] [63:0]); // 64b fabrics + end + 'h_BFFC: begin + if (valueOf (Wd_Data) == 32) + rdata = zeroExtend (crg_time [0] [63:32]); // 32b fabrics + else + rdata = zeroExtend (crg_time [0] [63:0]); // 64b fabrics + end + default: begin rok = False; @@ -299,13 +310,22 @@ module mkNear_Mem_IO (Near_Mem_IO_IFC); end end - // The following ALIGN4B writes are only needed for 32b fabrics 'h_0004: noAction; 'h_4004: begin Bit #(64) old_timecmp = crg_timecmp [1]; - Bit #(64) new_timecmp = fn_update_strobed_bytes (old_timecmp, - { req.wdata [31:0], 32'h0 }, - { req.wstrb [3:0], 4'h0 }); + Bit #(64) new_timecmp; + + // The following ALIGN4B writes are only needed for 32b fabrics + if (valueOf (Wd_Data) == 32) + new_timecmp = fn_update_strobed_bytes (old_timecmp, + { req.wdata [31:0], 32'h0}, + { req.wstrb [3:0], 4'h0}); + // The following writes are needed on 64b fabrics + else + new_timecmp = fn_update_strobed_bytes (old_timecmp, + { req.wdata [63:0]}, + { req.wstrb [7:4], 4'h0}); + crg_timecmp [1] <= new_timecmp; if (cfg_verbosity > 1) begin @@ -318,9 +338,19 @@ module mkNear_Mem_IO (Near_Mem_IO_IFC); end 'h_BFFC: begin Bit #(64) old_time = crg_time [1]; - Bit #(64) new_time = fn_update_strobed_bytes (old_time, - { req.wdata [31:0], 32'h0 }, - { req.wstrb [3:0], 4'h0 }); + Bit #(64) new_time; + + // The following ALIGN4B writes are only needed for 32b fabrics + if (valueOf (Wd_Data) == 32) + new_time = fn_update_strobed_bytes (old_time, + { req.wdata [31:0], 32'h0}, + { req.wstrb [3:0], 4'h0}); + // The following writes are needed on 64b fabrics + else + new_time = fn_update_strobed_bytes (old_time, + { req.wdata [63:0]}, + { req.wstrb [7:4], 4'h0}); + crg_time [1] <= new_time; if (cfg_verbosity > 1) begin