blob: 51373ca3701d78bf6ec817e645a2af7fb19e65d0 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
// Spurious write-enable checker for autogenerated CSR node.
// This module has additional simulation features for error injection testing.
`include "prim_assert.sv"
module prim_reg_we_check #(
parameter int unsigned OneHotWidth = 32
) (
// The module is combinational - the clock and reset are only used for assertions.
input clk_i,
input rst_ni,
input logic [OneHotWidth-1:0] oh_i,
input logic en_i,
output logic err_o
);
// Prevent optimization of the onehot input buffer.
logic [OneHotWidth-1:0] oh_buf;
prim_buf #(
.Width(OneHotWidth)
) u_prim_buf (
.in_i(oh_i),
.out_o(oh_buf)
);
prim_onehot_check #(
.OneHotWidth(OneHotWidth),
.AddrWidth (prim_util_pkg::vbits(OneHotWidth)),
.EnableCheck(1),
// Since certain peripherals may have a very large address space
// (e.g. > 20bit), the inverse address decoding check (which is
// essentially an indexing operation) does not scale well and is
// hence omitted.
.AddrCheck(0),
// Due to REGWEN masking of write enable strobes,
// we do not perform strict checks. I.e., we allow cases
// where en_i is set to 1, but the oh_i vector is all-zeroes.
.StrictCheck(0)
) u_prim_onehot_check (
.clk_i,
.rst_ni,
.oh_i(oh_buf),
.addr_i('0),
.en_i,
.err_o
);
endmodule : prim_reg_we_check