`timescale 1ns / 1ps module RegisterFile ( input clk, input [4:0] read_addr1, input [4:0] read_addr2, input write_enable, input [4:0] write_addr, input [31:0] write_data, input write_ra, input [4:0] write_ra_addr, input [31:0] write_ra_data, output [31:0] read_output1, output [31:0] read_output2 ); reg [31:0] registers[31:1]; assign read_output1 = (read_addr1 == 5'b00000) ? 32'h00000000 : (read_addr1 == write_ra_addr) ? write_ra_data : (read_addr1 == write_addr) ? write_data : registers[read_addr1]; assign read_output2 = (read_addr2 == 5'b00000) ? 32'h00000000 : (read_addr2 == write_ra_addr) ? write_ra_data : (read_addr2 == write_addr) ? write_data : registers[read_addr2]; always @(posedge clk) begin if (write_addr == write_ra_addr) begin if (write_ra) begin registers[write_ra_addr] <= write_ra_data; end else begin if (write_enable) begin registers[write_addr] <= write_data; end end end else begin if (write_ra) begin registers[write_ra_addr] <= write_ra_data; end if (write_enable) begin registers[write_addr] <= write_data; end end end endmodule