Notes 8 kB L1 Data Cache | 16 kB L1 I cache (maybe) [tag index offset_remaining_block bank wordOffset], use a blocksize of 128 bytes between memory and cache. So each bank gets 16 bytes. total offset is b its 4 bits new offset, 2 bits block, 2 bits word offset xxxxxxxIIIIIIIIoobbbyy 9876543210 bbbyyyyy o = index into block offset b = bank y = word offset I = index into cach 6 bits indexes (64 indeces) No ways || 16 indexes with 4 ways Rest of the bits are tag bits blocks / banks = 16 bytes, 8 banks. 128 bytes. 256 indexes (height). width is 16 bytes. 4 words per block (per bank). 17 bit tag gtkwave ___.vcd // Splitting it up // word byte wire[127:0][3:0] data_from_ram; // word byte bank wire[15:0][3:0] bank_data_n[3:0] integer i; for (i = 0; i < something; i+=8) { bank_data_n[0][i/8] = data_from_ram[i+0] bank_data_n[1][i/8] = data_from_ram[i+1] bank_data_n[2][i/8] = data_from_ram[i+2] bank_data_n[3][i/8] = data_from_ram[i+3] bank_data_n[4][i/8] = data_from_ram[i+4] bank_data_n[5][i/8] = data_from_ram[i+5] bank_data_n[6][i/8] = data_from_ram[i+6] bank_data_n[7][i/8] = data_from_ram[i+7] } With Cache. If miss. Go to memory, grab all data, replace that data in the cache. Generate a new request, feed that into the cache (this one will hit), return that