Как рассчитать размер тега в битах, поле индекса для кэша процессора? - PullRequest
1 голос
/ 21 ноября 2011

Я пишу эмулятор кэша ЦП, который будет принимать размер кэша в байтах, длину каждой строки кэша в байтах и ​​ число устанавливает / группирует в кеше.

У меня есть большая часть написанного, но я часами боролся с тем, чтобы выяснить, сколько бит нужно сдвинуть влево / вправо, чтобы извлечь теги и index поля данного адреса.

Например, учитывая адрес 48 , мне нужно определить тег и индекс.

Вот что у меня есть для извлечения тега, но я почти уверен, что это неверно.

int extractTag(int address, int sets){

    int bits = exp2(sets); // number of bits to shift: 2^sets

    unsigned int tag;
    int tag = address >> (32 - bits);    

    return tag;
}

1 Ответ

1 голос
/ 04 февраля 2012

Допустим, у вас есть группы SETS строк BLOCK_SIZE. Адрес можно разделить на тег: index: смещение с битами log2 (BLOCK_SIZE) для смещения, log2 (SETS) для индекса и остальное для тега.

Вы можете рассчитать log2 следующим образом:

int ilog2 (int x)
{
    int result = 0;

    while (x != 0) {
        result++;
        x = x >> 1;
    }
    return result;
}

Таким образом, вы получите:

int extract_tag (int address, int sets, int block_size)
{
    int offset_bits = ilog2(block_size);
    int index_bits = ilog2(sets);

    int tag = address >> (index_bits + offset_bits);
    return tag;
}

int extract_index (int address, int sets, int block_size)
{
    int offset_bits = ilog2(block_size);
    int index_bits = ilog2(sets);

    int index = (address >> offset_bits) & ((1 << index_bits) - 1);
    return index;
}

int extract_offset (int address, int sets, int block_size)
{
    int offset_bits = ilog2(block_size);

    int offset = address & ((1 << offset_bits) - 1);
    return offset;
}
...