-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreg_file.v
More file actions
45 lines (45 loc) · 1.58 KB
/
reg_file.v
File metadata and controls
45 lines (45 loc) · 1.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
module reg_file (
input wire clk,
input wire rst,
// Read ports
input wire [2:0] read_addr_0,
input wire [2:0] read_addr_1,
output wire [15:0] read_data_0,
output wire [15:0] read_data_1,
// Write ports
input wire reg_write_en, // Enable writing to registers
input wire [1:0] write_mode, // 00: no write, 01: write through port 1, 11: write through port 1 and port 2
input wire [2:0] reg_write_addr_0, // Address for first register to write
input wire [2:0] reg_write_addr_1, // Address for second register to write (for high byte in multi-register ops)
input wire [15:0] data_in_0, // Data to write to first register
input wire [15:0] data_in_1 // Data to write to second register
);
// Register file array
reg [15:0] registers[0:7];
always @(posedge clk or posedge rst) begin
if (rst) begin
// Reset all registers to 0
registers[0] <= 16'b0;
registers[1] <= 16'b0;
registers[2] <= 16'b0;
registers[3] <= 16'b0;
registers[4] <= 16'b0;
registers[5] <= 16'b0;
registers[6] <= 16'b0;
registers[7] <= 16'b0;
end
else if (reg_write_en) begin
case (write_mode)
2'b01: registers[reg_write_addr_0] <= data_in_0;
2'b11: begin
registers[reg_write_addr_0] <= data_in_0;
registers[reg_write_addr_1] <= data_in_1;
end
default: begin
end
endcase
end
end
assign read_data_0 = registers[read_addr_0];
assign read_data_1 = registers[read_addr_1];
endmodule