Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 40 additions & 10 deletions src_Core/Near_Mem_VM/Near_Mem_IO.bsv
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ import ByteLane :: *;
// ================================================================
// Project imports

// None
import Fabric_Defs :: *;

// ================================================================
// Local constants and types
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down