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
|