65 lines
1.4 KiB
Systemverilog
65 lines
1.4 KiB
Systemverilog
// 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 #(
|
|
parameter int DW = 32 ,
|
|
parameter SWACCESS = "RW", // {RW, RO, WO, W1C, W1S, W0C, RC}
|
|
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
|
|
);
|
|
|
|
always_ff @(posedge clk_i or negedge rst_ni) begin
|
|
if (!rst_ni) begin
|
|
qe <= 1'b0;
|
|
end else begin
|
|
qe <= we;
|
|
end
|
|
end
|
|
|
|
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
|
|
|
|
assign qs = q;
|
|
|
|
endmodule
|