|  | // 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 |