| // 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 |