Skip to content

Arquivo de Registradores

Diogo Valadares Reis dos Santos edited this page Aug 26, 2025 · 2 revisions

[English]

[← Página Anterior | Próxima Página →]

Arquivo de Registradores

O Arquivo de Registradores é o componente responsável por gerenciar os registradores de uso geral do processador. Ele armazena os dados utilizados pela maioria das instruções. O arquivo contém 32 registradores, cada um com rótulos e funções específicas conforme descrito anteriormente. Também inclui conexões com os barramentos A, B e C, além de uma entrada para os endereços dos registradores atualmente ativos.

image

O sinal de escrita do Arquivo de Registradores está ativo durante a segunda fase de cada instrução, exceto nas instruções de store, branch e load. A instrução load é uma exceção, pois sua fase de escrita é atrasada em um ciclo, conforme explicado em Temporização e Pipeline.


Dentro do Arquivo de Registradores

No Logisim, o Arquivo de Registradores é simplesmente uma encapsulação do Banco de Registradores genérico. Essa escolha de design foi feita para permitir a reutilização do Banco de Registradores em um futuro Arquivo de Registradores de Ponto Flutuante, embora esse recurso ainda não tenha sido implementado na versão atual do DRISC-V.

image

A imagem a seguir mostra parte do circuito dentro do Banco de Registradores:

image

Como o Circuito Funciona

  • O endereço C é decodificado em 32 sinais, cada um correspondente à entrada de habilitação de escrita de um registrador.
  • O decodificador só é ativado se receber um sinal da entrada de escrita.
  • Quando o clock transita de 0 para 1 e o sinal de escrita está ativo, o registrador selecionado recebe os dados da entrada C.
  • A saída de cada registrador está conectada a dois multiplexadores:
    • Um para o barramento A
    • Um para o barramento B
  • Cada multiplexador recebe um endereço para determinar qual registrador será selecionado para saída.

Código SystemVerilog

`timescale 1s/1s
//entradas e saídas
module register_file(
    input clock,
    input reset,
    input write,
    input [4:0] a_address,
    input [4:0] b_address,
    input [4:0] c_address,
    input [31:0] c_in,
    output [31:0] a_out,
    output [31:0] b_out
);
//registradores
    reg [31:0] registers [0:31];

    assign a_out = registers[a_address];
    assign b_out = registers[b_address];

    always @(posedge clock) begin
//define todos os registradores como 0.
        if (reset) begin
            integer i;
            for (i = 0; i < 32; i = i + 1) begin
                registers[i] <= 32'b0;
            end
        end
//na versão SystemVerilog, em vez de fixar o registrador x0 como 0, simplesmente não escrevemos nele
        else if (write && c_address != 5'd0) begin
            registers[c_address] <= c_in;
        end
    end

endmodule

Clone this wiki locally