16-bit addresses ====================================================================== L1i - byte set valid dirty tag d[0] d[1] d[2] d[3] 00 0 01 0 10 0 11 0 L1d - byte set valid dirty tag d[0] d[1] d[2] d[3] 0 0 0 1 0 0 L2 - 4-byte set valid dirty tag d[0] d[1] d[2] d[3] 00 0 01 0 10 0 11 0 ====================================================================== read code from address 0x0000 - [000000000000][00][00][] ---------------------------------------------------------------------- L1i - byte miss - cold or compulsory set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 0 10 0 11 0 L1d - byte set valid dirty tag d[0] d[1] d[2] d[3] 0 0 0 1 0 0 read from address 0x0000 through 0x0003 - [0000000000][00][00][**] L2 - 4-byte miss - cold set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000 03fe12 45fae3 8e3a10 002345 01 0 10 0 11 0 ====================================================================== read data from address 0xdead - [1101 1110 1010 1][1][01][] ---------------------------------------------------------------------- L1i - byte set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 0 10 0 11 0 L1d - byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 0 0 0 1 1 0 1101111010101 67 45 23 00 0 ---------------------------------------------------------------------- read from address 0xdead - [1101 1110 10][10][11][**] ---------------------------------------------------------------------- L2 - 4-byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000 03fe12 45fae3 8e3a10 002345 01 0 10 1 0 1101111010 123456 7890ab cdef01 234567 11 0 ====================================================================== read 4 bytes of data from address 0xdead-0xdeb0 - [1101 1110 1010 1][1][01][] [1101 1110 1010 1][1][10][] [1101 1110 1010 1][1][11][] [1101 1110 1011 0][0][00][] ---------------------------------------------------------------------- L1i - byte set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 0 10 0 11 0 L1d - byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 0 1101111010101 67 45 23 00 0 ---------------------------------------------------------------------- read from address 0xdeb0 - [1101 1110 10][11][00][**] ---------------------------------------------------------------------- L2 - 4-byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000 03fe12 45fae3 8e3a10 002345 01 0 10 1 0 1101111010 123456 7890ab cdef01 234567 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd ====================================================================== char[32] data; for(int i = 0; i < 32; i += 4) data[i] = (char)i; Assume &data[0] = 1100 0011 1010 0101 1100 1111 0000 [10][11] &data[4] = 1100 0011 1010 0101 1100 1111 0000 [11][11] &data[8] = 1100 0011 1010 0101 1100 1111 0001 [00][11] &data[9] = 1100 0011 1010 0101 1100 1111 0001 [01][11] char[32] data; for(int i = 0; i < 32; i +=16) data[i] = (char)i; Assume &data[0] = 1100 0011 1010 0101 1100 1111 0000 [10][11] &data[16] = 1100 0011 1010 0101 1100 1111 0001 [10][11] &data[32] = 1100 0011 1010 0101 1100 1111 0010 [10][11] &data[64] = 1100 0011 1010 0101 1100 1111 0011 [10][11] ====================================================================== read 1 bytes of instruction from address 0x0003 - 0000 0000 0000 0011 ---------------------------------------------------------------------- L1i - byte - hit set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 0 10 0 11 0 L1d - byte set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 0 1101111010101 67 45 23 00 0 L2 - 4-byte set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000 03fe12 45fae3 8e3a10 002345 01 0 10 1 0 1101111010 123456 7890ab cdef01 234567 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd ====================================================================== read 1 bytes of instruction from address 0x0004 - 0000 0000 0000 [01][00][] ---------------------------------------------------------------------- L1i - byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 1 0 0000000000000 ab 90 78 00 10 0 11 0 L1d - byte set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 0 1101111010101 67 45 23 00 0 ---------------------------------------------------------------------- read 0x0004 - 0000 0000 00[00] [01][**] ---------------------------------------------------------------------- L2 - 4-byte - hit set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000 03fe12 45fae3 8e3a10 002345 01 0 10 1 0 1101111010 123456 7890ab cdef01 234567 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd ====================================================================== read 1 bytes of instruction from address 0x0804 - 0000 1000 0000 [01][00][] ---------------------------------------------------------------------- L1i - byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 1 0 0000100000000 22 22 22 02 10 0 11 0 L1d - byte set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 0 1101111010101 67 45 23 00 0 ---------------------------------------------------------------------- read 0x0004 - 0000 1000 00[00] [01][**] ---------------------------------------------------------------------- L2 - 4-byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0001000000 1111111 2222222 3333333 4444444 01 0 10 1 0 1101111010 123456 7890ab cdef01 234567 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd ====================================================================== read 1 bytes of instruction from address 0x0004 - 0000 0000 0000 [01][00][] ---------------------------------------------------------------------- L1i - byte - conflict miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 1 0 0000100000000 22 22 22 02 <- conflict 10 0 11 0 L1d - byte set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 0 1101111010101 67 45 23 00 0 ---------------------------------------------------------------------- read 0x0004 - 0000 0000 00[00] [01][**] ---------------------------------------------------------------------- L2 - 4-byte - conflict miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0001000000 1111111 2222222 3333333 4444444 <- conflict 01 0 10 1 0 1101111010 123456 7890ab cdef01 234567 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd ====================================================================== write 0ff to data address 0xdead - 1101 1110 1010 1[1][01][] ---------------------------------------------------------------------- L1i - byte set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 1 0 0000100000000 22 22 22 02 <- conflict 10 0 11 0 L1d - byte - hit set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 1 1101111010101 67 ff 23 00 0 L2 - 4-byte set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0001000000 1111111 2222222 3333333 4444444 <- conflict 01 0 10 1 0 1101111010 123456 7890ab cdef01 234567 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd ====================================================================== write 0ff to data address 0x0ead - 0000 1110 1010 1[1][01][] ---------------------------------------------------------------------- L1i - byte set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 1 0 0000100000000 22 22 22 02 10 0 11 0 L1d - byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 1 1101111010101 67 ff 23 00 1 1 0000111010101 90 ff 56 04 ---------------------------------------------------------------------- read 0000 1110 10[10] [11][**] ---------------------------------------------------------------------- L2 - 4-byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0001000000 1111111 2222222 3333333 4444444 01 0 10 1 0 0000111010 1234567 2345678 3456789 4567890 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd ====================================================================== read data address 0x00ad - 0000 0000 1010 1[1][01][] part 1 ---------------------------------------------------------------------- L1i - byte set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 1 0 0000100000000 22 22 22 02 10 0 11 0 L1d - byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 0 1101111010101 67 ff 23 00 1 1 0000111010101 90 ff 56 04 ---------------------------------------------------------------------- write 0x0023ff67 to 1101111010[10][11][**] ---------------------------------------------------------------------- L2 - 4-byte - conflict miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0001000000 1111111 2222222 3333333 4444444 01 0 10 1 1 1101111010 123456 7890ab cdef01 23ff67 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd ====================================================================== read data address 0x00ad - 0000 0000 1010 1[1][01][] part 2 ---------------------------------------------------------------------- L1i - byte set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0000000000000 12 fe 03 00 01 1 0 0000100000000 22 22 22 02 10 0 11 0 L1d - byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 0 1 0 1101111010110 aa aa aa 0a 0 1 1 0 0000000010101 bb bb bb 0b 1 1 0000111010101 90 ff 56 04 ---------------------------------------------------------------------- read 0000000010[10][11][**] ---------------------------------------------------------------------- L2 - 4-byte - cold miss set valid dirty tag d[0] d[1] d[2] d[3] 00 1 0 0001000000 1111111 2222222 3333333 4444444 01 0 10 1 0 0000000010 fffffff eeeeeee ddddddd bbbbbbb 11 1 0 1101111010 aaaaaaa bbbbbbb ccccccc ddddddd