blob: 1215e430f92e07f526f290271a7704d5eaf61bdf [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,
// ds and qs have slightly different timing.
// ds is the data that will be written into the flop,
// while qs is the current flop value exposed to software.
output logic [DW-1:0] ds,
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
);
always_ff @(posedge clk_i or negedge rst_ni) begin
if (!rst_ni) begin
q <= RESVAL;
end else if (wr_en) begin
q <= wr_data;
end
end
// feed back out for consolidation
assign ds = wr_en ? wr_data : qs;
assign qe = wr_en;
assign qs = q;
endmodule