blob: 1831b39ef4775f48193c7443f93dd3bf5c0e44f5 [file] [log] [blame]
Andrew Attwood1d1e8c32021-11-26 15:05:07 +00001// Copyright lowRISC contributors.
2// Copyright 2017 ETH Zurich and University of Bologna.
3// Licensed under the Apache License, Version 2.0, see LICENSE for details.
4// SPDX-License-Identifier: Apache-2.0
5
6////////////////////////////////////////////////////////////////////////////////
7// Engineer: Matthias Baer - baermatt@student.ethz.ch //
8// //
9// Additional contributions by: //
10// Sven Stucki - svstucki@student.ethz.ch //
11// //
12// //
13// Design Name: RISC-V processor core //
14// Project Name: ibex //
15// Language: SystemVerilog //
16// //
17// Description: Defines for various constants used by the processor core. //
18// //
19////////////////////////////////////////////////////////////////////////////////
20
nguyendao-uom4b10c632021-11-25 11:23:15 +000021module ibex_register_file (
22 clk,
23 rst_n,
24 test_en_i,
25 raddr_a_i,
26 rdata_a_o,
27 raddr_b_i,
28 rdata_b_o,
29 waddr_a_i,
30 wdata_a_i,
31 we_a_i
32);
33 parameter [0:0] RV32E = 0;
34 parameter DATA_WIDTH = 32;
35 input wire clk;
36 input wire rst_n;
37 input wire test_en_i;
38 input wire [4:0] raddr_a_i;
39 output wire [DATA_WIDTH - 1:0] rdata_a_o;
40 input wire [4:0] raddr_b_i;
41 output wire [DATA_WIDTH - 1:0] rdata_b_o;
42 input wire [4:0] waddr_a_i;
43 input wire [DATA_WIDTH - 1:0] wdata_a_i;
44 input wire we_a_i;
45 localparam ADDR_WIDTH = (RV32E ? 4 : 5);
46 localparam NUM_WORDS = 2 ** ADDR_WIDTH;
47 wire [(NUM_WORDS * DATA_WIDTH) - 1:0] rf_reg;
48 reg [((NUM_WORDS - 1) >= 1 ? ((NUM_WORDS - 1) * DATA_WIDTH) + (DATA_WIDTH - 1) : ((3 - NUM_WORDS) * DATA_WIDTH) + (((NUM_WORDS - 1) * DATA_WIDTH) - 1)):((NUM_WORDS - 1) >= 1 ? DATA_WIDTH : (NUM_WORDS - 1) * DATA_WIDTH)] rf_reg_tmp;
49 reg [NUM_WORDS - 1:1] we_a_dec;
50 always @(*) begin : we_a_decoder
51 begin : sv2v_autoblock_2
52 reg signed [31:0] i;
53 for (i = 1; i < NUM_WORDS; i = i + 1)
54 we_a_dec[i] = (waddr_a_i == i ? we_a_i : 1'b0);
55 end
56 end
57 function automatic [DATA_WIDTH - 1:0] sv2v_cast_2E65F;
58 input reg [DATA_WIDTH - 1:0] inp;
59 sv2v_cast_2E65F = inp;
60 endfunction
61 always @(posedge clk or negedge rst_n)
62 if (!rst_n)
63 rf_reg_tmp <= {((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS) {sv2v_cast_2E65F(1'sb0)}};
64 else begin : sv2v_autoblock_3
65 reg signed [31:0] r;
66 for (r = 1; r < NUM_WORDS; r = r + 1)
67 if (we_a_dec[r])
68 rf_reg_tmp[((NUM_WORDS - 1) >= 1 ? r : 1 - (r - (NUM_WORDS - 1))) * DATA_WIDTH+:DATA_WIDTH] <= wdata_a_i;
69 end
70 assign rf_reg[0+:DATA_WIDTH] = {DATA_WIDTH {1'sb0}};
71 assign rf_reg[DATA_WIDTH * (((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1) - (((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS) - 1))+:DATA_WIDTH * ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)] = rf_reg_tmp[DATA_WIDTH * ((NUM_WORDS - 1) >= 1 ? ((NUM_WORDS - 1) >= 1 ? ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1) - (((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS) - 1) : ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1)) : 1 - (((NUM_WORDS - 1) >= 1 ? ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1) - (((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS) - 1) : ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : ((NUM_WORDS - 1) + ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)) - 1)) - (NUM_WORDS - 1)))+:DATA_WIDTH * ((NUM_WORDS - 1) >= 1 ? NUM_WORDS - 1 : 3 - NUM_WORDS)];
72 assign rdata_a_o = rf_reg[raddr_a_i * DATA_WIDTH+:DATA_WIDTH];
73 assign rdata_b_o = rf_reg[raddr_b_i * DATA_WIDTH+:DATA_WIDTH];
74endmodule