blob: dd0a669e0d053aab4dd32af366b6534f235c8823 [file] [log] [blame]
/* registers.v
*
* Copyright (c) 2022 Brown Deer Technology, LLC. (www.browndeertechnology.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* DAR */
module registers(
input clk,
input run,
input we,
input [RBITS-1:0] rd,
input [RBITS-1:0] rs1,
input [RBITS-1:0] rs2,
input [BITS-1:0] rd_din,
output reg [BITS-1:0] rs1_dout,
output reg [BITS-1:0] rs2_dout
// input [RBITS-1:0] debug_reg_sel,
// output reg [BITS-1:0] debug_reg_dout
);
parameter BITS = 16;
parameter RBITS = 4;
parameter NREG = 16;
reg [BITS-1:0] r1;
reg [BITS-1:0] r2;
reg [BITS-1:0] r3;
reg [BITS-1:0] r4;
reg [BITS-1:0] r5;
reg [BITS-1:0] r6;
reg [BITS-1:0] r7;
reg [BITS-1:0] r8;
reg [BITS-1:0] r9;
reg [BITS-1:0] r10;
reg [BITS-1:0] r11;
reg [BITS-1:0] r12;
reg [BITS-1:0] r13;
reg [BITS-1:0] r14;
reg [BITS-1:0] r15;
always @ (posedge clk)
begin
if (run & we & (rd==4'b0001))
r1 <= rd_din;
else
r1 <= r1;
if (run & we & (rd==4'b0010))
r2 <= rd_din;
else
r2 <= r2;
if (run & we & (rd==4'b0011))
r3 <= rd_din;
else
r3 <= r3;
if (run & we & (rd==4'b0100))
r4 <= rd_din;
else
r4 <= r4;
if (run & we & (rd==4'b0101))
r5 <= rd_din;
else
r5 <= r5;
if (run & we & (rd==4'b0110))
r6 <= rd_din;
else
r6 <= r6;
if (run & we & (rd==4'b0111))
r7 <= rd_din;
else
r7 <= r7;
if (run & we & (rd==4'b1000))
r8 <= rd_din;
else
r8 <= r8;
if (run & we & (rd==4'b1001))
r9 <= rd_din;
else
r9 <= r9;
if (run & we & (rd==4'b1010))
r10 <= rd_din;
else
r10 <= r10;
if (run & we & (rd==4'b1011))
r11 <= rd_din;
else
r11 <= r11;
if (run & we & (rd==4'b1100))
r12 <= rd_din;
else
r12 <= r12;
if (run & we & (rd==4'b1101))
r13 <= rd_din;
else
r13 <= r13;
if (run & we & (rd==4'b1110))
r14 <= rd_din;
else
r14 <= r14;
if (run & we & (rd==4'b1111))
r15 <= rd_din;
else
r15 <= r15;
end
/// read register
always @ (*)
begin
case (rs1)
4'b0000: rs1_dout = 'd0;
4'b0001: rs1_dout = r1;
4'b0010: rs1_dout = r2;
4'b0011: rs1_dout = r3;
4'b0100: rs1_dout = r4;
4'b0101: rs1_dout = r5;
4'b0110: rs1_dout = r6;
4'b0111: rs1_dout = r7;
4'b1000: rs1_dout = r8;
4'b1001: rs1_dout = r9;
4'b1010: rs1_dout = r10;
4'b1011: rs1_dout = r11;
4'b1100: rs1_dout = r12;
4'b1101: rs1_dout = r13;
4'b1110: rs1_dout = r14;
4'b1111: rs1_dout = r15;
endcase
case (rs2)
4'b0000: rs2_dout = 'd0;
4'b0001: rs2_dout = r1;
4'b0010: rs2_dout = r2;
4'b0011: rs2_dout = r3;
4'b0100: rs2_dout = r4;
4'b0101: rs2_dout = r5;
4'b0110: rs2_dout = r6;
4'b0111: rs2_dout = r7;
4'b1000: rs2_dout = r8;
4'b1001: rs2_dout = r9;
4'b1010: rs2_dout = r10;
4'b1011: rs2_dout = r11;
4'b1100: rs2_dout = r12;
4'b1101: rs2_dout = r13;
4'b1110: rs2_dout = r14;
4'b1111: rs2_dout = r15;
endcase
end
/*
always @ (*)
begin
case(debug_reg_sel)
4'b0000: debug_reg_dout = 'd0;
4'b0001: debug_reg_dout = r1;
4'b0010: debug_reg_dout = r2;
4'b0011: debug_reg_dout = r3;
4'b0100: debug_reg_dout = r4;
4'b0101: debug_reg_dout = r5;
4'b0110: debug_reg_dout = r6;
4'b0111: debug_reg_dout = r7;
4'b1000: debug_reg_dout = r8;
4'b1001: debug_reg_dout = r9;
4'b1010: debug_reg_dout = r10;
4'b1011: debug_reg_dout = r11;
4'b1100: debug_reg_dout = r12;
4'b1101: debug_reg_dout = r13;
4'b1110: debug_reg_dout = r14;
4'b1111: debug_reg_dout = r15;
endcase
end
*/
endmodule