Perguntinhas
Pergunta A
Sabendo que em Verilog descreveríamos um registo, para endereços de memória ou para words, de uma determinada máquina da seguinte forma:
reg [0:31] registo;
e sabendo ainda que a cache tem 256 entradas, é direct-mapped, é write-back e o bloco tem 4 words. Especifique um conjunto de flip-flops, em Verilog, que permita armazenar toda a informação desta cache.
Esta pergunta é apenas uma desculpa para um exercício sobre caches. Assim, da declaração reg [0:31] registo; ficamos a saber que o endereçamento na máquina é de 32-bits e as words medem também 32-bits. Temos agora que descobrir o tamanho de cada entrada. Para isso temos que saber o tamanho da flag. Para sabermos isso, temos primeiro que descobrir o offset e o índice. Tanto um como o outro são fáceis de obter a partir dos dados iniciais. Assim, temos que o índice é igual a log2(nº entradas) = 8 (note-se que não existe associatividade) e que o offset é igual a log2(nº words bloco) = 2. Assim, ficamos com uma flag de 32 - 8 - 2 = 22 bits. Agora calculamos o tamanho de cada entrada na cache ora, valid_bit + dirty_bit(é write-back!!!!!) + flag + 4 * tamanho_word = 1 + 1 + 22 +4 * 32 = 152 bits. Agora, já nem é necessário calcular o tamanho total da cache, basta defini-la como um conjunto de registos com o tamanho de cada entrada. Assim:
reg [0:151] Cache [0:255];
Desta forma, definimos uma espécie de matriz com (nº de entradas na cache) por (tamanho das entradas na cache) bits (flip-flop é um registo com um bit, era só para confundir :), que representa a cache pedida.
Pergunta B
Partindo da cache especificada na pergunta anterior, especifique um módulo que simule uma cache. O módulo deverá ser capaz de devolver uma determinada word, numa cache similar à anterior. Deverá ainda devolver os valid e dirty bits e ser capaz de aferir uma linha de output caso se dê um miss.
Esta sim, é complicada. A solução está no seguinte ficheiro de Verilog: respostaB.v, que abre com um qualquer editor de texto. O código está comentado e consiste em dois módulos: cache e testa cache. O primeiro, simula a cache e é a resposta propriamente dita à questão, o segundo não é mais do que um módulo, para testar o anterior, que inicializa algumas variáveis, altera algumas ao longo do tempo, cria instâncias do módulo cache e vigia os resultados.