[rtl] Switch FF RF to use unpacked arrays

Previously it had two packed dimensions. In general we prefer the use of
unpacked arrays for this kind of usage. In particular this had an impact
on trace viewing in GTKWave, the two dimensions were flattened into a
single large bus which made determining individual register values
tricky.
This commit is contained in:
Greg Chadwick 2022-09-21 09:10:44 +01:00 committed by Greg Chadwick
parent d35ff67df6
commit 163ed7ec9b

View file

@ -45,9 +45,8 @@ module ibex_register_file_ff #(
localparam int unsigned ADDR_WIDTH = RV32E ? 4 : 5;
localparam int unsigned NUM_WORDS = 2**ADDR_WIDTH;
logic [NUM_WORDS-1:0][DataWidth-1:0] rf_reg;
logic [NUM_WORDS-1:1][DataWidth-1:0] rf_reg_q;
logic [NUM_WORDS-1:0] we_a_dec;
logic [DataWidth-1:0] rf_reg [NUM_WORDS];
logic [NUM_WORDS-1:0] we_a_dec;
always_comb begin : we_a_decoder
for (int unsigned i = 0; i < NUM_WORDS; i++) begin
@ -88,13 +87,17 @@ module ibex_register_file_ff #(
// No flops for R0 as it's hard-wired to 0
for (genvar i = 1; i < NUM_WORDS; i++) begin : g_rf_flops
logic [DataWidth-1:0] rf_reg_q;
always_ff @(posedge clk_i or negedge rst_ni) begin
if (!rst_ni) begin
rf_reg_q[i] <= WordZeroVal;
rf_reg_q <= WordZeroVal;
end else if (we_a_dec[i]) begin
rf_reg_q[i] <= wdata_a_i;
rf_reg_q <= wdata_a_i;
end
end
assign rf_reg[i] = rf_reg_q;
end
// With dummy instructions enabled, R0 behaves as a real register but will always return 0 for
@ -126,8 +129,6 @@ module ibex_register_file_ff #(
assign rf_reg[0] = WordZeroVal;
end
assign rf_reg[NUM_WORDS-1:1] = rf_reg_q[NUM_WORDS-1:1];
assign rdata_a_o = rf_reg[raddr_a_i];
assign rdata_b_o = rf_reg[raddr_b_i];