data/full_repos/permissive/447681894/pythondata_cpu_marocchino/verilog/rtl/verilog/or1k_marocchino_rat_cell.v
data/verilator_xmls/8cf8d83d-0c0d-441e-b753-d9de968f934c.xml
module or1k_marocchino_rat_cell
#(
  parameter OPTION_RF_ADDR_WIDTH =  5,
  parameter DEST_EXTADR_WIDTH    =  3,
  parameter GPR_ADDR             =  0
)
(

  input                                 cpu_clk,


  input                                 padv_exec_i,
  input                                 padv_wrbk_i,
  input                                 pipeline_flush_i,



  input                                 dcod_rfd1_we_i,
  input      [OPTION_RF_ADDR_WIDTH-1:0] dcod_rfd1_adr_i,

  input                                 dcod_rfd2_we_i,
  input      [OPTION_RF_ADDR_WIDTH-1:0] dcod_rfd2_adr_i,

  input         [DEST_EXTADR_WIDTH-1:0] dcod_extadr_i,


  input         [DEST_EXTADR_WIDTH-1:0] exec_extadr_i,


  output reg                            rat_rd1_alloc_o,
  output reg                            rat_rd2_alloc_o,
  output reg    [DEST_EXTADR_WIDTH-1:0] rat_extadr_o
);

  localparam [OPTION_RF_ADDR_WIDTH-1:0] GPR_ADR = GPR_ADDR;


  wire set_rd1_alloc = dcod_rfd1_we_i & (dcod_rfd1_adr_i == GPR_ADR);
  wire set_rd2_alloc = dcod_rfd2_we_i & (dcod_rfd2_adr_i == GPR_ADR);
  wire set_rdx_alloc = (set_rd1_alloc | set_rd2_alloc);


  wire rat_alloc_at_wrbk     = (rat_extadr_o != exec_extadr_i);

  wire rat_rd1_alloc_at_wrbk = rat_rd1_alloc_o & rat_alloc_at_wrbk;
  wire rat_rd2_alloc_at_wrbk = rat_rd2_alloc_o & rat_alloc_at_wrbk;


  always @(posedge cpu_clk) begin
    if (pipeline_flush_i) begin
      rat_rd1_alloc_o <= 1'b0;
      rat_rd2_alloc_o <= 1'b0;
    end
    else begin
      case ({padv_wrbk_i, padv_exec_i})

        2'b00: begin
        end

        2'b01: begin
          rat_rd1_alloc_o <= set_rdx_alloc ? set_rd1_alloc : rat_rd1_alloc_o;
          rat_rd2_alloc_o <= set_rdx_alloc ? set_rd2_alloc : rat_rd2_alloc_o;
        end

        2'b10: begin
          rat_rd1_alloc_o <= rat_rd1_alloc_at_wrbk;
          rat_rd2_alloc_o <= rat_rd2_alloc_at_wrbk;
        end

        2'b11: begin
          rat_rd1_alloc_o <= set_rdx_alloc ? set_rd1_alloc : rat_rd1_alloc_at_wrbk;
          rat_rd2_alloc_o <= set_rdx_alloc ? set_rd2_alloc : rat_rd2_alloc_at_wrbk;
        end
      endcase
    end
  end


  always @(posedge cpu_clk) begin
    if (padv_exec_i)
      rat_extadr_o <= set_rdx_alloc ? dcod_extadr_i : rat_extadr_o;
  end

endmodule
module or1k_marocchino_rat_cell
#(
  parameter OPTION_RF_ADDR_WIDTH =  5,
  parameter DEST_EXTADR_WIDTH    =  3,
  parameter GPR_ADDR             =  0
)
(

  input                                 cpu_clk,


  input                                 padv_exec_i,
  input                                 padv_wrbk_i,
  input                                 pipeline_flush_i,



  input                                 dcod_rfd1_we_i,
  input      [OPTION_RF_ADDR_WIDTH-1:0] dcod_rfd1_adr_i,

  input                                 dcod_rfd2_we_i,
  input      [OPTION_RF_ADDR_WIDTH-1:0] dcod_rfd2_adr_i,

  input         [DEST_EXTADR_WIDTH-1:0] dcod_extadr_i,


  input         [DEST_EXTADR_WIDTH-1:0] exec_extadr_i,


  output reg                            rat_rd1_alloc_o,
  output reg                            rat_rd2_alloc_o,
  output reg    [DEST_EXTADR_WIDTH-1:0] rat_extadr_o
);


  localparam [OPTION_RF_ADDR_WIDTH-1:0] GPR_ADR = GPR_ADDR;


  wire set_rd1_alloc = dcod_rfd1_we_i & (dcod_rfd1_adr_i == GPR_ADR);
  wire set_rd2_alloc = dcod_rfd2_we_i & (dcod_rfd2_adr_i == GPR_ADR);
  wire set_rdx_alloc = (set_rd1_alloc | set_rd2_alloc);


  wire rat_alloc_at_wrbk     = (rat_extadr_o != exec_extadr_i);

  wire rat_rd1_alloc_at_wrbk = rat_rd1_alloc_o & rat_alloc_at_wrbk;
  wire rat_rd2_alloc_at_wrbk = rat_rd2_alloc_o & rat_alloc_at_wrbk;


  always @(posedge cpu_clk) begin
    if (pipeline_flush_i) begin
      rat_rd1_alloc_o <= 1'b0;
      rat_rd2_alloc_o <= 1'b0;
    end
    else begin
      case ({padv_wrbk_i, padv_exec_i})

        2'b00: begin
        end

        2'b01: begin
          rat_rd1_alloc_o <= set_rdx_alloc ? set_rd1_alloc : rat_rd1_alloc_o;
          rat_rd2_alloc_o <= set_rdx_alloc ? set_rd2_alloc : rat_rd2_alloc_o;
        end

        2'b10: begin
          rat_rd1_alloc_o <= rat_rd1_alloc_at_wrbk;
          rat_rd2_alloc_o <= rat_rd2_alloc_at_wrbk;
        end

        2'b11: begin
          rat_rd1_alloc_o <= set_rdx_alloc ? set_rd1_alloc : rat_rd1_alloc_at_wrbk;
          rat_rd2_alloc_o <= set_rdx_alloc ? set_rd2_alloc : rat_rd2_alloc_at_wrbk;
        end
      endcase
    end
  end


  always @(posedge cpu_clk) begin
    if (padv_exec_i)
      rat_extadr_o <= set_rdx_alloc ? dcod_extadr_i : rat_extadr_o;
  end

endmodule