diff options
| author | Alejandro Soto <alejandro@34project.org> | 2023-09-24 20:58:04 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2023-09-24 22:14:57 -0600 |
| commit | 15230c6cd2190a1efd61c2758bf56de37f3fe8da (patch) | |
| tree | 9d8a04daadb4192cf4aeb44b8e86389a9ba130d3 /rtl/cache/offsets.sv | |
| parent | 146168ca340e435eae6e30e99c06d752719089e3 (diff) | |
rtl/cache: implement
Diffstat (limited to 'rtl/cache/offsets.sv')
| -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 |
