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

            }
        }
Example #2
0
        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;
        }
Example #3
0
        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);
                }

            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
            }
        }