Escolar Documentos
Profissional Documentos
Cultura Documentos
A seo comea com o SystemVerilog do controlador de cache da Seo 5.7 em oito figuras. Depois, entra nos detalhes de um protocolo de coerncia de cache de exemplo e as
dificuldades na implementao de tal protocolo.
Material Complementar
ELSEVIER
FIGURA 5.9.3 Diagrama em blocos da cache simples usando os nomes do Verilog. No aparecem aqui os write enables para a memria de tag da cache e
para a memria de dados da cache, ou os sinais de controle para multiplexadores que fornecem dados para a varivel Data Write. Em vez de ter write enables
separados em cada word do bloco da cache de dados, o Verilog l o valor antigo do bloco no Data Write e depois atualiza a word nessa varivel em uma escrita.
Depois, ele escreve o bloco inteiro de 128 bits.
Material Complementar
ELSEVIER
A Figura 5.9.5 define as entradas, sadas e estados da FSM (mquina de estados finitos). As
entradas so as requisies da CPU (cpu_req) e as respostas da memria (mem_data), e
as sadas so as respostas CPU (cpu_res) e requisies memria (mem_req). A figura
tambm declara as variveis internas necessrias pela FSM. Por exemplo, os registradores de
estado atual e prximo estado da FSM so rstate e vstate, respectivamente.
/*mquina de estados finitos da cache*/
/*clock de escrita*/
typedef enum {idle, compare_tag, allocate, write_back} cache_state_
type;
/*registrador de estado da FSM*/
cache_state_typevstate, rstate;
/*sinais de interface memria de tag*/
cache_tag_typetag_read; //resultado de leitura de tag
cache_tag_typetag_write; //dados de escrita de tag
cache_req_typetag_req; //solicitao de tag
/*sinais de interface para memria de dados da cache*/
cache_data_typedata_read; //dados de leitura da linha de cache
cache_data_typedata_write; //dados de escrita da linha de cache
cache_req_typedata_req; //requisio de dados
/*varivel temporria para resultado do controlador de cache*/
cpu_result_typev_cpu_res;
/*varivel temporria para requisio do controlador de memria*/
mem_req_typev_mem_req;
assign mem_req = v_mem_req; //conecta s portas de sada
assign cpu_res = v_cpu_res;
FIGURA 5.9.5 FSM no SystemVerilog, parte I. Esses mdulos instanciam as memrias de acordo com as definies
de tipo na figura anterior.
A Figura 5.9.6 lista os valores default dos sinais de controle, incluindo a word a ser lida
ou escrita a partir de um bloco, definindo os write enables da cache como 0, e assim por
diante. Esses valores so definidos a cada ciclo de clock, de modo que o write enable para
uma parte da cache por exemplo, tag_req.we seria definido como 1 para um
ciclo de clock nas figuras a seguir e depois seria retornado a 0 de acordo com o Verilog
nessa figura.
always_comb begin
/*-------------- valores default para todos os sinais -----------*/
/*sem mudana de estado por default*/
vstate = rstate;
v_cpu_res = {0, 0}; tag_write = {0, 0, 0};
/*l tag por default*/
tag_req.we = 0;
/*direciona ndice do mapa para tag*/
tag_req.index = cpu_req.addr[13:4];
/*l linha de cache atual por default*/
data_req.we = 0;
/*direciona ndice de mapa para dados da cache*/
data_req.index = cpu_req.addr[13:4];
/*modifica word correta (32 bits) com base no endereo*/
data_write = data_read;
Material Complementar
ELSEVIER
case(cpu_req.addr[3:2])
2b00:data_write[31:0] = cpu_req.data;
2b01:data_write[63:32] = cpu_req.data;
2b10:data_write[95:64] = cpu_req.data;
2b11:data_write[127:96] = cpu_req.data;
endcase
/*leitura da word correta (32 bits) da cache (para CPU)*/
case(cpu_req.addr[3:2])
2b00:v_cpu_res.data = data_read[31:0];
2b01:v_cpu_res.data = data_read[63:32];
2b10:v_cpu_res.data = data_read[95:64];
2b11:v_cpu_res.data = data_read[127:96];
endcase
/*endereo da requisio de memria (apanhado da req. de CPU)*/
v_mem_req.addr = cpu_req.addr;
/*dados de requisio de memria (usados na escrita)*/
v_mem_req.data = data_read;
v_mem_req.rw = 0;
FIGURA 5.9.6 FSM no SystemVerilog, parte II. Esta seo descreve o valor default de todos os sinais. As figuras seguintes definiro esses valores para um ciclo de clock, e esse Verilog retornar a esses valores no ciclo de clock seguinte.
As duas ltimas figuras mostram a FSM como uma grande instruo case (case
(rstate)), com as quatro divises de estado nas duas figuras. A Figura 5.9.7 comea com
o estado Idle (idle), que simplesmente vai para o estado Compare Tag (compare_tag)
se a CPU fizer uma requisio vlida. Depois, ela descreve a maior parte do estado Compare
Tag. O estado Compare Tag verifica se as tags combinam e a entrada vlida. Se for, ento
ela primeiro define o sinal Cache Ready (v_cpu_res.ready). Se a requisio for uma
escrita, ela define o campo de tag, o bit de validade e o bit de modificao. O estado seguinte
Idle. Se for uma perda de cache, ento o estado se prepara para mudar a entrada da tag
e os bits de validade e modificao. Se o bloco a ser substitudo estiver limpo ou invlido,
o prximo estado Allocate.
//----------------------- FSM da cache------------------------case(rstate)
/*estado idle*/
idle : begin
/*Se houver requisio de CPU, ento compara tag de cache*/
if (cpu_req.valid)
vstate = compare_tag;
end
/*estado compare_tag*/
compare_tag : begin
/*acerto de cache (tag combina e entrada de cache vlida)*/
if (cpu_req.addr[TAGMSB:TAGLSB] == tag_read.tag && tag_read.valid) begin
v_cpu_res.ready = 1;
/*acerto de escrita*/
if (cpu_req.rw) begin
/*linha de cache read/modify*/
tag_req.we = 1; data_req.we = 1;
end
end
/*perda de cache*/
else begin
/*gera nova tag*/
tag_req.we = 1;
tag_write.valid = 1;
/*nova tag*/
tag_write.tag = cpu_req.addr[TAGMSB:TAGLSB];
/*linha de cache modificada se houver escrita*/
tag_write.dirty = cpu_req.rw;
/*gera requisio de memria na perda de cache*/
v_mem_req.valid = 1;
/*perda compulsria ou perda com bloco limpo*/
if (tag_read.valid == 1b0 || tag_read.dirty == 1b0)
/*espera at novo bloco ser alocado*/
vstate = allocate;
FIGURA 5.9.7 FSM in SystemVerilog, parte III. Estados reais da FSM via instrues case nesta e na figura seguinte.
Esta figura tem o estado Idle e a maior parte do estado Compare Tag.
A Figura 5.9.8 continua o estado Compare Tag. Se o bloco a ser substitudo for modificado, ento o prximo estado Write-Back. A figura mostra o estado Allocate (allocate)
em seguida, que simplesmente l o novo bloco. Ele continua realizando o loop at que a
memria esteja pronta; quando estiver, ela vai para o estado Compare Tag. Isso seguido
na figura pelo estado Write-Back (write_back). Como mostra a figura, o estado Write-Back simplesmente escreve o bloco modificado na memria, mais uma vez realizando
um loop at que a memria esteja pronta. Quando a memria estiver pronta, indicando
que a escrita est concluda, passamos ao estado Allocate.
else begin
/*perda com linha modificada*/
/*endereo de write back*/
v_mem_req.addr = {tag_read.tag, cpu_req.addr[TAGLSB-1:0]};
v_mem_req.rw = 1;
/*espera at escrita terminar*/
vstate = write_back;
end
end
end
/*wait alocao de nova linha de cache*/
allocate: begin
/*controlador de memria respondeu*/
if (mem_data.ready) begin
/*compara tag novamente na perda de escrita (modificar word
correta)*/
Material Complementar
ELSEVIER
vstate = compare_tag;
data_write = mem_data.data;
/*atualiza dados da linha de cache*/
data_req.we = 1;
end
end
/*espera write back da linha de cache modificada*/
write_back : begin
/*write back completado*/
if (mem_data.ready) begin
/*emite nova req. de memria (alocando nova linha)*/
v_mem_req.valid = 1;
v_mem_req.rw = 0;
vstate = allocate;
end
end
endcase
end
always_ff @(posedge(clk)) begin
if (rst)
rstate <= idle; //retorna a estado idle
else
rstate <= vstate;
end
/*conecta memria de tag/dados da cache*/
dm_cache_tag ctag(.*);
dm_cache_data cdata(.*);
endmodule
FIGURA 5.9.8 FSM no SystemVerilog, parte IV. Estados FSM reais via instruo case na figura anterior e nesta. Esta
figura tem a ltima parte do estado Compare Tag, mais os estados Allocate e Write-Back.
O cdigo no final define o estado atual a partir do prximo estado ou reinicia a FSM
para o estado Idle na transio de clock seguinte, dependendo do sinal de reset (rst).
O CD inclui um mdulo de Caso de Teste que ser til para verificar o cdigo nessas
figuras. Este SystemVerilog poderia ser usado para criar uma cache e controlador de cache
em um FPGA.
10
Material Complementar
ELSEVIER
o que normalmente exige um stall do processador. s vezes, ele pode ainda ser til para
duplicar as tags da cache secundria de modo a diminuir a disputa entre o processador e
a atividade de verificao.
Origem
Estado do bloco de
cache endereado
compartilhado ou
modificado
Tipo de ao da
cache
Acerto de leitura
processador
Perda de leitura
processador
invlido
normal miss
Perda de leitura
processador
compartilhado
substituio
Perda de leitura
processador
modificado
substituio
Acerto de escrita
processador
modificado
acerto normal
Acerto de escrita
processador
compartilhado
coerncia
Perda de escrita
processador
invlido
normal miss
Perda de escrita
processador
compartilhado
substituio
acerto normal
Funo e explicao
L dados na cache.
Coloca perda de leitura no
barramento.
Resolve perda de conflito:
coloca perda de leitura no
barramento.
Resolve perda de conflito:
bloco write-back, depois
coloca perda de leitura no
barramento.
Escreve dados na cache.
Coloca invalidao
no barramento. Essas
operaes normalmente so
chamadas de upgrade ou
perdas de propriedade,
pois s alteram o estado.
Coloca perda de escrita no
barramento.
Resolve perda de conflito:
coloca perda de escrita no
barramento.
Perda de escrita
processador
modificado
substituio
Perda de leitura
bus
compartilhado
nenhuma ao
Perda de leitura
bus
modificado
coerncia
Invalidar
bus
compartilhado
coerncia
Perda de escrita
bus
compartilhado
coerncia
Perda de escrita
bus
modificado
coerncia
FIGURA 5.9.9 O mecanismo de coerncia de cache recebe solicitaes do processador e do barramento, e responde
a estas com base no tipo de solicitao, sejam acertos ou perdas na cache, e o estado do bloco de cache especificado
na solicitao. A quarta coluna descreve o tipo de ao de cache como acerto ou falta normal (o mesmo que a cache
uniprocessador veria), substituio (uma perda de substituio de cache uniprocessador) ou coerncia (exigida para
manter a coerncia da cache); uma ao normal ou de substituio pode causar uma ao de coerncia, dependendo do
estado do bloco em outras caches. Para perdas de leitura, perdas de escrita ou invalidaes verificadas no barramento,
uma ao exigida apenas se os endereos de leitura ou escrita combinarem com um bloco na cache e o bloco for vlido.
Alguns protocolos tambm introduzem um estado para designar quando um bloco est exclusivamente em uma cache,
mas ainda no foi escrito. Esse estado pode surgir se um acesso de escrita for dividido em duas partes: obtendo o bloco
exclusivamente em uma cache e depois atualizando-o subsequentemente; nesse protocolo, esse estado no modificado exclusivo transiente, terminando assim que a escrita completada. Outros protocolos utilizam e mantm um
estado exclusivo para um bloco no modificado. Em um protocolo de snooping, esse estado pode ser entrado quando
um processador l um bloco que no residente em qualquer outra cache. Como todos os acessos subsequentes so
verificados, possvel manter a preciso desse estado. Em particular, se outro processador emitir uma falta de leitura,
o estado alterado de exclusivo para compartilhado. A vantagem de acrescentar esse estado que uma escrita subsequente em um bloco no estado exclusivo pelo mesmo processador no precisa adquirir acesso ao barramento ou gerar
uma invalidao, pois o bloco conhecido como estando exclusivamente nessa cache; o processador apenas muda o
estado para modificado. Esse estado facilmente acrescentado usando o bit que codifica o estado coerente como um
estado exclusivo e usando um bit de modificao para indicar que um bloco est modificado. O protocolo MESI, que
corresponde aos quatro estados que ele inclui (modificado, exclusivo, compartilhado shared e invlido), usa essa
estrutura. O protocolo MOESI introduz outra extenso: o estado owned (possudo).
12
Material Complementar
ELSEVIER
FIGURA 5.9.10 Um protocolo de invalidao de escrita, coerncia de cache, para uma cache write-back, mostrando os estados e transies de estado para
cada bloco na cache. Os estados da cache so mostrados em crculos, com qualquer acesso permitido pelo processador sem uma transio de estado mostrada
entre parnteses sob o nome do estado. O estmulo causando uma mudana de estado aparece nos arcos de transio no tipo regular, e quaisquer aes do barramento geradas como parte da transio de estado aparecem no arco de transio em negrito. As aes de estmulo se aplicam a um bloco na cache, e no a um
endereo especfico na cache. Logo, uma perda de leitura em um bloco no estado compartilhado uma perda para esse bloco de cache, mas para um endereo
diferente. O lado esquerdo do diagrama mostra transies de estado com base em aes do processador associadas a essa cache; o lado direito mostra transies
com base nas operaes sobre o barramento. Uma perda de leitura no estado exclusivo ou compartilhado e uma perda de escrita no estado exclusivo ocorrem
quando o endereo solicitado pelo processador no corresponde ao endereo no bloco da cache. Essa uma perda de substituio de cache padro. Uma tentativa
de escrever um bloco no estado compartilhado gera uma invalidao. Sempre que ocorre uma transao de barramento, todas as caches que contm o bloco de
cache especificado na transao do barramento tomam a ao ditada pela metade direita do diagrama. O protocolo considera que a memria oferece dados em
uma perda de leitura para um bloco que est limpo em todas as caches. Nas implementaes reais, esses dois conjuntos de diagramas de estado so combinados.
Na prtica, existem muitas variaes sutis nos protocolos de invalidao, incluindo a introduo do estado no modificado exclusivo, como se um processador
ou memria oferece dados em uma perda.
Todos os estados nesse protocolo de cache seriam necessrios em uma cache uniprocessador, em que corresponderiam aos estados invlido, vlido (e limpo) e modificado. A
maior parte das mudanas de estado indicadas pelos arcos na metade esquerda da Figura
5.9.10 seria necessria em um cache de uniprocessador write-back, exceto pela invalidao
em um acerto de escrita em um bloco compartilhado. As mudanas de estado representadas
pelos arcos na metade direita da Figura 5.9.10 so necessrias apenas por coerncia, e no
apareceriam de forma alguma no controlador de cache de um uniprocessador.
Para entender por que esse protocolo funciona, observe que qualquer bloco de cache
vlido est no estado compartilhado em uma ou mais caches ou no estado exclusivo em
exatamente uma cache. Qualquer transio para o estado exclusivo (que exigido para
um processador escrever no bloco) requer que uma invalidao ou perda de escrita seja
colocada no barramento, fazendo com que todas as caches tornem o bloco invlido. Alm
disso, se alguma outra cache tivesse o bloco no estado exclusivo, ela geraria um write-back,
que fornece o bloco contendo o endereo desejado. Finalmente, se uma perda de leitura
ocorrer no barramento de um bloco no estado exclusivo, a cache com a cpia exclusiva
muda seu estado para compartilhado.
As aes em cinza na Figura 5.9.11, que tratam de perdas de leitura e escrita no barramento, so basicamente o componente de verificao do protocolo. Uma outra propriedade
que preservada nesse protocolo, e na maioria dos outros protocolos, que qualquer
bloco de memria no estado compartilhado est sempre atualizado na memria, o que
simplifica a implementao.
FIGURA 5.9.11 Diagrama de estado de coerncia de cache com as transies de estado induzidas pelo processador
local mostrado em preto e pelas atividades de barramento mostradas em cinza. Assim como na Figura 5.9.10, as
atividades em uma transio aparecem em negrito.
Como j dissemos, h somente uma mquina de estados finitos por cache, com estmulos
vindo do processador conectado ou do barramento. A Figura 5.9.11 mostra como as transies de estado na metade direita da Figura 5.9.10 so combinadas com aquelas na metade
esquerda da figura para formar um nico diagrama de estados para cada bloco de cache.
Embora nosso protocolo de cache simples esteja correto, ele omite uma srie de complicaes que tornam a implementao muito mais intricada. A mais importante delas que
o protocolo assume que as operaes sejam atmicas ou seja, uma operao pode ser
feita de tal maneira que nenhuma operao possa ser intercalada. Por exemplo, o protocolo
descrito considera que as perdas de escrita podem ser detectadas, adquirem o barramento
e recebem a resposta como uma nica ao atmica. Na realidade, isso no verdade. De
modo semelhante, se usssemos um switch, como todos os multiprocessadores recentes
fazem, ento at mesmo as perdas de leitura tambm seriam atmicas.
Aes no atmicas introduzem a possibilidade de que o protocolo possa realizar
deadlock, significando que ele atinge um estado em que no pode continuar. Em breve,
exploraremos como esses protocolos so implementados sem um barramento.
Construir multiprocessadores de pequena escala (dois a quatro processadores) tornou-se
muito fcil. Por exemplo, os processadores Intel Nehalem e o AMD Opteron so projetados
para uso nos multiprocessadores coerentes com cache e possuem uma interface externa
que d suporte verificao e permite que dois a quatro processadores sejam conectados
diretamente. Eles tambm possuem maiores caches no chip, para reduzir a utilizao do
barramento. No caso dos processadores Opteron, o suporte para interconexo de mltiplos
processadores integrado ao chip processador, assim como as interfaces de memria. No
caso do projeto da Intel, um sistema de dois processadores pode ser montado apenas com
14
Material Complementar
ELSEVIER
alguns chips externos adicionais de modo a interferir com o sistema de memria e E/S.
Embora esses projetos no possam ser facilmente escalados para maiores quantidades de
processadores, eles oferecem uma soluo muito econmica para dois a quatro processadores.