l30n4rd0_

riscv pipelined

Apr 16th, 2025 (edited)
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //instancia no module riscv:
  2.   hazard_detection_unit hdu(
  3.     .ResultSrcEb0(ResultSrcEb0),
  4.     .PCSrcE(PCSrcE),
  5.     .Rs1D(Rs1D), .Rs2D(Rs2D), .RdE(RdE),
  6.     .StallF(StallF), .StallD(StallD),
  7.     .FlushD(FlushD), .FlushE(FlushE)
  8.   );
  9.  
  10.   forwarding_unit fu(
  11.     .RegWriteM(RegWriteM), .RegWriteW(RegWriteW),
  12.     .Rs1E(Rs1E), .Rs2E(Rs2E),
  13.     .RdM(RdM), .RdW(RdW),
  14.     .ForwardAE(ForwardAE), .ForwardBE(ForwardBE)
  15.   );
  16.  
  17. //modulo no final do código:
  18.  
  19. // Unidade de detecção de hazards (stall e flushes)
  20. module hazard_detection_unit(
  21.     //Indica se a instrução em execução é um LW (ResultScrE[0] == 1)
  22.     input logic ResultSrcEb0,
  23.     //indica se um desvio (beq ou jal) foi tomado na EXE
  24.     input logic PCSrcE,
  25.     //registradores fonte da instrução na fase de decode
  26.     input logic [4:0] Rs1D, Rs2D,
  27.     //registrador destino da instrução na fase de execute (possível load)
  28.     input logic [4:0] RdE,
  29.     output logic StallF, //sinal para travar o estágio de fetch
  30.     output logic StallD, //sinal para travar o estágio decode
  31.     output logic FlushD, //sinal para limpar o estágio de decode
  32.     output logic FlushE //sinal para limpar o estágio de execute
  33. );
  34.  
  35.   logic lwStall; // true se há dependência com instrução LW na fase E
  36.  
  37.   // Detecta hazard do tipo load-use: se a instrução que está em EXE for um LW
  38.   // e a próxima instrução (em Decode) precisar do resultado (usa Rs1 ou Rs2)
  39.   assign lwStall = ResultSrcEb0 && (RdE != 0) &&
  40.                    (RdE == Rs1D || RdE == Rs2D);
  41.  
  42.   // Se hazard for detectado, estagna Fetch e Decode
  43.   assign StallF = lwStall;
  44.   assign StallD = lwStall;
  45.  
  46.   // Se um desvio (branch) foi tomado, precisamos limpar a próxima instrução
  47.   assign FlushD = PCSrcE;
  48.  
  49.   // Precisamos limpar o estágio EXE em caso de load-use hazard ou branch
  50.   assign FlushE = lwStall || PCSrcE;
  51.  
  52. endmodule
  53.  
  54. // Unidade de forwarding (encaminhamento) para evitar dependências RAW (Read After Write)
  55. module forwarding_unit(
  56.   input  logic        RegWriteM,    // MEM → WB: se a instrução da fase MEM escreve no registrador
  57.   input  logic        RegWriteW,    // WB: se a instrução da fase WB escreve no registrador
  58.   input  logic [4:0]  Rs1E, Rs2E,   // Registradores fonte da instrução em execução (EXE)
  59.   input  logic [4:0]  RdM, RdW,     // Registradores destino nas fases MEM e WB
  60.   output logic [1:0]  ForwardAE,    // Seletor para encaminhamento de A (SrcA)
  61.   output logic [1:0]  ForwardBE     // Seletor para encaminhamento de B (SrcB)
  62. );
  63.  
  64.   always_comb begin
  65.     // Inicialmente, nenhum encaminhamento
  66.     ForwardAE = 2'b00;
  67.     ForwardBE = 2'b00;
  68.  
  69.     // Encaminhamento para SrcA:
  70.     // 2'b10 = valor vindo da fase MEM (ALUResultM)
  71.     if (RegWriteM && (RdM != 0) && (RdM == Rs1E))
  72.       ForwardAE = 2'b10;
  73.  
  74.     // 2'b01 = valor vindo da fase WB (ResultW)
  75.     else if (RegWriteW && (RdW != 0) && (RdW == Rs1E))
  76.       ForwardAE = 2'b01;
  77.  
  78.     // Encaminhamento para SrcB:
  79.     // 2'b10 = valor vindo da fase MEM (ALUResultM)
  80.     if (RegWriteM && (RdM != 0) && (RdM == Rs2E))
  81.       ForwardBE = 2'b10;
  82.  
  83.     // 2'b01 = valor vindo da fase WB (ResultW)
  84.     else if (RegWriteW && (RdW != 0) && (RdW == Rs2E))
  85.       ForwardBE = 2'b01;
  86.   end
  87.  
  88. endmodule
  89.  
  90.  
Advertisement
Add Comment
Please, Sign In to add comment