[prim_mubi] Add decoder module similar to prim_lc_dec Signed-off-by: Michael Schaffner <msf@google.com>
diff --git a/hw/ip/prim/data/prim_mubi.core.tpl b/hw/ip/prim/data/prim_mubi.core.tpl index bf54920..fd4c160 100644 --- a/hw/ip/prim/data/prim_mubi.core.tpl +++ b/hw/ip/prim/data/prim_mubi.core.tpl
@@ -21,6 +21,7 @@ % for n in range(1, n_max_nibbles+1): - rtl/prim_mubi${4*n}_sender.sv - rtl/prim_mubi${4*n}_sync.sv + - rtl/prim_mubi${4*n}_dec.sv % endfor file_type: systemVerilogSource
diff --git a/hw/ip/prim/data/prim_mubi_dec.sv.tpl b/hw/ip/prim/data/prim_mubi_dec.sv.tpl new file mode 100644 index 0000000..8f698dd --- /dev/null +++ b/hw/ip/prim/data/prim_mubi_dec.sv.tpl
@@ -0,0 +1,46 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// ------------------- W A R N I N G: A U T O - G E N E R A T E D C O D E !! -------------------// +// PLEASE DO NOT HAND-EDIT THIS FILE. IT HAS BEEN AUTO-GENERATED WITH THE FOLLOWING COMMAND: +// +// hw/ip/prim/util/generate_prim_mubi.py +// +// Decoder for multibit control signals with additional input buffers. + +module prim_mubi${n_bits}_dec + import prim_mubi_pkg::*; +#( + parameter bit TestTrue = 1, + parameter bit TestStrict = 1 +) ( + input mubi${n_bits}_t mubi_i, + output logic mubi_dec_o +); + +logic [MuBi${n_bits}Width-1:0] mubi, mubi_out; +assign mubi = MuBi${n_bits}Width'(mubi_i); + +// The buffer cells have a don't touch constraint on them +// such that synthesis tools won't collapse them +for (genvar k = 0; k < MuBi${n_bits}Width; k++) begin : gen_bits + prim_buf u_prim_buf ( + .in_i ( mubi[k] ), + .out_o ( mubi_out[k] ) + ); +end + +if (TestTrue && TestStrict) begin : gen_test_true_strict + assign mubi_dec_o = mubi${n_bits}_test_true_strict(mubi${n_bits}_t'(mubi_out)); +end else if (TestTrue && !TestStrict) begin : gen_test_true_loose + assign mubi_dec_o = mubi${n_bits}_test_true_loose(mubi${n_bits}_t'(mubi_out)); +end else if (!TestTrue && TestStrict) begin : gen_test_false_strict + assign mubi_dec_o = mubi${n_bits}_test_false_strict(mubi${n_bits}_t'(mubi_out)); +end else if (!TestTrue && !TestStrict) begin : gen_test_false_loose + assign mubi_dec_o = mubi${n_bits}_test_false_loose(mubi${n_bits}_t'(mubi_out)); +end else begin : gen_unknown_config + `ASSERT_INIT(UnknownConfig_A, 0) +end + +endmodule : prim_mubi${n_bits}_dec
diff --git a/hw/ip/prim/prim_mubi.core b/hw/ip/prim/prim_mubi.core index 5837a3d..115e681 100644 --- a/hw/ip/prim/prim_mubi.core +++ b/hw/ip/prim/prim_mubi.core
@@ -20,12 +20,16 @@ - rtl/prim_mubi_pkg.sv - rtl/prim_mubi4_sender.sv - rtl/prim_mubi4_sync.sv + - rtl/prim_mubi4_dec.sv - rtl/prim_mubi8_sender.sv - rtl/prim_mubi8_sync.sv + - rtl/prim_mubi8_dec.sv - rtl/prim_mubi12_sender.sv - rtl/prim_mubi12_sync.sv + - rtl/prim_mubi12_dec.sv - rtl/prim_mubi16_sender.sv - rtl/prim_mubi16_sync.sv + - rtl/prim_mubi16_dec.sv file_type: systemVerilogSource targets:
diff --git a/hw/ip/prim/rtl/prim_mubi12_dec.sv b/hw/ip/prim/rtl/prim_mubi12_dec.sv new file mode 100644 index 0000000..1bc237e --- /dev/null +++ b/hw/ip/prim/rtl/prim_mubi12_dec.sv
@@ -0,0 +1,46 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// ------------------- W A R N I N G: A U T O - G E N E R A T E D C O D E !! -------------------// +// PLEASE DO NOT HAND-EDIT THIS FILE. IT HAS BEEN AUTO-GENERATED WITH THE FOLLOWING COMMAND: +// +// hw/ip/prim/util/generate_prim_mubi.py +// +// Decoder for multibit control signals with additional input buffers. + +module prim_mubi12_dec + import prim_mubi_pkg::*; +#( + parameter bit TestTrue = 1, + parameter bit TestStrict = 1 +) ( + input mubi12_t mubi_i, + output logic mubi_dec_o +); + +logic [MuBi12Width-1:0] mubi, mubi_out; +assign mubi = MuBi12Width'(mubi_i); + +// The buffer cells have a don't touch constraint on them +// such that synthesis tools won't collapse them +for (genvar k = 0; k < MuBi12Width; k++) begin : gen_bits + prim_buf u_prim_buf ( + .in_i ( mubi[k] ), + .out_o ( mubi_out[k] ) + ); +end + +if (TestTrue && TestStrict) begin : gen_test_true_strict + assign mubi_dec_o = mubi12_test_true_strict(mubi12_t'(mubi_out)); +end else if (TestTrue && !TestStrict) begin : gen_test_true_loose + assign mubi_dec_o = mubi12_test_true_loose(mubi12_t'(mubi_out)); +end else if (!TestTrue && TestStrict) begin : gen_test_false_strict + assign mubi_dec_o = mubi12_test_false_strict(mubi12_t'(mubi_out)); +end else if (!TestTrue && !TestStrict) begin : gen_test_false_loose + assign mubi_dec_o = mubi12_test_false_loose(mubi12_t'(mubi_out)); +end else begin : gen_unknown_config + `ASSERT_INIT(UnknownConfig_A, 0) +end + +endmodule : prim_mubi12_dec
diff --git a/hw/ip/prim/rtl/prim_mubi16_dec.sv b/hw/ip/prim/rtl/prim_mubi16_dec.sv new file mode 100644 index 0000000..6b6aaa0 --- /dev/null +++ b/hw/ip/prim/rtl/prim_mubi16_dec.sv
@@ -0,0 +1,46 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// ------------------- W A R N I N G: A U T O - G E N E R A T E D C O D E !! -------------------// +// PLEASE DO NOT HAND-EDIT THIS FILE. IT HAS BEEN AUTO-GENERATED WITH THE FOLLOWING COMMAND: +// +// hw/ip/prim/util/generate_prim_mubi.py +// +// Decoder for multibit control signals with additional input buffers. + +module prim_mubi16_dec + import prim_mubi_pkg::*; +#( + parameter bit TestTrue = 1, + parameter bit TestStrict = 1 +) ( + input mubi16_t mubi_i, + output logic mubi_dec_o +); + +logic [MuBi16Width-1:0] mubi, mubi_out; +assign mubi = MuBi16Width'(mubi_i); + +// The buffer cells have a don't touch constraint on them +// such that synthesis tools won't collapse them +for (genvar k = 0; k < MuBi16Width; k++) begin : gen_bits + prim_buf u_prim_buf ( + .in_i ( mubi[k] ), + .out_o ( mubi_out[k] ) + ); +end + +if (TestTrue && TestStrict) begin : gen_test_true_strict + assign mubi_dec_o = mubi16_test_true_strict(mubi16_t'(mubi_out)); +end else if (TestTrue && !TestStrict) begin : gen_test_true_loose + assign mubi_dec_o = mubi16_test_true_loose(mubi16_t'(mubi_out)); +end else if (!TestTrue && TestStrict) begin : gen_test_false_strict + assign mubi_dec_o = mubi16_test_false_strict(mubi16_t'(mubi_out)); +end else if (!TestTrue && !TestStrict) begin : gen_test_false_loose + assign mubi_dec_o = mubi16_test_false_loose(mubi16_t'(mubi_out)); +end else begin : gen_unknown_config + `ASSERT_INIT(UnknownConfig_A, 0) +end + +endmodule : prim_mubi16_dec
diff --git a/hw/ip/prim/rtl/prim_mubi4_dec.sv b/hw/ip/prim/rtl/prim_mubi4_dec.sv new file mode 100644 index 0000000..a17620b --- /dev/null +++ b/hw/ip/prim/rtl/prim_mubi4_dec.sv
@@ -0,0 +1,46 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// ------------------- W A R N I N G: A U T O - G E N E R A T E D C O D E !! -------------------// +// PLEASE DO NOT HAND-EDIT THIS FILE. IT HAS BEEN AUTO-GENERATED WITH THE FOLLOWING COMMAND: +// +// hw/ip/prim/util/generate_prim_mubi.py +// +// Decoder for multibit control signals with additional input buffers. + +module prim_mubi4_dec + import prim_mubi_pkg::*; +#( + parameter bit TestTrue = 1, + parameter bit TestStrict = 1 +) ( + input mubi4_t mubi_i, + output logic mubi_dec_o +); + +logic [MuBi4Width-1:0] mubi, mubi_out; +assign mubi = MuBi4Width'(mubi_i); + +// The buffer cells have a don't touch constraint on them +// such that synthesis tools won't collapse them +for (genvar k = 0; k < MuBi4Width; k++) begin : gen_bits + prim_buf u_prim_buf ( + .in_i ( mubi[k] ), + .out_o ( mubi_out[k] ) + ); +end + +if (TestTrue && TestStrict) begin : gen_test_true_strict + assign mubi_dec_o = mubi4_test_true_strict(mubi4_t'(mubi_out)); +end else if (TestTrue && !TestStrict) begin : gen_test_true_loose + assign mubi_dec_o = mubi4_test_true_loose(mubi4_t'(mubi_out)); +end else if (!TestTrue && TestStrict) begin : gen_test_false_strict + assign mubi_dec_o = mubi4_test_false_strict(mubi4_t'(mubi_out)); +end else if (!TestTrue && !TestStrict) begin : gen_test_false_loose + assign mubi_dec_o = mubi4_test_false_loose(mubi4_t'(mubi_out)); +end else begin : gen_unknown_config + `ASSERT_INIT(UnknownConfig_A, 0) +end + +endmodule : prim_mubi4_dec
diff --git a/hw/ip/prim/rtl/prim_mubi8_dec.sv b/hw/ip/prim/rtl/prim_mubi8_dec.sv new file mode 100644 index 0000000..9dbf95e --- /dev/null +++ b/hw/ip/prim/rtl/prim_mubi8_dec.sv
@@ -0,0 +1,46 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// ------------------- W A R N I N G: A U T O - G E N E R A T E D C O D E !! -------------------// +// PLEASE DO NOT HAND-EDIT THIS FILE. IT HAS BEEN AUTO-GENERATED WITH THE FOLLOWING COMMAND: +// +// hw/ip/prim/util/generate_prim_mubi.py +// +// Decoder for multibit control signals with additional input buffers. + +module prim_mubi8_dec + import prim_mubi_pkg::*; +#( + parameter bit TestTrue = 1, + parameter bit TestStrict = 1 +) ( + input mubi8_t mubi_i, + output logic mubi_dec_o +); + +logic [MuBi8Width-1:0] mubi, mubi_out; +assign mubi = MuBi8Width'(mubi_i); + +// The buffer cells have a don't touch constraint on them +// such that synthesis tools won't collapse them +for (genvar k = 0; k < MuBi8Width; k++) begin : gen_bits + prim_buf u_prim_buf ( + .in_i ( mubi[k] ), + .out_o ( mubi_out[k] ) + ); +end + +if (TestTrue && TestStrict) begin : gen_test_true_strict + assign mubi_dec_o = mubi8_test_true_strict(mubi8_t'(mubi_out)); +end else if (TestTrue && !TestStrict) begin : gen_test_true_loose + assign mubi_dec_o = mubi8_test_true_loose(mubi8_t'(mubi_out)); +end else if (!TestTrue && TestStrict) begin : gen_test_false_strict + assign mubi_dec_o = mubi8_test_false_strict(mubi8_t'(mubi_out)); +end else if (!TestTrue && !TestStrict) begin : gen_test_false_loose + assign mubi_dec_o = mubi8_test_false_loose(mubi8_t'(mubi_out)); +end else begin : gen_unknown_config + `ASSERT_INIT(UnknownConfig_A, 0) +end + +endmodule : prim_mubi8_dec
diff --git a/hw/ip/prim/util/generate_prim_mubi.py b/hw/ip/prim/util/generate_prim_mubi.py index b9249ce..f3ec64b 100755 --- a/hw/ip/prim/util/generate_prim_mubi.py +++ b/hw/ip/prim/util/generate_prim_mubi.py
@@ -10,11 +10,13 @@ MUBI_CORE_TPL_PATH = "data/prim_mubi.core.tpl" MUBI_SENDER_TPL_PATH = "data/prim_mubi_sender.sv.tpl" MUBI_SYNC_TPL_PATH = "data/prim_mubi_sync.sv.tpl" +MUBI_DEC_TPL_PATH = "data/prim_mubi_dec.sv.tpl" MUBI_PKG_OUT_PATH = "rtl/prim_mubi_pkg.sv" MUBI_CORE_OUT_PATH = "./prim_mubi.core" MUBI_SENDER_OUT_PATH = "rtl/prim_mubi{}_sender.sv" MUBI_SYNC_OUT_PATH = "rtl/prim_mubi{}_sync.sv" +MUBI_DEC_OUT_PATH = "rtl/prim_mubi{}_dec.sv" N_MAX_NIBBLES = 4 @@ -33,7 +35,8 @@ tpls = [ (MUBI_SENDER_TPL_PATH, MUBI_SENDER_OUT_PATH), - (MUBI_SYNC_TPL_PATH, MUBI_SYNC_OUT_PATH) + (MUBI_SYNC_TPL_PATH, MUBI_SYNC_OUT_PATH), + (MUBI_DEC_TPL_PATH, MUBI_DEC_OUT_PATH) ] for tpl, out in tpls: with open(tpl) as inf: