Experimento de Arquitetura de Computador 1

Experimento de Arquitetura de Computador 1

1. Finalidade experimental

Compreenda o fluxo de dados e os sinais de controle da execução de instruções RISC-V e esteja familiarizado com o processo de trabalho do pipeline de instruções.

2. Processo experimental

1.Instruções relacionadas ao RISC-V

O simulador do experimento utiliza o conjunto de instruções RISC-V. Para facilitar a análise posterior, primeiro aprenda as instruções RISC-V utilizadas no experimento.

O RISC-V básico usa instruções de comprimento fixo de 32 bits. Mas o modo de codificação RISC-V padrão suporta instruções de comprimento variável e pode usar instruções de 16 bits.Essas instruções são chamadas de instruções compactadas padrão e são denominadas C. Essas instruções costumam ser operações comuns que podem reduzir o tamanho do código estático e dinâmico. Todas as instruções seguintes no formato "C.inst" pertencem a este tipo de instruções.

O código assembly do experimento inclui principalmente os seguintes tipos de instruções:

  • Instruções de transferência de controle: cj, c.jr, bge
  • Instruções de operação aritmética e lógica: c.slli, c.addi
  • Instruções de geração de inteiros: c.li
  • Instruções de acesso à memória: lw, sw

transferência de instrução de controle

A instrução cj é uma instrução de salto incondicional. Ela usa o salto relativo do PC. O PC é adicionado ao deslocamento para formar o endereço de destino do salto. É equivalente à instrução Jal. Após o salto, o valor de PC+4 será escrito para o registrador rd. Para cj, rd=x0 e x0 não podem ser escritos, o que equivale a esta instrução apenas completar o salto. A instrução c.jr executa um salto de controle incondicional para retirar o valor de rs1 e define o bit mais baixo como 0 como endereço de salto, o que é equivalente à instrução Jalr. Ele também grava o valor de PC+4 no registrador rd depois do salto, mas rd é x0. A instrução bge compara os valores dos registradores rs1 e rs2 como números assinados.Se rs1 for maior ou igual a rs2, ele salta para o endereço de destino.

Insira a descrição da imagem aqui

instrução cj

Insira a descrição da imagem aqui

instrução c.jr

Insira a descrição da imagem aqui

comando bge

Instruções de operação aritmética e lógica

A instrução c.slli executa uma operação lógica de deslocamento à esquerda no valor em rd e grava o resultado em rd. O campo shamt na instrução é o número de deslocamentos. c.Addi, add e outras instruções são todas instruções de adição, apenas os operandos são diferentes.

Insira a descrição da imagem aqui

c.slli

Instruções de geração de inteiros

A instrução c.li escreve o valor imediato de 6 bits com sinal estendido no registrador rd e só é válida quando rd!=x0.

Insira a descrição da imagem aqui

instruções de acesso à memória

A instrução lw lê o valor com rs1+offset como endereço da memória e o armazena no registrador rd. A instrução sw grava o valor de rs2 na memória e o endereço é rs1+offset.

Insira a descrição da imagem aqui

2. Análise de código assembly

Analisando o código fornecido no experimento e convertendo-o em código assembly, podemos encontrar as partes da instrução assembly dos dois loops.

A parte do primeiro loop é a seguinte:

1014c:        fe042623        sw x0 -20 x8		#x8-20 : i 
10150:        a005            c.j 32			#-> 10170
10152:        fec42783        lw x15 -20 x8
10156:        078a            c.slli x15 2		#x15 = 4i
10158:        ff040713        addi x14 x8 -16	
1015c:        97ba            c.add x15 x14		
1015e:        fec42703        lw x14 -20 x8		
10162:        e6e7a623        sw x14 -404 x15	#A[i] = i
#i++
10166:        fec42783        lw x15 -20 x8
1016a:        0785            c.addi x15 1
1016c:        fef42623        sw x15 -20 x8
#if(i<100)
10170:        fec42703        lw x14 -20 x8		
10174:        06300793        addi x15 x0 99
10178:        fce7dde3        bge x15 x14 -38	#i<99 -> 10152

A parte do segundo loop é a seguinte:

1017c:        4785            c.li x15 1		
1017e:        fef42623        sw x15 -20 x8		#x8-20: i
10182:        a80d            c.j 50			#-> 101B4
10184:        fec42783        lw x15 -20 x8
10188:        17fd            c.addi x15 -1
1018a:        078a            c.slli x15 2
1018c:        ff040713        addi x14 x8 -16
10190:        97ba            c.add x15 x14
10192:        e6c7a783        lw x15 -404 x15	#x15: A[i-1]
10196:        3e878713        addi x14 x15 1000
1019a:        fec42783        lw x15 -20 x8
1019e:        078a            c.slli x15 2
101a0:        ff040693        addi x13 x8 -16
101a4:        97b6            c.add x15 x13
101a6:        e6e7a623        sw x14 -404 x15	#A[i] = A[i-1]+1000
#i++
101aa:        fec42783        lw x15 -20 x8
101ae:        0785            c.addi x15 1
101b0:        fef42623        sw x15 -20 x8
#if(i<100)
101b4:        fec42703        lw x14 -20 x8
101b8:        06300793        addi x15 x0 99
101bc:        fce7d4e3        bge x15 x14 -56	#i<99 -> 10184

3.Análise do circuito RISC-V

O diagrama de projeto do circuito do RISC-V é o seguinte:

Insira a descrição da imagem aqui

Fase de endereço

O circuito é analisado etapa por etapa, começando pela etapa de endereçamento. O Gerador NPC na fase de valor gera o endereço da próxima instrução, e o endereço vem do cálculo do endereço do salto Jal, do cálculo do endereço do salto Jalr, do cálculo do endereço do desvio, e a próxima instrução é selecionada através do sinal de seleção da unidade de controle e do seletor de ramificação. o endereço de. Usando o valor do PC gerado pelo NPC como endereço, o valor é buscado na memória de instruções e passado para o estágio de decodificação. O PCF do NPC está conectado à predição de ramificação. Para ramificações condicionais como BGE, se a predição for selecionada, não há necessidade de esperar até o estágio de execução para julgar a condição. O endereço de salto pode ser calculado diretamente no estágio de ID e escrito para o NPC.

Insira a descrição da imagem aqui

estágio de decodificação

O trabalho realizado na etapa de decodificação é gerar sinais de controle e ler operandos.As principais unidades de trabalho são o grupo de registradores e a unidade de operação de valor imediato. RegWriteW, WD3 e A3 do grupo de registros são os sinais do estágio de write-back, que passam do estágio de decodificação para o estágio de write-back. A unidade de operação de valor imediato completa a expansão do valor imediato e passa para o estágio de execução, onde pode completar diretamente o cálculo do endereço alvo do salto Jal e passá-lo para o gerador NPC. Para o salto incondicional para Jal, o controle a unidade pode emitir o controle neste estágio Sinal JalD, o salto foi realizado.

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Fase de execução

A fase de execução completa três tarefas: seleção de operandos e conclusão de operações da ALU; seleção de ramificação; e cálculo do endereço alvo da instrução Jalr. As fontes de operandos incluem valores de registro lidos no estágio ID, resultados de encaminhamento de dados no estágio EX e estágio MEM e números imediatos. Todos os sinais de controle são gerados pela unidade de controle no estágio de decodificação e depois passados ​​para vários componentes no estágio de execução.

O seletor de ramificação compara os valores dos dois registros de acordo com o tipo de ramificação (pode vir da fase de valor, ou pode vir da fase de execução e acesso à memória), escolhe se deseja realizar um salto de ramificação e envia o sinal de ramificação para o gerador NPC. Como a seleção da ramificação está em Este estágio é realizado, e o endereço de destino da ramificação também é passado para o gerador NPC neste estágio. É a saída BrNPC por EX, e o valor é o número imediato obtido na etapa de decodificação. Se a previsão dinâmica não for selecionada no início, mas o resultado do cálculo da ramificação for selecionado novamente, a previsão está errada e o endereço do alvo do salto NPC é escrito no estágio EX.

Insira a descrição da imagem aqui

A operação Alu seleciona o operando a partir do valor do registro lido nos estágios de avanço e decodificação de dados. O sinal de controle Forward é emitido pela unidade Harzard. Se o registro de destino atualmente escrito (instrução anterior/anterior) for o mesmo que o registro de origem do a operação atual, selecione os resultados das fases de acesso à memória e write back. O sinal AluSrc seleciona o operando como registro/PC/dados imediatos, e AluContrl fornece o tipo de cálculo. Se for uma instrução Jalr, defina o bit mais baixo do valor de rs1 como 0 e passe-o para o gerador NPC através do AluOut para pular.

Insira a descrição da imagem aqui

Fase de acesso

O principal trabalho da fase de acesso à memória é ler e escrever na memória, além de concluir a transferência dos resultados da fase de execução. O sinal de habilitação de gravação é passado do estágio de decodificação.

Insira a descrição da imagem aqui

Para instruções aritméticas, os resultados da fase de execução são passados ​​diretamente para a fase de write-back e escritos no registrador rd. Para instruções como jal e jr, PC+4 será escrito no registrador rd. A unidade de controle envia o Sinal de controle LoadNpc durante a decodificação.A escolha entre os dois.

Insira a descrição da imagem aqui

fase de escrita

O estágio de write-back seleciona entre o resultado do acesso à memória e o resultado da operação ALU/PC+4 e o transmite ao grupo de registradores. MemToReg é o sinal de seleção, que é gerado pela unidade de controle e passado para o estágio de write-back .

Insira a descrição da imagem aqui

unidade de controle

A unidade de controle é a seguinte:

Insira a descrição da imagem aqui

As funções de alguns desses sinais são as seguintes:

  • RegWriteD: sinal de habilitação de gravação do grupo de registros

  • MemToRegD: Se os dados gravados no grupo de registradores vêm da memória

  • LoadNpcD: Se deve calcular PC+4 e armazená-lo no registrador rd

  • RegReadD: Se deve ler o registro e passá-lo para a unidade de Harvard

  • BranchTypeD: Indica o tipo de filial

  • AluSrc1D, AluSrc2D: O sinal de seleção de fonte do operando ALU. As fontes opcionais de Alusrc1D incluem valor de registro e valor de PC; as fontes opcionais de Alusrc2D incluem valor de registro e dados imediatos.

  • AluContrlD: sinal de seleção de operação específica da ALU

  • ImmType: Tipo de dados imediatos (comprimento)

4. Processo de execução de instruções

O processo de execução de a.add x15, x14, x15
A instrução está localizada em:

10188:        17fd            c.addi x15 -1
1018a:        078a            c.slli x15 2
1018c:        ff040713        addi x14 x8 -16
10190:        97ba            c.add x15 x14

No estágio de busca de instrução, o valor do PC é 10190, a instrução neste endereço é lida e a instrução é transferida para o estágio ID. Sinais de controle principais:

  • JalrE, JalE, BrE: estão todos em estado não habilitado porque não há ramificações ou saltos nas primeiras instruções.

Na fase de decodificação, o valor de A1 é 0xE, que representa o registro x14, e o valor de A2 é 0xF, que representa o registro x15. Leia os valores desses dois registros do grupo de registros e passe os valores para o estágio EX. Ao mesmo tempo, o sinal de controle correspondente à instrução add também é passado para o estágio EX. Neste momento, o sinal de controle de gravação do grupo de registradores é o sinal de gravação da instrução anterior.Para a instrução add, não há sinais de controle importantes neste estágio.

Na fase de execução, o valor do registrador entra no seletor de RegOut1E e RegOut2E. Como o operando x14 é o resultado da instrução anterior, o valor empurrado na fase de acesso à memória da instrução anterior é selecionado; o operando x15 é o resultado da instrução anterior. Selecione Gravar os resultados do stage push. AluContrlD seleciona a operação de adição, somando os dois operandos. Sinais de controle principais:

  • Forward1E: Selecione o valor empurrado para frente no estágio de acesso à memória como o valor de leitura do registro
  • ForWard2E: Selecione o valor avançado no estágio de writeback como o valor de leitura do registro
  • AluSrc1E, AluSrc2E: ambos selecionam o valor do registro
  • AluContrlD: sinal ADDOP, ALU realiza operação de adição

No estágio de acesso à memória, como não há necessidade de acessar a memória, o sinal MemWriteM fica em estado não habilitado. Os dados gravados são o resultado da operação da ALU, não o valor de PC+4. Os principais sinais são:

  • LoadNPCM: Desabilitado, seleciona o resultado da operação da ALU a ser passado para o estágio de writeback

Na fase de write-back, MemToRegW não está habilitado. O seletor seleciona o resultado da operação da ALU e o envia para a interface WD3 do grupo de registradores. A3 do grupo de registradores é o endereço (0xF) do registrador de gravação. O O sinal RegWriteW também é transmitido e conectado ao grupo de registradores. E para habilitação de gravação, escreva o resultado da adição da instrução add no registrador x15. Sinais principais:

  • RegWriteW: estado habilitado
  • MemToRegW: estado desativado, selecione o resultado da operação ALU

O caminho de dados de todo o processo é:

Insira a descrição da imagem aqui

b.bge x15, x14, -56 processo de execução de instruções

Esta instrução e as duas instruções anteriores são:

101b4:        fec42703        lw x14 -20 x8
101b8:        06300793        addi x15 x0 99
101bc:        fce7d4e3        bge x15 x14 -56

Os principais sinais no estágio de busca do índice são:

  • JalrE, JalE, BrE: estão todos em estado não habilitado porque não há ramificações ou saltos nas primeiras instruções.

Na fase de decodificação, o valor de A1 é 0xF, que representa o registro x15, e o valor de A2 é 0xE, que representa o registro x14. Leia os valores desses dois registros do conjunto de registros, passe os valores para o estágio EX e calcule o valor do PC-56 para passar para o estágio EX e também passar para o NPC como endereço de destino da ramificação. Neste momento, o PCF prevê se deve saltar. Se for feito um salto, o NPC será escrito.

Na fase de execução, os valores de x14 e x15 são atualizados pelas duas primeiras instruções, então são selecionados os valores nas fases de acesso à memória e write back, o valor do registrador de seleção de operandos e o seletor de ramificação compara os dois valores para determinar se um salto é necessário. Os principais sinais são:

  • Forward1E: Selecione o valor empurrado para frente no estágio de acesso à memória como o valor de leitura do registro
  • ForWard2E: Selecione o valor avançado no estágio de writeback como o valor de leitura do registro
  • AluSrc1E, AluSrc2E: ambos selecionam o valor do registro
  • BrType, BrE: ramo tipo bge, compare os valores dos dois operandos, se op1>=op2, BrE estiver habilitado o salto deverá ser feito, caso contrário não deverá saltar

Se um salto for previsto e a condição de ramificação for atendida e ocorrer um salto, o pipeline será liberado (o componente de colheita gera um sinal de liberação), o resultado da busca da instrução é o destino do salto e a próxima instrução da instrução bge é inválida . Se um salto for previsto e a condição de desvio não for atendida, a previsão está errada e a instrução deverá ser buscada novamente no próximo ciclo. Se a previsão não saltar e a condição não for atendida, continue com a instrução normal. Se a previsão não saltar, mas as condições forem atendidas, a previsão está errada e o alvo do salto deve ser escrito para o NPC no estágio EX. O seguinte pressupõe que a previsão não salta, mas está errada e o NPC está escrito no estágio EX.

No estágio de acesso à memória, não há necessidade de acessar a memória. O sinal MemWriteM está em um estado não habilitado. Esta instrução não escreve no registrador. Os principais sinais são:

  • LoadNPCM: Sem gravação, portanto, a seleção de quaisquer dados não tem efeito. É considerado não habilitado por padrão. O resultado da ALU é passado
    durante o estágio de write-back. Não há necessidade de gravar dados. RegWriteW não está habilitado. Sinais principais:

  • RegWriteW: estado não habilitado, sem gravação

  • MemToRegW: sem efeito

O caminho de dados de todo o processo é (nenhum salto é previsto, mas a previsão está errada, o endereço do salto é escrito no estágio EX):

Insira a descrição da imagem aqui

c.lw x15, -20 processo de execução x8

Esta instrução e as duas instruções anteriores são:

101a4:        97b6            c.add x15 x13
101a6:        e6e7a623        sw x14 -404 x15	#A[i] = A[i-1]+1000
101aa:        fec42783        lw x15 -20 x8

Os principais sinais no estágio de busca do índice são:

  • JalrE, JalE, BrE: estão todos em estado não habilitado porque não há ramificações ou saltos nas primeiras instruções.

No estágio de decodificação, o valor de A1 é 0x8, que representa o registro x8. O valor deste registro é lido do grupo de registros e passado para o estágio EX. O outro operando é um valor imediato, que é passado para o estágio EX através da unidade imediata, que não possui sinais de controle importantes.

Na fase de execução, o operando 1 seleciona o valor de x8 lido do registrador, o operando 2 seleciona o valor do valor imediato, o tipo de operação é adição e o resultado é passado para a fase de acesso à memória. Sinais principais:

  • Forward1E: Selecione o valor lido do registrador
  • ForWard2E: Sem impacto
  • AluSrc1E, AluSrc2E: OP1 seleciona o valor do registro, OP2 seleciona o valor imediato
  • AluContrl: sinal ADDOP, operação de adição

No estágio de acesso à memória, o resultado da operação da ALU é utilizado como endereço para ler o valor da memória e passá-lo para o estágio de write-back. Sinais principais:

  • LoadNPCM: sem impacto, lê dados da memória
  • MemWriteM: Desativado, leitura de dados

Na fase de write-back, o resultado do acesso à memória é transferido para o grupo de registradores e gravado no registrador x15. Sinais principais:

  • RegWriteW: habilita status, escreve para registrar
  • MemToRegW: estado habilitado, selecione o resultado do acesso à memória

O caminho de dados de todo o processo é:

Insira a descrição da imagem aqui

processo de execução de instrução d.sw x15 -20 x8

Esta instrução e as duas instruções anteriores são:

101aa:        fec42783        lw x15 -20 x8
101ae:        0785            c.addi x15 1
101b0:        fef42623        sw x15 -20 x8

Os principais sinais no estágio de busca do índice são:

  • JalrE, JalE, BrE: estão todos em estado não habilitado porque não há ramificações ou saltos nas primeiras instruções.

Na etapa de decodificação, o valor de A1 é 0x8, leia o registro x8, o valor de A2 é 0XF, leia o valor do registro x15, o outro operando é um número imediato, o processo de leitura e transferência é o mesmo que a instrução lw. Não há sinais de controle importantes.

Na fase de execução, o endereço de armazenamento precisa ser calculado.As duas primeiras instruções não foram escritas em x8, portanto o valor de x8 e o valor imediato lido na fase de decodificação são selecionados como operandos para operação. Os principais sinais são:

  • Forward1E: Selecione o valor lido do registrador
  • ForWard2E: Sem impacto
  • AluSrc1E, AluSrc2E: OP1 seleciona o valor do registro, OP2 seleciona o valor imediato
  • AluContrl: sinal ADDOP, operação de adição

Na etapa de acesso à memória é necessário escrever na memória, o valor escrito são os dados gravados pela instrução anterior e o endereço é o resultado do cálculo da ALU. Sinais principais:

  • LoadNPCM: sem impacto
  • MemWriteM: habilitação de gravação, gravação de dados

A fase de write-back não requer gravação no registro. Sinais principais:

  • RegWriteW: estado não habilitado, não há necessidade de escrever no registrador

Seu caminho de dados é:

Insira a descrição da imagem aqui

O azul é o resultado da instrução anterior no estágio de writeback, que é passada para StoreDataM como dados de gravação. A fonte de dados de StoreDataM não é mostrada no diagrama de circuito original. Deve ser a mesma que a seleção do operando na execução Você pode escolher o valor lido do registrador ou o resultado do cálculo de uma instrução anterior.

4.O papel do sinal BranchE

A função do sinal BranchE é determinar se a condição de ramificação está correta. Para instruções de desvio, os valores de rs1 e rs2 precisam ser comparados durante a fase de execução, e os dois valores são comparados de acordo com o tipo de desvio para determinar se um salto é necessário. Se um salto for necessário, o BrE o sinal estará no estado habilitado e o gerador NPC deve escrever o salto O endereço de destino da transferência. Para previsão de ramificação dinâmica, esse valor pode ter sido escrito no estágio ID. O estágio EX apenas verifica se a previsão está correta. Se falhar, a instrução deverá ser buscada novamente para liberar o pipeline.

Se a previsão estiver correta e ocorrer um salto, então a instrução após a instrução de salto é inválida, então o pipeline precisa ser liberado e a execução da próxima instrução é cancelada.Portanto, o sinal BrE também é passado para a unidade Harzard. Quando um salto é necessário, ele é recebido. A unidade Harzard do sinal de salto enviará um sinal de liberação para o registro intermediário do pipeline, liberará o pipeline, cancelará a instrução que está sendo executada e relerá a instrução no endereço de destino do salto para continuar a execução.

A previsão está selecionada e a previsão está correta

CLK1 CLK2 CLK3 CLK4 CLK5 CLK6 CLK7
pipeline i1 SE(NPC=NPC+4) ID (previsão de filial, cálculo de endereço de filial) EX (calcular condição de ramificação) MEMO Banco Mundial
pipline i2 SE (atualizar NPC com base nos resultados da previsão = NPC + 4/alvo do ramo) EU IA rubor rubor rubor
pipeline i3 SE(NPC=PC+4) ID (alvo da filial) EX MEMO Banco Mundial

A previsão está desmarcada e a previsão está correta

CLK1 CLK2 CLK3 CLK4 CLK5 CLK6 CLK7
pipeline i1 SE(NPC=NPC+4) ID (previsão de filial, cálculo de endereço de filial) EX (calcular condição de ramificação) MEMO Banco Mundial
pipline i2 SE (atualizar NPC com base nos resultados da previsão = NPC + 4/alvo do ramo) EU IA EX MEMO Banco Mundial
pipeline i3 SE(NPC=NPC+4) ID (ÚLTIMO NPC) EX MEMO Banco Mundial

5. Seleção do alvo de salto do Gerador NPC

O gerador NPC tem quatro alvos opcionais:

  • PC+4: executa a próxima instrução por padrão
  • BrT: endereço de salto de filial
  • JalrT: endereço de salto incondicional, o endereço de destino é o valor do registrador, define o bit mais baixo como 0 e é calculado durante a fase de execução
  • JalT: endereço de salto incondicional, o endereço de destino é calculado no estágio de decodificação, que é PC+Imm

Existem três sinais de habilitação correspondentes e um sinal de previsão de ramificação. Enquanto houver ramificação e habilitação de salto ou sinais de salto previsto, PC+4 não é usado como endereço inferior. A verificação do resultado do cálculo do desvio e do endereço alvo do Jalr não pode ser obtida até o estágio de execução. O endereço alvo da instrução Jal é calculado no estágio de decodificação, e o sinal de controle também é passado para o gerador NPC no estágio de decodificação Neste momento, pode haver uma das outras duas instruções na fase de execução também determinada a saltar. A instrução na fase de execução é executada primeiro, portanto deve saltar de acordo com o endereço de destino do salto da fase de execução. Portanto, , se houver sinal de habilitação, a escolha de BrT e JalrT tem precedência sobre a escolha de JalT.

instrução
BrT SE EU IA EX: BrE verdadeiro
Jal SE ID: JalE verdadeiro

Aqui BrT é o caso em que a predição não está selecionada ou a predição está errada. É o último caso em que o salto é determinado. Se o salto de predição estiver correto, o ID saltará sem conflito.

6. Unidade Harzard (questões adicionais de reflexão)

Tratamento de conflitos

Existem três tipos de conflitos no pipeline:

  • Conflito estrutural: causado por conflito de recursos
  • Conflito de dados: conflito causado por instruções adjacentes lendo e escrevendo o mesmo objeto de dados
  • Conflitos de controle: conflitos causados ​​por instruções de ramificação e salto que modificam o NPC

Usar memória de instruções e memória de dados separadas e leituras e gravações de registradores na primeira e na segunda metade de um ciclo de clock evita conflitos estruturais, mas ainda podem existir conflitos estruturais. Quando ocorre uma falha no cache de instruções, a próxima instrução não pode entrar na fase de valor. Quando ocorre uma falha no cache de dados, a próxima instrução não pode entrar na fase de acesso à memória. Portanto, quando a unidade Harzard recebe DCacheMiss ou ICacheMiss, o pipeline precisa ser pausado • Precisa fazer uma pausa para vários ciclos.

Existem três tipos de conflitos de dados: RAW, WAR e WAW. WAW e WAR não aparecerão em processadores escalares executados sequencialmente. Concentre-se em conflitos de leitura após gravação RAW. Um conflito de leitura após gravação ocorre quando o operando fonte da instrução atual é o resultado de uma instrução anterior, como na seguinte situação:

c.slli x15 2
addi x14 x8 -16
c.add x15 x14

Os valores atualizados de x15 e x14 ainda não foram escritos e a instrução add já utilizará esses dois valores durante a fase de execução. Este conflito é resolvido através do avanço de dados. Quando a unidade Harzard recebe que os sinais RegWrite e RegRead estão habilitados ao mesmo tempo, e o registro de origem e o registro de destino de gravação são os mesmos, ela seleciona o resultado do encaminhamento de dados através do sinal de encaminhamento.

Insira a descrição da imagem aqui

Existem também conflitos RAW que o forward push não consegue resolver, como segue:

lw x15 -20 x8
addi x14 x15 -16

A instrução lw lê o novo valor de x15 após o estágio de acesso à memória, mas neste momento a instrução add já está em estágio de execução e este valor é necessário. Neste momento, o pipeline só pode ser pausado. Quando a unidade Harzard recebe que MemToRegE está habilitado e o registrador rs e o registrador rd são o mesmo registrador, ela pode detectar o conflito e enviar o sinal de stall para suspender a fase de execução e todas as fases anteriores, enquanto as fases de acesso à memória e write back continuam . , você só precisa fazer uma pausa por um ciclo, os resultados do write-back podem ser empurrados de volta para o ciclo de execução e o pipeline pode continuar a funcionar.

Os conflitos de controle são causados ​​por instruções de ramificação e salto. Quando um dos BrE, JalE e JalrE está habilitado, a unidade de colheita detecta o salto de ramificação, envia um sinal de descarga e libera a peça antes da fase de execução, enquanto acessa a fase de memória e escrevendo de volta O palco continua funcionando e completando as instruções anteriores.

erro de previsão

Se o mecanismo de falha de previsão for usado, a próxima instrução será executada normalmente. Quando um salto é necessário, as duas últimas instruções são inválidas e gravadas no NPC. Para IF, ID e EX, o sinal de liberação é verdadeiro e o pipeline é liberado . Não há necessidade de pausar o pipeline. No próximo ciclo, o endereço é recuperado e novas instruções são executadas.

instrução
BrT SE EU IA EX: BrE verdadeiro -> flush
Jal SE ID: JalE verdadeiro
adicionar SE
BrTnext SE EU IA EX…

Acho que você gosta

Origin blog.csdn.net/Aaron503/article/details/130661248
Recomendado
Clasificación