1
0
mirror of https://github.com/olofk/serv.git synced 2026-04-27 12:48:42 +00:00
Files
olofk.serv/rtl/serv_rf_2bit.v
2019-11-20 18:26:04 +01:00

134 lines
2.4 KiB
Verilog

`default_nettype none
module serv_rf_2bit
(
input wire i_clk,
input wire i_rst,
input wire i_wreq,
input wire i_rreq,
output reg o_rgnt,
input wire [5:0] i_wreg0,
input wire [5:0] i_wreg1,
input wire i_wen0,
input wire i_wen1,
input wire i_wdata0,
input wire i_wdata1,
input wire [5:0] i_rreg0,
input wire [5:0] i_rreg1,
output wire o_rdata0,
output wire o_rdata1);
/*
********** Write side ***********
*/
reg [4:0] wcnt;
reg wgo;
wire [3:0] wslot = wcnt[4:1];
wire wport = wcnt[0];
reg wdata0_r;
reg wdata1_r;
reg wdata1_2r;
wire [1:0] wdata = !wport ?
{i_wdata0, wdata0_r} :
{wdata1_r, wdata1_2r};
wire [5:0] wreg = wport ? i_wreg1 : i_wreg0;
wire [9:0] waddr = {wreg, wslot};
wire wen = wgo & (wport ? wen1_r : wen0_r);
reg wreq_r;
reg wen0_r;
reg wen1_r;
always @(posedge i_clk) begin
wen0_r <= i_wen0;
wen1_r <= i_wen1;
wreq_r <= i_wreq;
wdata0_r <= i_wdata0;
wdata1_r <= i_wdata1;
wdata1_2r <= wdata1_r;
if (wgo)
wcnt <= wcnt+5'd1;
if (wreq_r)
wgo <= 1'b1;
if (wcnt == 5'b11111)
wgo <= 1'b0;
if (i_rst) begin
wcnt <= 5'd0;
end
end
/*
********** Read side ***********
*/
reg [4:0] rcnt;
wire [3:0] rslot = rcnt[4:1];
wire rport = rcnt[0];
wire [5:0] rreg = rport ? i_rreg1 : i_rreg0;
wire [9:0] raddr = {rreg, rslot};
reg [1:0] rdata;
reg [1:0] rdata0;
reg rdata1;
assign o_rdata0 = !rport ? rdata0[0] : rdata0[1];
assign o_rdata1 = rport ? rdata1 : rdata[0];
reg rreq_r;
always @(posedge i_clk) begin
rcnt <= rcnt+5'd1;
if (i_rreq)
rcnt <= 5'd0;
rreq_r <= i_rreq;
o_rgnt <= rreq_r;
if (rport)
rdata0 <= rdata;
if (!rport)
rdata1 <= rdata[1];
if (i_rst) begin
o_rgnt <= 1'b0;
rreq_r <= 1'b0;
end
end
reg [1:0] memory [0:575];
always @(posedge i_clk) begin
if (wen)
`ifdef RISCV_FORMAL
if (!i_rst)
`endif
memory[waddr] <= wdata;
rdata <= memory[raddr];
end
`ifdef RISCV_FORMAL
`define SERV_CLEAR_RAM
`endif
`ifdef SERV_CLEAR_RAM
integer i;
initial
for (i=0;i<512;i=i+1)
memory[i] = 2'd0;
`endif
endmodule