Você está na página 1de 6

CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES II

Protocolo Snooping:

Introdução:
Snooping é um protocolo de coerência de cache amplamente utilizado para gerenciar a
comunicação entre múltiplos processadores. Sua implementação permite reduzir a latência
de acesso a um dado compartilhado e diminuir a disputa por esses dados. Essa prática tem
por objetivo implementar o protocolo snooping com a finalidade de gerenciar três
processadores com caches particulares e uma memória de dados compartilhada, mostrando
seu funcionamento e monitorando o que acontece como o barramento de comunicação em
diferentes casos.

Módulos do Projeto:

Módulo counter (contador de instruções):


Responsável por incrementar os endereços da memória de instruções.

Módulo memoryInstr (memória de instrução):


Responsável por armazenar as instruções referentes ao processador que irá opera-la. Essa
memória é capaz de armazenar 32 instruções de 16 bits.

Módulo memoryData (memória de dados):


É uma memória compartilhada de 32 entradas de 8 bits que contém os dados referentes aos
endereços de 0x00 a 0x1F.

Módulo proc (processador):


Responsável por realizar as operações vindas da memória de instrução. No projeto foram
ciadas três instâncias desse módulo que representam os processadores P1, P2 e P3. Cada
processador possui sua própria cache e comunica como os outros pelo barramento do
protocolo snooping.

Módulo snooping:
É o módulo principal que interliga todos os blocos criados no projeto. É nesse bloco que é
realizado o gerenciamento e o controle do tráfego dos dados entre processadores, caches e
memória principal.

Máquinas de Estado:
Parte 1:
Para facilitar a leitura dos resultados foram feitas as seguintes tabelas:

Bus Código
Mensagem CPU Código Read Miss 000 Estado Código
Write Miss 00 Read Hit 001 Invalid 00
Write Hit 01 Write Miss 010 Shared 01
Read Miss 10 Write Hit 011 Modified 10
Read Hit 11 Invalid 100 Exclusive 11
None 101

Transmitter_Waves:

Receiver_Waves:
Resultado das instruções:

• No print “transmitter_waves” é possível ver as entradas clock, shared, init e CPU_IN e as


saídas bus, state, writeBack. Nos primeiros ciclos de clock foi testado todas as
possibilidades para quando o estado inicial é Invalid, neste estado ao receber read miss e
shared igual a 1 (shared indica se algum outro processador possui este dado) o estado de
saída é Shared, quando recebe read miss e shared igual a 0 o estado de saída é Exclusive
e quando recebe write miss o estado de saída é Modified.
• Nos ciclos seguintes testamos quando começa no estado Shared, neste estado ao receber
um write miss ou um write hit o estado de saída é Modified.
• Após isso testamos quando começa no estado Modified, neste estado ao receber um read
miss o estado de saída é Shared e o writeBack é igual a 1.
• Por último testamos quando começa no estado Exlusive, neste estado ao receber um read
miss e shared o estado de saída é Shared e quando recebe um write miss ou um write hit
o estado de saída é Modified.
• No print do receiver é possível ver as entradas clock, init e bus e as saídas state,
writeBack. Nos primeiros ciclos de clock testamos todas as possibilidades para quando o
estado inicial é Shared, neste estado ao receber um write miss ou um invalid o estado de
saída é Invalid.
• Após isso testamos quando começa no estado Modified, neste estado ao receber um
write miss o estado de saída é Invalid e o writeBack é igual a 1 e quando recebe um read
miss o estado de saída é Shared.
• Por último testamos quando começa no estado Exlusive, neste estado ao receber um
write miss o estado de saída é Invalid e quando recebe um read miss o estado de saída é
Shared.

Parte 2:
As operações implementadas possuem a seguinte decodificação (16 bits):

Operações:
Operação Exemplo Nº P R/W Address Data Hexadecimal
Read P1 RD 8 01 0 01000 0000 0000 0x4800
Write P2 WR 5, 28 10 1 00101 0001 1100 0xA502

A memória cache dos três processadores foram inicializadas da seguinte forma:

Processador P1 Processador P2
Bloco State TAG Data
Bloco State TAG Data
B0 I 0x00 10 B0 I 0x04 10
B1 S 0x01 08 B1 M 0x05 68
B2 M 0x02 30 B2 I 0x06 10
B3 M 0x03 10 B3 S 0x07 18

Processador P3
Bloco State TAG Data
B0 S 0x08 20
B1 S 0x01 08
B2 E 0x06 09
B3 M 0x0B 05

Para o mapeamento dos blocos, foi utilizado os dois bits menos significativos da TAG
em questão.

A memória de dados teve os 8 primeiros endereços inicializados com os seguintes valores:

Memória de Dados:

Endereço Dado Endereço Dado Endereço Dado


0x00 02 0x04 12 0x08 00
0x01 08 0x05 04 0x09 00
0x02 07 0x06 09 0x0A 00
0x03 20 0x07 10 0x0B 00

Foi realizado uma simulação para comprovar o funcionamento do protocolo snooping


com as seguintes instruções gravadas previamente na memória:

Memória de Instruções:
Endereço Instrução Binário Hexadecimal
0x00 P1 RD 0 0100 0000 0000 0000 4000
0x01 P2 WR 4, 20 1010 0100 0001 0100 A414
0x02 P1 RD 5 0100 0101 0000 0000 4500
0x03 P1 RD 6 0100 0110 0000 0000 4600
0x04 P3 RD 3 1100 0011 0000 0000 C300

O resultado de cada instrução foi simulado, em forma de ondas, utilizando o software


“ModelSim”.

Resultado da simulação em forma de ondas:


Resultado das instruções:
• Na primeira instrução o P1 lê o endereço 0 (mapeado para B0). Como nenhum outro processador
possuía este dado então o dado foi satisfeito pela memória, alterando o estado do bloco de 00(invalid)
para 11(Exclusive). Como a atualização do dado ocorreu somente em P1, então as caches dos
processadores que estavam na condição de receptores mantiveram seu estado.

• Na segunda instrução o P2 grava o valor 20 no endereço 4 (mapeado para o bloco B0), assim o bloco
passa do estado 00(inválido) para o estado 10(modificado). Como nenhum outro processador possuía
a TAG igual a 4, nenhum dos ouvintes alterou sua cache.

• Na terceira instrução P1 lê o endereço 5 (mapeado para B1) que está modificado em P2. Sendo assim
o bloco B1 do processador P1 será shared e o B1 de P2 também. Em seguida é realizado o write-back
do valor antigo de B1 em P2.

• Na quarta instrução P1 lê o endereço 6 (mapeado para B2) que está modificado. A leitura do dado é
satisfeita pela memória e é realizado o write-back do antigo valor de B2.

• Na quinta instrução P3 lê o endereço 3 (mapeado para B3), nesse caso o dado será satisfeito pela cache
de P1 que também está modificada. Sendo assim haverá 2 write-back (para B3 em P1 e para B3 em
P3).

Após o término de cada instrução, o resultado da cache de cada processador e da memória


de dados é mostrado nas tabelas abaixo:

Processador P1 Processador P2
Bloco State TAG Data
Bloco State TAG Data
B0 E 0x00 02 B0 M 0x04 20
B1 S 0x05 68 B1 S 0x05 68
B2 S 0x06 09 B2 I 0x06 10
B3 S 0x03 10 B3 S 0x07 18

Processador P3
Bloco State TAG Data
B0 S 0x08 20
B1 S 0x01 08
B2 S 0x06 09
B3 S 0x03 10

Memória de Dados:

Endereço Dado Endereço Dado Endereço Dado


0x00 02 0x04 12 0x08 00
0x01 08 0x05 68 0x09 00
0x02 30 0x06 09 0x0A 00
0x03 10 0x07 05 0x0B 05

Ao término de cada instrução, os valores cada bloco das caches e de cada endereço de
memória estão conforme o esperado pelas tabelas acima.

Dificuldades Encontradas:

Uma das maiores dificuldades durante a implementação do protocolo snooping foi a


sincronização dos módulos, onde várias etapas ocorriam em ciclos fora de seu tempo. Outra
grande dificuldade foi implementar o caso específico onde ocorrem 2 write-back em uma
mesma operação.

Você também pode gostar