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.
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.
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.
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.
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:
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.
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.
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.
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.
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.
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.
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 .
unidade de controle
A unidade de controle é a seguinte:
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 é:
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):
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 é:
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 é:
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.
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… |