diff options
Diffstat (limited to '')
| -rw-r--r-- | rtl/cache/offsets.sv | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/rtl/cache/offsets.sv b/rtl/cache/offsets.sv new file mode 100644 index 0000000..a933d1c --- /dev/null +++ b/rtl/cache/offsets.sv @@ -0,0 +1,68 @@ +`include "cache/defs.sv" + +module cache_offsets +( + input addr_offset core_offset, + input word_be core_byteenable, + input word core_writedata, + input line core_readdata_line, + data_rd, + + output line core_data_wr, + core_writedata_line, + output word core_readdata, + output line_be core_byteenable_line +); + + line line_mask; + word be_extend, mask3, mask2, mask1, mask0; + word_be be3, be2, be1, be0; + + assign core_writedata_line = {4{core_writedata}}; + assign core_byteenable_line = {be3, be2, be1, be0}; + + assign be_extend = {{8{core_byteenable[3]}}, {8{core_byteenable[2]}}, + {8{core_byteenable[1]}}, {8{core_byteenable[0]}}}; + + assign line_mask = {mask3, mask2, mask1, mask0}; + assign core_data_wr = (core_writedata_line & line_mask) | (data_rd & ~line_mask); + + always_comb begin + mask3 = 0; + mask2 = 0; + mask1 = 0; + mask0 = 0; + + be3 = 0; + be2 = 0; + be1 = 0; + be0 = 0; + + unique case (core_offset) + 2'b00: begin + be0 = core_byteenable; + mask0 = be_extend; + core_readdata = core_readdata_line[31:0]; + end + + 2'b01: begin + be1 = core_byteenable; + mask1 = be_extend; + core_readdata = core_readdata_line[63:32]; + end + + 2'b10: begin + be2 = core_byteenable; + mask2 = be_extend; + core_readdata = core_readdata_line[95:64]; + end + + 2'b11: begin + be3 = core_byteenable; + mask3 = be_extend; + core_readdata = core_readdata_line[127:96]; + end + endcase + end + +endmodule |
