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; }