Beispiel #1
0
    def test_feed_full(self):
        """Test full operation when feeding Instructions."""
        for rob_capacity in [1, 5, 25, 200]:
            for rs_capacity in [1, 5, 25, 200]:
                for lsq_capacity in [1, 5, 25, 200]:
                    register_limit = min(rob_capacity, rs_capacity)
                    memory_limit = min(rob_capacity, lsq_capacity)

                    rs = ReservationStation(capacity=rs_capacity)
                    lsq = LoadStoreQueue(self.memory,
                                         self.bus,
                                         capacity=lsq_capacity)
                    rob = ReorderBuffer(self.rf,
                                        rs,
                                        lsq,
                                        capacity=rob_capacity)

                    for _ in range(register_limit):
                        ins = self.generate_add(self.n_gpr_registers)
                        self.assertFalse(
                            rob.full(ins),
                            'ReorderBuffer should not be full after < %d feeds'
                            % register_limit)
                        rob.feed(ins)
                    self.assertTrue(
                        rob.full(self.generate_add(self.n_gpr_registers)),
                        'ReorderBuffer should be full after %d feeds' %
                        register_limit)
                    with self.assertRaises(AssertionError):
                        rob.feed(self.generate_add(self.n_gpr_registers))
Beispiel #2
0
    def test_flush(self):
        """Ensure flush of ReorderBuffer, LoadStoreQueue and ReservationStation."""
        rs = FlushableLog()
        rs.full = lambda: False
        rs.feed = lambda x: None
        lsq = FlushableLog()
        lsq.full = lambda: False
        lsq.feed = lambda x: None

        for rob_capacity in [1, 5, 25, 200]:
            for rs_capacity in [1, 5, 25, 200]:
                for lsq_capacity in [1, 5, 25, 200]:
                    register_limit = min(rob_capacity, rs_capacity)

                    rs.reset()
                    lsq.reset()
                    rob = ReorderBuffer(self.rf,
                                        rs,
                                        lsq,
                                        capacity=rob_capacity)

                    for _ in range(register_limit):
                        rob.feed(self.generate_add(self.n_gpr_registers))
                    rob.flush()
                    self.assertFalse(
                        rob.full(self.generate_add(self.n_gpr_registers)),
                        'ReorderBuffer should not be full after flush')
                    self.assertEqual(
                        rs.n_flush, 1,
                        'ReorderBuffer must flush ReservationStation')
                    self.assertEqual(
                        lsq.n_flush, 1,
                        'ReorderBuffer must flush LoadStoreQueue')