blob: 3c369e2174329d30a73348246df47cb309cf1cb3 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Register slice conforming to Comportibility guide.
module prim_subreg
import prim_subreg_pkg::*;
#(
parameter int DW = 32,
parameter sw_access_e SwAccess = SwAccessRW,
parameter logic [DW-1:0] RESVAL = '0 // reset value
) (
input clk_i,
input rst_ni,
// From SW: valid for RW, WO, W1C, W1S, W0C, RC
// In case of RC, Top connects Read Pulse to we
input we,
input [DW-1:0] wd,
// From HW: valid for HRW, HWO
input de,
input [DW-1:0] d,
// output to HW and Reg Read
output logic qe,
output logic [DW-1:0] q,
output logic [DW-1:0] qs
);
logic wr_en;
logic [DW-1:0] wr_data;
prim_subreg_arb #(
.DW ( DW ),
.SwAccess ( SwAccess )
) wr_en_data_arb (
.we,
.wd,
.de,
.d,
.q,
.wr_en,
.wr_data
);
logic wr_en_buf;
prim_buf #(
.Width(1)
) u_wr_en_buf (
.in_i(wr_en),
.out_o(wr_en_buf)
);
// feed back out for consolidation
assign qe = wr_en_buf;
always_ff @(posedge clk_i or negedge rst_ni) begin
if (!rst_ni) begin
q <= RESVAL;
end else if (wr_en_buf) begin
q <= wr_data;
end
end
logic [DW-1:0] q_buf;
prim_buf #(
.Width(DW)
) u_q_buf (
.in_i(q),
.out_o(q_buf)
);
assign qs = q_buf;
endmodule