You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.5 KiB
Verilog

`include "defs.v"
module gpr #(
parameter EXPAND_TYPE=`INFERRED
) (
input clk,
input [4:0] rd_adr_0,
output [31:0] rd_dat_0,
input [4:0] rd_adr_1,
output [31:0] rd_dat_1,
input [4:0] rd_adr_2,
output [31:0] rd_dat_2,
input wr_en_0,
input [4:0] wr_adr_0,
input [31:0] wr_dat_0
);
generate case (EXPAND_TYPE)
`INFERRED: begin
reg [31:0] regFile [0:31] /* verilator public */ ;
assign rd_dat_0 = regFile[rd_adr_0];
assign rd_dat_1 = regFile[rd_adr_1];
assign rd_dat_2 = regFile[rd_adr_2];
always @ (posedge clk) begin
if(wr_en_0) begin
regFile[wr_adr_0] <= wr_dat_0;
end
end
end
`GPR_2R1W: begin
/* veeerilator is parsing this when not gen'd */
DFFRF_2R1W #() regFile01 (
.CLK(clk),
.RA(rd_adr_0),
.DA(rd_dat_0),
.RB(rd_adr_1),
.DB(rd_dat_1),
.RW(wr_adr_0),
.WE(wr_en_0),
.DW(wr_dat_0)
);
// should this be a ram_32x32? any other diffs between reg/ram besides multiple we vs extra port?
DFFRF_2R1W #() regFile23 (
.CLK(clk),
.RA(rd_adr_2),
.DA(rd_dat_2),
.RB('h0),
.DB(),
.RW(wr_adr_0),
.WE(wr_en_0),
.DW(wr_dat_0)
);
end
`GPR_3R1W: begin
reg_3r1w #() regFile (
);
end
`GPR_RAM: begin
ram_32x32 #() regFile0 (
);
ram_32x32 #() regFile1 (
);
ram_32x32 #() regFile2 (
);
end
endcase
endgenerate
endmodule