// Copyright lowRISC contributors. // Licensed under the Apache License, Version 2.0, see LICENSE for details. // SPDX-License-Identifier: Apache-2.0 /** * Control / status register primitive */ `include "prim_assert.sv" module ibex_csr #( parameter int unsigned Width = 32, parameter bit ShadowCopy = 1'b0, parameter bit [Width-1:0] ResetValue = '0 ) ( input logic clk_i, input logic rst_ni, input logic [Width-1:0] wr_data_i, input logic wr_en_i, output logic [Width-1:0] rd_data_o, output logic rd_error_o ); logic [Width-1:0] rdata_q; always_ff @(posedge clk_i or negedge rst_ni) begin if (!rst_ni) begin rdata_q <= ResetValue; end else if (wr_en_i) begin rdata_q <= wr_data_i; end end assign rd_data_o = rdata_q; if (ShadowCopy) begin : gen_shadow logic [Width-1:0] shadow_q; always_ff @(posedge clk_i or negedge rst_ni) begin if (!rst_ni) begin shadow_q <= ~ResetValue; end else if (wr_en_i) begin shadow_q <= ~wr_data_i; end end assign rd_error_o = rdata_q != ~shadow_q; end else begin : gen_no_shadow assign rd_error_o = 1'b0; end `ASSERT_KNOWN(IbexCSREnValid, wr_en_i) endmodule