| `default_nettype none |
| |
| `define CACHE_SETS 8 |
| `define CACHE_BLOCK_SIZE 'd16 |
| |
| `define WORD_POISON 32'hBADF00D |
| `define CACHE_PHYSICAL_TAG_POISON 22'h277BAD |
| |
| // typedef logic [5:0] CacheIndex_t; |
| // typedef logic [3:0] CacheBlockOffset_t; |
| // typedef logic [19:0] CacheVirtualTag_t; |
| // typedef logic [21:0] CachePhysicalTag_t; |
| // typedef logic [$clog2(`CACHE_SETS)-1:0] CacheSetNumber_t; |
| |
| `define CACHE_REQUEST_WIDTH 104 |
| |
| // typedef struct packed { |
| // CacheIndex_t index ; |
| // CacheBlockOffset_t blockOffset; |
| // // This field is only valid if requestType is a write |
| // CachePhysicalTag_t tag ; |
| // Word_t writeData ; |
| // CacheRequestType_t requestType; |
| // logic isValid ; |
| // logic [3:0] writeEnable; |
| // // The user must ensure that this set is safe to write to using the memory |
| // // locking system. |
| // CacheSetNumber_t writeSet; |
| // } CacheRequest_t; |
| |
| module CacheHelper ( |
| input wire [5:0] index, |
| input wire [3:0] offset, |
| output wire [`CACHE_REQUEST_WIDTH-1:0] flatRequest |
| ); |
| // CacheRequestType_t |
| parameter CACHE_READ = 32'd0; |
| parameter CACHE_WRITE = 32'd1; |
| parameter CACHE_DRAM_FILL = 32'd2; |
| |
| function [`CACHE_REQUEST_WIDTH-1:0] readRequestManual(input [5:0] index, input [3:0] offset); |
| begin |
| readRequestManual[2:0] = 4'b0; // writeSet: 32-bit literal in SV truncated to 4 bits in Verilog |
| readRequestManual[6:3] = 4'b0; // writeEnable |
| readRequestManual[7] = 1'b1; // isValid |
| readRequestManual[39:8] = CACHE_READ; // requestType |
| readRequestManual[71:40] = `WORD_POISON; // writeData |
| readRequestManual[93:72] = `CACHE_PHYSICAL_TAG_POISON; // tag |
| readRequestManual[97:94] = offset; // blockOffset |
| readRequestManual[103:98] = index; // index |
| |
| end |
| endfunction |
| |
| wire [`CACHE_REQUEST_WIDTH-1:0] request; |
| |
| assign request = readRequestManual(index, offset); |
| |
| assign flatRequest = request; |
| |
| endmodule |