Memory systems are essential to all computing platforms. To achieve optimal performance, contemporary memory architectures are hierarchically constructed with different types of memories. On-chip caches are usually built with static random-access memory (SRAM), because of their high speed; main memory uses dynamic random-access memory (DRAM); large-scale external memories leverage nonvolatile devices, such as the magnetic hard disk or solid state disk. By appropriately integrating these different technologies into the hierarchy, memory systems have traditionally tried to achieve high access speed, low energy consumption, high bit density, and reliable data storage.