Para implementar a ideia de Pipeline, introduzimos quatro registradores de buffer entre cada estágio.
Register A: registrador entre os estágios IF e ID.Register B: registrador entre os estágios ID e EX.Register C: registrador entre os estágios EX e MEM.Register D: registrador entre os estágios MEM e WB.
Todos os quatro registradores de buffer serão atualizados na borda positiva do sinal de clock (posedge). Além disso, no início, que corresponde à borda positiva do sinal de reset, todos os 4 registradores serão definidos como 0.
Neste estágio, a Memória de Instrução buscará a instrução específica de acordo com o valor gerado pelo PC. As instruções do programa são inicializadas na memória por meio de um arquivo instruction.mif.
- Para mais informações, consulte o README.md do diretório
verif.
Em seguida, na borda positiva do ciclo de clock seguinte, essa instrução será gravada no Register A para que um novo código de instrução possa ser buscado.
Um multiplexador 2 para 1 controla o valor que deve ser usado para buscar a instrução no próximo ciclo de clock.
- A primeira opção é o PC atual + 4.
- A segunda opção é o valor do PC gerado pela Unidade de Branch, que é selecionado somente quando o branch for tomado. O controle do multiplexador também vem da Unidade de Branch.
Neste estágio, o código da instrução adquirida do Register A será dividido em diferentes partes e usado pelo controlador, gerador de imediatos e banco de registradores. Em vez de conectar esses controles e dados lidos diretamente a diferentes unidades de operação, armazenamos eles no Register B para uso posterior.
Neste estágio, usamos os sinais de dados e controle do Register B para controlar a Unidade de Branch e a ALU.
A Unidade de Branch projetada é responsável pelo cálculo do próximo valor do PC se uma instrução de branch for buscada no estágio IF. Se a instrução de BRANCH for tomada, a saída PcSel será definida como 1.
Quanto ao novo valor do PC (saída BrPc), ele será definido como PC+Imm se o BRANCH for tomado.
Tanto BrPC quanto PcSel serão conectados diretamente ao multiplexador PcSel. Isso significa que, sempre que a Unidade de Branch concluir seu trabalho, o multiplexador de seleção do PC terá tudo o que precisa. No entanto, o processador ainda precisa aguardar até a próxima borda positiva para fazer a seleção real. Portanto, cada instrução de branch tomada precisará descartar 2 instruções pré-processadas nos estágios IF e ID naquele momento.
Dois multiplexadores de seleção de forwarding são adicionados às entradas SrcA e SrcB da ALU.
- Se não houver hazard, o multiplexador selecionará
RD1eRD2doRegister B. - Se ocorrer um hazard EX, o multiplexador selecionará
AluResultparaSrcAouSrcB. - Se ocorrer um hazard MEM, o multiplexador selecionará
WB-DataparaSrcAouSrcB.
Os sinais de controle e dados vêm do Register C.
Nesta etapa, um multiplexador 4 para 1 selecionará o sinal correto que deve ser escrito no registrador, se a escrita for necessária.
- Observação: se uma instrução descartada entrar neste estágio, o sinal
WB-Dataainda pode ter um valor incorreto, mas isso não significa nada e não afetará o RegFile.
Uma Unidade de Detecção de Hazards é adicionada ao datapath do pipeline. Se um hazard de dependência de dados for detectado, um sinal de stall será gerado e enviado ao PC, Register A e Register B.
-
O PC verifica o sinal de stall a cada borda positiva do clock. Sempre que esse sinal tiver o valor 1, a saída do PC não será alterada.
-
Register Averifica o sinal de stall a cada borda positiva do clock. Sempre que esse sinal tiver o valor 1, oRegister Anão será atualizado nesse momento, mas manterá os dados atuais. Isso funciona como uma paralisação da instrução atual no estágio ID, o que significa uma espera de um ciclo. -
Register Bverifica o sinal de stall a cada borda positiva do clock. Sempre que esse sinal tiver o valor 1, oRegister Besvaziará todos os dados armazenados dentro dele para evitar que a instrução atual entre no próximo estágio, o que funciona como uma instrução NOP.
O sinal de descarte funciona de maneira semelhante ao sinal de stall no PC, Register A e Register B, mas é gerado pela Unidade de Branch. O objetivo de ter esse sinal é descartar instruções incorretas que foram buscadas e executadas antes de qualquer instrução de branch tomada.
-
O PC verifica o sinal de stall a cada borda positiva do clock. Sempre que esse sinal tiver o valor 1, a saída do PC não será alterada.
-
Os
Registers AeBverificam o sinal de stall a cada borda positiva do clock. Sempre que esse sinal tiver o valor 1, osRegistersesvaziarão todos os dados armazenados dentro deles para evitar que dados inválidos entrem no próximo estágio, o que também funciona como uma instrução NOP.
