[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: