Andrew Attwood | 1d1e8c3 | 2021-11-26 15:05:07 +0000 | [diff] [blame^] | 1 | // 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-uom | 4b10c63 | 2021-11-25 11:23:15 +0000 | [diff] [blame] | 21 | module 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]; |
| 74 | endmodule |