public void translateCacheBlockTest() { //Cache L1 = new Cache(Constants.CACHE_TYPE.dL1Cache); //Cache L2 = new Cache(Constants.CACHE_TYPE.L2Cache); Cache L1 = new Cache(Constants.CACHE_TYPE.L2Cache); VL3Cache L2 = new VL3Cache(); Random rand = new Random(1); const int NUM_BLOCKS = 512; //iterator vars ulong phys36; Block L1_Block; Block L2_Block; Block Result_Block; uint L1_Tag; uint L2_Tag; ushort L1_Set; ushort L2_Set; byte L1_Offs; byte L2_Offs; for (int i = 0; i < NUM_BLOCKS; i++) { phys36 = (ulong)rand.Next(int.MaxValue); L1_Tag = CacheFieldParser.getTagFromPhysAddr(phys36, L1.TAG_WIDTH); L1_Set = CacheFieldParser.getSetIdxFromPhysAddr(phys36, L1.SET_IDX_WIDTH); L1_Offs = CacheFieldParser.getBlockOffsetFromPhysAddr(phys36); L2_Tag = CacheFieldParser.getTagFromPhysAddr(phys36, L2.TAG_WIDTH); L2_Set = CacheFieldParser.getSetIdxFromPhysAddr(phys36, L2.SET_IDX_WIDTH); L2_Offs = CacheFieldParser.getBlockOffsetFromPhysAddr(phys36); L1_Block = new Block(0, L1_Set, L1_Offs, L1_Tag); L2_Block = new Block(0, L2_Set, L2_Offs, L2_Tag); Result_Block = CacheFieldParser.translateCacheBlock(L2_Block, L2, L1); Assert.AreEqual(L1_Block.block_offset, Result_Block.block_offset); Assert.AreEqual(L1_Block.set, Result_Block.set); Assert.AreEqual(L1_Block.tag, Result_Block.tag); } }
public static Block translateCacheBlock(Block inBlock, VL3Cache Source, Cache Target) { int SourceTagWidth = Source.TAG_WIDTH; int SourceSetIdxWidth = Source.SET_IDX_WIDTH; int TargetTagWidth = Target.TAG_WIDTH; int TargetSetIdxWidth = Target.SET_IDX_WIDTH; Tuple<uint, ushort> Phys36_Pair = generatePhysicalAddr36Pair(inBlock, SourceTagWidth, SourceSetIdxWidth); ulong Phys36 = generatePhysAddr36(Phys36_Pair.Item1, Phys36_Pair.Item2); ushort SetIdx = getSetIdxFromPhysAddr(Phys36, TargetSetIdxWidth); byte BlockOffset = getBlockOffsetFromPhysAddr(Phys36); uint Tag = getTagFromPhysAddr(Phys36, TargetTagWidth); Block retBlock = new Block(0, SetIdx, BlockOffset, Tag); return retBlock; }
public void WriteBlockTest() { { Cache L1 = new Cache(Constants.CACHE_TYPE.iL1Cache); int ENTRIES = L1.SETS * L1.BANKS * 2; Block retBlock = null; Block[] blocks = new Block[ENTRIES]; Block inBlock; Block repBlock; ushort cmpr_set; uint cmpr_tag; ushort ret_set; uint ret_tag; Tuple<uint, ushort>[] Phys36 = new Tuple<uint, ushort>[ENTRIES]; Tuple<uint, ushort> inPhys; //Generate blocks and associated physical addresses for (int i = 0; i < ENTRIES; i++) { blocks[i] = new Block(i % L1.BANKS, (ushort)(i % L1.SETS), 0, (uint)(i)); Phys36[i] = CacheFieldParser.generatePhysicalAddr36Pair(blocks[i], L1.TAG_WIDTH, L1.SET_IDX_WIDTH); } //Fill cache for (int i = 0; i < ENTRIES / 2; i++) { inBlock = blocks[i]; retBlock = L1.ReplaceBlock(inBlock); Assert.AreEqual(null, retBlock); } //Write whole cache (to set dirty flag) for (int i = 0; i < ENTRIES / 2; i++) { inPhys = Phys36[i]; retBlock = L1.search(inPhys.Item1, inPhys.Item2); L1.WriteBlock(retBlock); } //Replace full cache and check if first iteration is found for (int i = 0; i < ENTRIES/2; i++) { repBlock = blocks[i+ENTRIES/2]; //2nd Gen blocks inBlock = blocks[i]; //1st gen blocks retBlock = L1.ReplaceBlock(repBlock); ret_tag = retBlock.tag; ret_set = retBlock.set; cmpr_tag = inBlock.tag; cmpr_set = inBlock.set; Assert.AreEqual(cmpr_tag, ret_tag); Assert.AreEqual(cmpr_set, ret_set); } } }
public void ReplaceBlockTest() { Cache L1 = new Cache(Constants.CACHE_TYPE.iL1Cache); int ENTRIES = L1.SETS * L1.BANKS * 2; Block retBlock = null; Block[] blocks = new Block[ENTRIES]; Block inBlock; ushort cmpr_set; uint cmpr_tag; ushort ret_set; uint ret_tag; Tuple<uint, ushort>[] Phys36 = new Tuple<uint, ushort>[ENTRIES]; Tuple<uint, ushort> inPhys; for (int i = 0; i < ENTRIES; i++) { blocks[i] = new Block(i%L1.BANKS, (ushort)(i%L1.SETS), 0, (uint)(i)); Phys36[i] = CacheFieldParser.generatePhysicalAddr36Pair(blocks[i], L1.TAG_WIDTH, L1.SET_IDX_WIDTH); } for (int i = 0; i < ENTRIES; i++) { inBlock = blocks[i]; inPhys = Phys36[i]; retBlock = L1.ReplaceBlock(inBlock); Assert.AreEqual(null, retBlock); retBlock = L1.search(inPhys.Item1, inPhys.Item2); ret_tag = retBlock.tag; ret_set = retBlock.set; cmpr_tag = inBlock.tag; cmpr_set = inBlock.set; Assert.AreEqual(cmpr_tag, ret_tag); Assert.AreEqual(cmpr_set, ret_set); } }
public void ReadBlockTest() { Cache L1 = new Cache(Constants.CACHE_TYPE.iL1Cache); uint test = StatisticsGatherer.iL1CacheAccesses; int ENTRIES = L1.SETS * L1.BANKS * 2; Block retBlock = null; Block[] blocks = new Block[ENTRIES]; Block inBlock; ushort cmpr_set; uint cmpr_tag; ushort ret_set; uint ret_tag; Tuple<uint, ushort>[] Phys36 = new Tuple<uint, ushort>[ENTRIES]; Tuple<uint, ushort> inPhys; //Generate blocks and associated physical addresses for (int i = 0; i < ENTRIES; i++) { blocks[i] = new Block(i % L1.BANKS, (ushort)(i % L1.SETS), 0, (uint)(i)); Phys36[i] = CacheFieldParser.generatePhysicalAddr36Pair(blocks[i], L1.TAG_WIDTH, L1.SET_IDX_WIDTH); } //Fill cache for (int i = 0; i < ENTRIES / 2; i++) { inBlock = blocks[i]; retBlock = L1.ReplaceBlock(inBlock); Assert.AreEqual(null, retBlock); } //Read First half for (int i = 0; i < ENTRIES / 4; i++) { inPhys = Phys36[i]; retBlock = L1.search(inPhys.Item1, inPhys.Item2); L1.ReadBlock(retBlock); } for (int i = ENTRIES / 2; i < (ENTRIES * 3 / 4); i++) { inBlock = blocks[i]; retBlock = L1.ReplaceBlock(inBlock); Assert.AreEqual(null, retBlock); } for(int i = 0; i < ENTRIES / 4; i++) { inBlock = blocks[i]; inPhys = Phys36[i]; retBlock = L1.search(inPhys.Item1, inPhys.Item2); ret_tag = retBlock.tag; ret_set = retBlock.set; cmpr_tag = inBlock.tag; cmpr_set = inBlock.set; Assert.AreEqual(cmpr_tag, ret_tag); Assert.AreEqual(cmpr_set, ret_set); } }