blob: 40cc73b3da163e766980aad5374abc3218e0478d [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
/**
* 39b General Purpose Register File (GPRs)
*
* 39b to support 32b register with 7b integrity. Integrity generation/checking implemented in
* wrapping otbn_rf_base module
*
* Features:
* - 2 read ports
* - 1 write port
*/
module otbn_rf_base_ff
import otbn_pkg::*;
#(
parameter logic [BaseIntgWidth-1:0] WordZeroVal = '0
) (
input logic clk_i,
input logic rst_ni,
input logic [4:0] wr_addr_i,
input logic wr_en_i,
input logic [BaseIntgWidth-1:0] wr_data_i,
input logic [4:0] rd_addr_a_i,
output logic [BaseIntgWidth-1:0] rd_data_a_o,
input logic [4:0] rd_addr_b_i,
output logic [BaseIntgWidth-1:0] rd_data_b_o
);
logic [BaseIntgWidth-1:0] rf_reg [NGpr];
logic [31:1] we_onehot;
// No write-enable for register 0 as writes to it are ignored
for (genvar i = 1; i < NGpr; i++) begin : g_we_onehot
assign we_onehot[i] = (wr_addr_i == i) && wr_en_i;
end
// No flops for register 0 as it's hard-wired to 0
assign rf_reg[0] = WordZeroVal;
// Generate flops for register 1 - NGpr
for (genvar i = 1; i < NGpr; i++) begin : g_rf_flops
logic [BaseIntgWidth-1:0] rf_reg_q;
always_ff @(posedge clk_i or negedge rst_ni) begin
if (!rst_ni) begin
rf_reg_q <= WordZeroVal;
end else if(we_onehot[i]) begin
rf_reg_q <= wr_data_i;
end
end
assign rf_reg[i] = rf_reg_q;
end
assign rd_data_a_o = rf_reg[rd_addr_a_i];
assign rd_data_b_o = rf_reg[rd_addr_b_i];
endmodule