blob: 2b3cce93de98353beca00861bd176890edee4818 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Perform logical OR or AND between two life cycle multibit signals.
module prim_lc_combine #(
// 0: use the ON value as active value for the logical combination
// 1: use the OFF value as active value for the logical combination
parameter bit ActiveLow = 0,
// 0: logical combination is an OR function
// 1: logical combination is an AND function
parameter bit CombineMode = 0
) (
input lc_ctrl_pkg::lc_tx_t lc_en_a_i,
input lc_ctrl_pkg::lc_tx_t lc_en_b_i,
output lc_ctrl_pkg::lc_tx_t lc_en_o
);
// Determine whether which multibit value is considered "active" for the
// purpose of the logical function below.
localparam lc_ctrl_pkg::lc_tx_t ActiveValue = (ActiveLow) ? lc_ctrl_pkg::Off : lc_ctrl_pkg::On;
// Truth tables:
//
// ActiveLow: 0, CombineMode: 0 (active-high "OR")
//
// A | B | OUT
//------+------+-----
// !On | !On | !On
// On | !On | On
// !On | On | On
// On | On | On
//
// ActiveLow: 0, CombineMode: 1 (active-high "AND")
//
// A | B | OUT
//------+------+-----
// !On | !On | !On
// On | !On | !On
// !On | On | !On
// On | On | On
//
// ActiveLow: 1, CombineMode: 0 (active-low "OR")
//
// A | B | OUT
//------+------+-----
// !Off | !Off | !Off
// Off | !Off | Off
// !Off | Off | Off
// Off | Off | Off
//
// ActiveLow: 1, CombineMode: 1 (active-low "AND")
//
// A | B | OUT
//------+------+-----
// !Off | !Off | !Off
// Off | !Off | !Off
// !Off | Off | !Off
// Off | Off | Off
//
// Note: the inactive value (e.g. !On) can be any multibit value
// different from the active value.
//
for (genvar k = 0; k < $bits(ActiveValue); k++) begin : gen_loop
if (CombineMode && ActiveValue[k] ||
(!CombineMode && !ActiveValue[k])) begin : gen_and_gate
assign lc_en_o[k] = lc_en_a_i[k] && lc_en_b_i[k];
end else begin : gen_or_gate
assign lc_en_o[k] = lc_en_a_i[k] || lc_en_b_i[k];
end
end
endmodule : prim_lc_combine