[secded_gen] Define and generate inverted ECC enc/dec modules
Signed-off-by: Michael Schaffner <msf@google.com>
diff --git a/hw/ip/prim/dv/prim_secded/secded_enc.c b/hw/ip/prim/dv/prim_secded/secded_enc.c
index b48197b..e9ef24e 100644
--- a/hw/ip/prim/dv/prim_secded/secded_enc.c
+++ b/hw/ip/prim/dv/prim_secded/secded_enc.c
@@ -5,13 +5,13 @@
// SECDED encode code generated by
// util/design/secded_gen.py from util/design/data/secded_cfg.hjson
+#include "secded_enc.h"
+
#include <stdbool.h>
#include <stdint.h>
-#include "secded_enc.h"
-
// Calculates even parity for a 64-bit word
-static uint8_t calc_parity(uint64_t word) {
+static uint8_t calc_parity(uint64_t word, bool invert) {
bool parity = false;
while (word) {
@@ -22,40 +22,43 @@
word >>= 1;
}
- return parity;
+ return parity ^ invert;
}
uint8_t enc_secded_22_16(const uint8_t bytes[2]) {
uint16_t word = ((uint16_t)bytes[0] << 0) | ((uint16_t)bytes[1] << 8);
- return (calc_parity(word & 0x496e) << 0) | (calc_parity(word & 0xf20b) << 1) |
- (calc_parity(word & 0x8ed8) << 2) | (calc_parity(word & 0x7714) << 3) |
- (calc_parity(word & 0xaca5) << 4) | (calc_parity(word & 0x11f3) << 5);
+ return (calc_parity(word & 0x496e, false) << 0) |
+ (calc_parity(word & 0xf20b, false) << 1) |
+ (calc_parity(word & 0x8ed8, false) << 2) |
+ (calc_parity(word & 0x7714, false) << 3) |
+ (calc_parity(word & 0xaca5, false) << 4) |
+ (calc_parity(word & 0x11f3, false) << 5);
}
uint8_t enc_secded_28_22(const uint8_t bytes[3]) {
uint32_t word = ((uint32_t)bytes[0] << 0) | ((uint32_t)bytes[1] << 8) |
((uint32_t)bytes[2] << 16);
- return (calc_parity(word & 0x3003ff) << 0) |
- (calc_parity(word & 0x10fc0f) << 1) |
- (calc_parity(word & 0x271c71) << 2) |
- (calc_parity(word & 0x3b6592) << 3) |
- (calc_parity(word & 0x3daaa4) << 4) |
- (calc_parity(word & 0x3ed348) << 5);
+ return (calc_parity(word & 0x3003ff, false) << 0) |
+ (calc_parity(word & 0x10fc0f, false) << 1) |
+ (calc_parity(word & 0x271c71, false) << 2) |
+ (calc_parity(word & 0x3b6592, false) << 3) |
+ (calc_parity(word & 0x3daaa4, false) << 4) |
+ (calc_parity(word & 0x3ed348, false) << 5);
}
uint8_t enc_secded_39_32(const uint8_t bytes[4]) {
uint32_t word = ((uint32_t)bytes[0] << 0) | ((uint32_t)bytes[1] << 8) |
((uint32_t)bytes[2] << 16) | ((uint32_t)bytes[3] << 24);
- return (calc_parity(word & 0x2606bd25) << 0) |
- (calc_parity(word & 0xdeba8050) << 1) |
- (calc_parity(word & 0x413d89aa) << 2) |
- (calc_parity(word & 0x31234ed1) << 3) |
- (calc_parity(word & 0xc2c1323b) << 4) |
- (calc_parity(word & 0x2dcc624c) << 5) |
- (calc_parity(word & 0x98505586) << 6);
+ return (calc_parity(word & 0x2606bd25, false) << 0) |
+ (calc_parity(word & 0xdeba8050, false) << 1) |
+ (calc_parity(word & 0x413d89aa, false) << 2) |
+ (calc_parity(word & 0x31234ed1, false) << 3) |
+ (calc_parity(word & 0xc2c1323b, false) << 4) |
+ (calc_parity(word & 0x2dcc624c, false) << 5) |
+ (calc_parity(word & 0x98505586, false) << 6);
}
uint8_t enc_secded_64_57(const uint8_t bytes[8]) {
@@ -64,13 +67,13 @@
((uint64_t)bytes[4] << 32) | ((uint64_t)bytes[5] << 40) |
((uint64_t)bytes[6] << 48) | ((uint64_t)bytes[7] << 56);
- return (calc_parity(word & 0x103fff800007fff) << 0) |
- (calc_parity(word & 0x17c1ff801ff801f) << 1) |
- (calc_parity(word & 0x1bde1f87e0781e1) << 2) |
- (calc_parity(word & 0x1deee3b8e388e22) << 3) |
- (calc_parity(word & 0x1ef76cdb2c93244) << 4) |
- (calc_parity(word & 0x1f7bb56d5525488) << 5) |
- (calc_parity(word & 0x1fbdda769a46910) << 6);
+ return (calc_parity(word & 0x103fff800007fff, false) << 0) |
+ (calc_parity(word & 0x17c1ff801ff801f, false) << 1) |
+ (calc_parity(word & 0x1bde1f87e0781e1, false) << 2) |
+ (calc_parity(word & 0x1deee3b8e388e22, false) << 3) |
+ (calc_parity(word & 0x1ef76cdb2c93244, false) << 4) |
+ (calc_parity(word & 0x1f7bb56d5525488, false) << 5) |
+ (calc_parity(word & 0x1fbdda769a46910, false) << 6);
}
uint8_t enc_secded_72_64(const uint8_t bytes[8]) {
@@ -79,12 +82,79 @@
((uint64_t)bytes[4] << 32) | ((uint64_t)bytes[5] << 40) |
((uint64_t)bytes[6] << 48) | ((uint64_t)bytes[7] << 56);
- return (calc_parity(word & 0xb9000000001fffff) << 0) |
- (calc_parity(word & 0x5e00000fffe0003f) << 1) |
- (calc_parity(word & 0x67003ff003e007c1) << 2) |
- (calc_parity(word & 0xcd0fc0f03c207842) << 3) |
- (calc_parity(word & 0xb671c711c4438884) << 4) |
- (calc_parity(word & 0xb5b65926488c9108) << 5) |
- (calc_parity(word & 0xcbdaaa4a91152210) << 6) |
- (calc_parity(word & 0x7aed348d221a4420) << 7);
+ return (calc_parity(word & 0xb9000000001fffff, false) << 0) |
+ (calc_parity(word & 0x5e00000fffe0003f, false) << 1) |
+ (calc_parity(word & 0x67003ff003e007c1, false) << 2) |
+ (calc_parity(word & 0xcd0fc0f03c207842, false) << 3) |
+ (calc_parity(word & 0xb671c711c4438884, false) << 4) |
+ (calc_parity(word & 0xb5b65926488c9108, false) << 5) |
+ (calc_parity(word & 0xcbdaaa4a91152210, false) << 6) |
+ (calc_parity(word & 0x7aed348d221a4420, false) << 7);
+}
+
+uint8_t enc_secded_inv_22_16(const uint8_t bytes[2]) {
+ uint16_t word = ((uint16_t)bytes[0] << 0) | ((uint16_t)bytes[1] << 8);
+
+ return (calc_parity(word & 0x496e, true) << 0) |
+ (calc_parity(word & 0xf20b, true) << 1) |
+ (calc_parity(word & 0x8ed8, true) << 2) |
+ (calc_parity(word & 0x7714, true) << 3) |
+ (calc_parity(word & 0xaca5, true) << 4) |
+ (calc_parity(word & 0x11f3, true) << 5);
+}
+
+uint8_t enc_secded_inv_28_22(const uint8_t bytes[3]) {
+ uint32_t word = ((uint32_t)bytes[0] << 0) | ((uint32_t)bytes[1] << 8) |
+ ((uint32_t)bytes[2] << 16);
+
+ return (calc_parity(word & 0x3003ff, true) << 0) |
+ (calc_parity(word & 0x10fc0f, true) << 1) |
+ (calc_parity(word & 0x271c71, true) << 2) |
+ (calc_parity(word & 0x3b6592, true) << 3) |
+ (calc_parity(word & 0x3daaa4, true) << 4) |
+ (calc_parity(word & 0x3ed348, true) << 5);
+}
+
+uint8_t enc_secded_inv_39_32(const uint8_t bytes[4]) {
+ uint32_t word = ((uint32_t)bytes[0] << 0) | ((uint32_t)bytes[1] << 8) |
+ ((uint32_t)bytes[2] << 16) | ((uint32_t)bytes[3] << 24);
+
+ return (calc_parity(word & 0x2606bd25, true) << 0) |
+ (calc_parity(word & 0xdeba8050, true) << 1) |
+ (calc_parity(word & 0x413d89aa, true) << 2) |
+ (calc_parity(word & 0x31234ed1, true) << 3) |
+ (calc_parity(word & 0xc2c1323b, true) << 4) |
+ (calc_parity(word & 0x2dcc624c, true) << 5) |
+ (calc_parity(word & 0x98505586, true) << 6);
+}
+
+uint8_t enc_secded_inv_64_57(const uint8_t bytes[8]) {
+ uint64_t word = ((uint64_t)bytes[0] << 0) | ((uint64_t)bytes[1] << 8) |
+ ((uint64_t)bytes[2] << 16) | ((uint64_t)bytes[3] << 24) |
+ ((uint64_t)bytes[4] << 32) | ((uint64_t)bytes[5] << 40) |
+ ((uint64_t)bytes[6] << 48) | ((uint64_t)bytes[7] << 56);
+
+ return (calc_parity(word & 0x103fff800007fff, true) << 0) |
+ (calc_parity(word & 0x17c1ff801ff801f, true) << 1) |
+ (calc_parity(word & 0x1bde1f87e0781e1, true) << 2) |
+ (calc_parity(word & 0x1deee3b8e388e22, true) << 3) |
+ (calc_parity(word & 0x1ef76cdb2c93244, true) << 4) |
+ (calc_parity(word & 0x1f7bb56d5525488, true) << 5) |
+ (calc_parity(word & 0x1fbdda769a46910, true) << 6);
+}
+
+uint8_t enc_secded_inv_72_64(const uint8_t bytes[8]) {
+ uint64_t word = ((uint64_t)bytes[0] << 0) | ((uint64_t)bytes[1] << 8) |
+ ((uint64_t)bytes[2] << 16) | ((uint64_t)bytes[3] << 24) |
+ ((uint64_t)bytes[4] << 32) | ((uint64_t)bytes[5] << 40) |
+ ((uint64_t)bytes[6] << 48) | ((uint64_t)bytes[7] << 56);
+
+ return (calc_parity(word & 0xb9000000001fffff, true) << 0) |
+ (calc_parity(word & 0x5e00000fffe0003f, true) << 1) |
+ (calc_parity(word & 0x67003ff003e007c1, true) << 2) |
+ (calc_parity(word & 0xcd0fc0f03c207842, true) << 3) |
+ (calc_parity(word & 0xb671c711c4438884, true) << 4) |
+ (calc_parity(word & 0xb5b65926488c9108, true) << 5) |
+ (calc_parity(word & 0xcbdaaa4a91152210, true) << 6) |
+ (calc_parity(word & 0x7aed348d221a4420, true) << 7);
}
diff --git a/hw/ip/prim/dv/prim_secded/secded_enc.h b/hw/ip/prim/dv/prim_secded/secded_enc.h
index 2ed52a2..776dbc8 100644
--- a/hw/ip/prim/dv/prim_secded/secded_enc.h
+++ b/hw/ip/prim/dv/prim_secded/secded_enc.h
@@ -23,6 +23,11 @@
uint8_t enc_secded_39_32(const uint8_t bytes[4]);
uint8_t enc_secded_64_57(const uint8_t bytes[8]);
uint8_t enc_secded_72_64(const uint8_t bytes[8]);
+uint8_t enc_secded_inv_22_16(const uint8_t bytes[2]);
+uint8_t enc_secded_inv_28_22(const uint8_t bytes[3]);
+uint8_t enc_secded_inv_39_32(const uint8_t bytes[4]);
+uint8_t enc_secded_inv_64_57(const uint8_t bytes[8]);
+uint8_t enc_secded_inv_72_64(const uint8_t bytes[8]);
#ifdef __cplusplus
} // extern "C"
diff --git a/hw/ip/prim/fpv/prim_secded_inv_22_16_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_22_16_fpv.core
new file mode 100644
index 0000000..4094c00
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_22_16_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_22_16_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_22_16_assert_fpv.sv
+ - tb/prim_secded_inv_22_16_tb.sv
+ - tb/prim_secded_inv_22_16_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_22_16_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/prim_secded_inv_28_22_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_28_22_fpv.core
new file mode 100644
index 0000000..d68bb35
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_28_22_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_28_22_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_28_22_assert_fpv.sv
+ - tb/prim_secded_inv_28_22_tb.sv
+ - tb/prim_secded_inv_28_22_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_28_22_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/prim_secded_inv_39_32_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_39_32_fpv.core
new file mode 100644
index 0000000..07df9f1
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_39_32_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_39_32_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_39_32_assert_fpv.sv
+ - tb/prim_secded_inv_39_32_tb.sv
+ - tb/prim_secded_inv_39_32_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_39_32_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/prim_secded_inv_64_57_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_64_57_fpv.core
new file mode 100644
index 0000000..d5d7f57
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_64_57_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_64_57_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_64_57_assert_fpv.sv
+ - tb/prim_secded_inv_64_57_tb.sv
+ - tb/prim_secded_inv_64_57_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_64_57_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/prim_secded_inv_72_64_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_72_64_fpv.core
new file mode 100644
index 0000000..755eaf0
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_72_64_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_72_64_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_72_64_assert_fpv.sv
+ - tb/prim_secded_inv_72_64_tb.sv
+ - tb/prim_secded_inv_72_64_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_72_64_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/prim_secded_inv_hamming_22_16_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_hamming_22_16_fpv.core
new file mode 100644
index 0000000..9ab87ff
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_hamming_22_16_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_hamming_22_16_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_hamming_22_16_assert_fpv.sv
+ - tb/prim_secded_inv_hamming_22_16_tb.sv
+ - tb/prim_secded_inv_hamming_22_16_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_hamming_22_16_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/prim_secded_inv_hamming_39_32_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_hamming_39_32_fpv.core
new file mode 100644
index 0000000..786a289
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_hamming_39_32_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_hamming_39_32_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_hamming_39_32_assert_fpv.sv
+ - tb/prim_secded_inv_hamming_39_32_tb.sv
+ - tb/prim_secded_inv_hamming_39_32_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_hamming_39_32_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/prim_secded_inv_hamming_72_64_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_hamming_72_64_fpv.core
new file mode 100644
index 0000000..08ef86a
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_hamming_72_64_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_hamming_72_64_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_hamming_72_64_assert_fpv.sv
+ - tb/prim_secded_inv_hamming_72_64_tb.sv
+ - tb/prim_secded_inv_hamming_72_64_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_hamming_72_64_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/prim_secded_inv_hamming_76_68_fpv.core b/hw/ip/prim/fpv/prim_secded_inv_hamming_76_68_fpv.core
new file mode 100644
index 0000000..750f67a
--- /dev/null
+++ b/hw/ip/prim/fpv/prim_secded_inv_hamming_76_68_fpv.core
@@ -0,0 +1,33 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:fpv:prim_secded_inv_hamming_76_68_fpv:0.1"
+description: "SECDED FPV target"
+filesets:
+ files_formal:
+ depend:
+ - lowrisc:prim:all
+ - lowrisc:prim:secded
+ files:
+ - vip/prim_secded_inv_hamming_76_68_assert_fpv.sv
+ - tb/prim_secded_inv_hamming_76_68_tb.sv
+ - tb/prim_secded_inv_hamming_76_68_bind_fpv.sv
+ file_type: systemVerilogSource
+
+targets:
+ default: &default_target
+ # note, this setting is just used
+ # to generate a file list for jg
+ default_tool: icarus
+ filesets:
+ - files_formal
+ toplevel:
+ - prim_secded_inv_hamming_76_68_tb
+
+ formal:
+ <<: *default_target
+
+ lint:
+ <<: *default_target
+
diff --git a/hw/ip/prim/fpv/tb/prim_secded_hamming_76_68_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_hamming_76_68_tb.sv
new file mode 100644
index 0000000..201f6c8
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_hamming_76_68_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_hamming_76_68_tb (
+ input clk_i,
+ input rst_ni,
+ input [67:0] data_i,
+ output logic [67:0] data_o,
+ output logic [7:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [75:0] error_inject_i
+);
+
+ logic [75:0] data_enc;
+
+ prim_secded_hamming_76_68_enc prim_secded_hamming_76_68_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_hamming_76_68_dec prim_secded_hamming_76_68_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_hamming_76_68_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_22_16_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_22_16_bind_fpv.sv
new file mode 100644
index 0000000..3a3c0a7
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_22_16_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_22_16_bind_fpv;
+
+ bind prim_secded_inv_22_16_tb
+ prim_secded_inv_22_16_assert_fpv prim_secded_inv_22_16_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_22_16_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_22_16_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_22_16_tb.sv
new file mode 100644
index 0000000..8f974d2
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_22_16_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_22_16_tb (
+ input clk_i,
+ input rst_ni,
+ input [15:0] data_i,
+ output logic [15:0] data_o,
+ output logic [5:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [21:0] error_inject_i
+);
+
+ logic [21:0] data_enc;
+
+ prim_secded_inv_22_16_enc prim_secded_inv_22_16_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_22_16_dec prim_secded_inv_22_16_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_22_16_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_28_22_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_28_22_bind_fpv.sv
new file mode 100644
index 0000000..69e7de0
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_28_22_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_28_22_bind_fpv;
+
+ bind prim_secded_inv_28_22_tb
+ prim_secded_inv_28_22_assert_fpv prim_secded_inv_28_22_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_28_22_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_28_22_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_28_22_tb.sv
new file mode 100644
index 0000000..bcf5e4c
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_28_22_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_28_22_tb (
+ input clk_i,
+ input rst_ni,
+ input [21:0] data_i,
+ output logic [21:0] data_o,
+ output logic [5:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [27:0] error_inject_i
+);
+
+ logic [27:0] data_enc;
+
+ prim_secded_inv_28_22_enc prim_secded_inv_28_22_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_28_22_dec prim_secded_inv_28_22_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_28_22_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_39_32_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_39_32_bind_fpv.sv
new file mode 100644
index 0000000..6a3057a
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_39_32_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_39_32_bind_fpv;
+
+ bind prim_secded_inv_39_32_tb
+ prim_secded_inv_39_32_assert_fpv prim_secded_inv_39_32_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_39_32_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_39_32_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_39_32_tb.sv
new file mode 100644
index 0000000..debec41
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_39_32_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_39_32_tb (
+ input clk_i,
+ input rst_ni,
+ input [31:0] data_i,
+ output logic [31:0] data_o,
+ output logic [6:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [38:0] error_inject_i
+);
+
+ logic [38:0] data_enc;
+
+ prim_secded_inv_39_32_enc prim_secded_inv_39_32_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_39_32_dec prim_secded_inv_39_32_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_39_32_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_64_57_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_64_57_bind_fpv.sv
new file mode 100644
index 0000000..5dd52d5
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_64_57_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_64_57_bind_fpv;
+
+ bind prim_secded_inv_64_57_tb
+ prim_secded_inv_64_57_assert_fpv prim_secded_inv_64_57_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_64_57_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_64_57_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_64_57_tb.sv
new file mode 100644
index 0000000..afc717b
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_64_57_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_64_57_tb (
+ input clk_i,
+ input rst_ni,
+ input [56:0] data_i,
+ output logic [56:0] data_o,
+ output logic [6:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [63:0] error_inject_i
+);
+
+ logic [63:0] data_enc;
+
+ prim_secded_inv_64_57_enc prim_secded_inv_64_57_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_64_57_dec prim_secded_inv_64_57_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_64_57_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_72_64_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_72_64_bind_fpv.sv
new file mode 100644
index 0000000..7e90740
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_72_64_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_72_64_bind_fpv;
+
+ bind prim_secded_inv_72_64_tb
+ prim_secded_inv_72_64_assert_fpv prim_secded_inv_72_64_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_72_64_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_72_64_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_72_64_tb.sv
new file mode 100644
index 0000000..a997105
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_72_64_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_72_64_tb (
+ input clk_i,
+ input rst_ni,
+ input [63:0] data_i,
+ output logic [63:0] data_o,
+ output logic [7:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [71:0] error_inject_i
+);
+
+ logic [71:0] data_enc;
+
+ prim_secded_inv_72_64_enc prim_secded_inv_72_64_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_72_64_dec prim_secded_inv_72_64_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_72_64_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_22_16_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_22_16_bind_fpv.sv
new file mode 100644
index 0000000..519d841
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_22_16_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_22_16_bind_fpv;
+
+ bind prim_secded_inv_hamming_22_16_tb
+ prim_secded_inv_hamming_22_16_assert_fpv prim_secded_inv_hamming_22_16_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_hamming_22_16_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_22_16_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_22_16_tb.sv
new file mode 100644
index 0000000..9a04c87
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_22_16_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_22_16_tb (
+ input clk_i,
+ input rst_ni,
+ input [15:0] data_i,
+ output logic [15:0] data_o,
+ output logic [5:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [21:0] error_inject_i
+);
+
+ logic [21:0] data_enc;
+
+ prim_secded_inv_hamming_22_16_enc prim_secded_inv_hamming_22_16_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_hamming_22_16_dec prim_secded_inv_hamming_22_16_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_hamming_22_16_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_39_32_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_39_32_bind_fpv.sv
new file mode 100644
index 0000000..026df35
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_39_32_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_39_32_bind_fpv;
+
+ bind prim_secded_inv_hamming_39_32_tb
+ prim_secded_inv_hamming_39_32_assert_fpv prim_secded_inv_hamming_39_32_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_hamming_39_32_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_39_32_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_39_32_tb.sv
new file mode 100644
index 0000000..3db6b68
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_39_32_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_39_32_tb (
+ input clk_i,
+ input rst_ni,
+ input [31:0] data_i,
+ output logic [31:0] data_o,
+ output logic [6:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [38:0] error_inject_i
+);
+
+ logic [38:0] data_enc;
+
+ prim_secded_inv_hamming_39_32_enc prim_secded_inv_hamming_39_32_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_hamming_39_32_dec prim_secded_inv_hamming_39_32_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_hamming_39_32_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_72_64_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_72_64_bind_fpv.sv
new file mode 100644
index 0000000..ffa3220
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_72_64_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_72_64_bind_fpv;
+
+ bind prim_secded_inv_hamming_72_64_tb
+ prim_secded_inv_hamming_72_64_assert_fpv prim_secded_inv_hamming_72_64_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_hamming_72_64_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_72_64_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_72_64_tb.sv
new file mode 100644
index 0000000..d881c64
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_72_64_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_72_64_tb (
+ input clk_i,
+ input rst_ni,
+ input [63:0] data_i,
+ output logic [63:0] data_o,
+ output logic [7:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [71:0] error_inject_i
+);
+
+ logic [71:0] data_enc;
+
+ prim_secded_inv_hamming_72_64_enc prim_secded_inv_hamming_72_64_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_hamming_72_64_dec prim_secded_inv_hamming_72_64_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_hamming_72_64_tb
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_76_68_bind_fpv.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_76_68_bind_fpv.sv
new file mode 100644
index 0000000..3ce6d9f
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_76_68_bind_fpv.sv
@@ -0,0 +1,20 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV bind file generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_76_68_bind_fpv;
+
+ bind prim_secded_inv_hamming_76_68_tb
+ prim_secded_inv_hamming_76_68_assert_fpv prim_secded_inv_hamming_76_68_assert_fpv (
+ .clk_i,
+ .rst_ni,
+ .data_i,
+ .data_o,
+ .syndrome_o,
+ .err_o,
+ .error_inject_i
+ );
+
+endmodule : prim_secded_inv_hamming_76_68_bind_fpv
diff --git a/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_76_68_tb.sv b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_76_68_tb.sv
new file mode 100644
index 0000000..7d80ef7
--- /dev/null
+++ b/hw/ip/prim/fpv/tb/prim_secded_inv_hamming_76_68_tb.sv
@@ -0,0 +1,31 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV testbench generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_76_68_tb (
+ input clk_i,
+ input rst_ni,
+ input [67:0] data_i,
+ output logic [67:0] data_o,
+ output logic [7:0] syndrome_o,
+ output logic [1:0] err_o,
+ input [75:0] error_inject_i
+);
+
+ logic [75:0] data_enc;
+
+ prim_secded_inv_hamming_76_68_enc prim_secded_inv_hamming_76_68_enc (
+ .data_i,
+ .data_o(data_enc)
+ );
+
+ prim_secded_inv_hamming_76_68_dec prim_secded_inv_hamming_76_68_dec (
+ .data_i(data_enc ^ error_inject_i),
+ .data_o,
+ .syndrome_o,
+ .err_o
+ );
+
+endmodule : prim_secded_inv_hamming_76_68_tb
diff --git a/hw/ip/prim/fpv/vip/prim_secded_hamming_76_68_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_hamming_76_68_assert_fpv.sv
new file mode 100644
index 0000000..45ce2f0
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_hamming_76_68_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_hamming_76_68_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [67:0] data_i,
+ input [67:0] data_o,
+ input [7:0] syndrome_o,
+ input [1:0] err_o,
+ input [75:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_hamming_76_68_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_22_16_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_22_16_assert_fpv.sv
new file mode 100644
index 0000000..8f0d802
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_22_16_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_22_16_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [15:0] data_i,
+ input [15:0] data_o,
+ input [5:0] syndrome_o,
+ input [1:0] err_o,
+ input [21:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_22_16_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_28_22_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_28_22_assert_fpv.sv
new file mode 100644
index 0000000..aeee046
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_28_22_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_28_22_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [21:0] data_i,
+ input [21:0] data_o,
+ input [5:0] syndrome_o,
+ input [1:0] err_o,
+ input [27:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_28_22_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_39_32_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_39_32_assert_fpv.sv
new file mode 100644
index 0000000..27c52cc
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_39_32_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_39_32_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [31:0] data_i,
+ input [31:0] data_o,
+ input [6:0] syndrome_o,
+ input [1:0] err_o,
+ input [38:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_39_32_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_64_57_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_64_57_assert_fpv.sv
new file mode 100644
index 0000000..6803f2c
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_64_57_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_64_57_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [56:0] data_i,
+ input [56:0] data_o,
+ input [6:0] syndrome_o,
+ input [1:0] err_o,
+ input [63:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_64_57_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_72_64_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_72_64_assert_fpv.sv
new file mode 100644
index 0000000..252ea32
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_72_64_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_72_64_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [63:0] data_i,
+ input [63:0] data_o,
+ input [7:0] syndrome_o,
+ input [1:0] err_o,
+ input [71:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_72_64_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_22_16_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_22_16_assert_fpv.sv
new file mode 100644
index 0000000..4123a18
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_22_16_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_22_16_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [15:0] data_i,
+ input [15:0] data_o,
+ input [5:0] syndrome_o,
+ input [1:0] err_o,
+ input [21:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_hamming_22_16_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_39_32_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_39_32_assert_fpv.sv
new file mode 100644
index 0000000..fe3790e
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_39_32_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_39_32_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [31:0] data_i,
+ input [31:0] data_o,
+ input [6:0] syndrome_o,
+ input [1:0] err_o,
+ input [38:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_hamming_39_32_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_72_64_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_72_64_assert_fpv.sv
new file mode 100644
index 0000000..e483a3f
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_72_64_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_72_64_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [63:0] data_i,
+ input [63:0] data_o,
+ input [7:0] syndrome_o,
+ input [1:0] err_o,
+ input [71:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_hamming_72_64_assert_fpv
diff --git a/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_76_68_assert_fpv.sv b/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_76_68_assert_fpv.sv
new file mode 100644
index 0000000..414bbd4
--- /dev/null
+++ b/hw/ip/prim/fpv/vip/prim_secded_inv_hamming_76_68_assert_fpv.sv
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED FPV assertion file generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_76_68_assert_fpv (
+ input clk_i,
+ input rst_ni,
+ input [67:0] data_i,
+ input [67:0] data_o,
+ input [7:0] syndrome_o,
+ input [1:0] err_o,
+ input [75:0] error_inject_i
+);
+
+ // Inject a maximum of two errors simultaneously.
+ `ASSUME_FPV(MaxTwoErrors_M, $countones(error_inject_i) <= 2)
+ // This bounds the input data state space to make sure the solver converges.
+ `ASSUME_FPV(DataLimit_M, $onehot0(data_i) || $onehot0(~data_i))
+ // Single bit error detection
+ `ASSERT(SingleErrorDetect_A, $countones(error_inject_i) == 1 |-> err_o[0])
+ `ASSERT(SingleErrorDetectReverse_A, err_o[0] |-> $countones(error_inject_i) == 1)
+ // Double bit error detection
+ `ASSERT(DoubleErrorDetect_A, $countones(error_inject_i) == 2 |-> err_o[1])
+ `ASSERT(DoubleErrorDetectReverse_A, err_o[1] |-> $countones(error_inject_i) == 2)
+ // Single bit error correction (implicitly tests the syndrome output)
+ `ASSERT(SingleErrorCorrect_A, $countones(error_inject_i) < 2 |-> data_i == data_o)
+ // Basic syndrome check
+ `ASSERT(SyndromeCheck_A, |syndrome_o |-> $countones(error_inject_i) > 0)
+ `ASSERT(SyndromeCheckReverse_A, $countones(error_inject_i) > 0 |-> |syndrome_o)
+
+endmodule : prim_secded_inv_hamming_76_68_assert_fpv
diff --git a/hw/ip/prim/prim_secded.core b/hw/ip/prim/prim_secded.core
index 9da5850..32a5746 100644
--- a/hw/ip/prim/prim_secded.core
+++ b/hw/ip/prim/prim_secded.core
@@ -27,6 +27,24 @@
- rtl/prim_secded_hamming_72_64_enc.sv
- rtl/prim_secded_hamming_76_68_dec.sv
- rtl/prim_secded_hamming_76_68_enc.sv
+ - rtl/prim_secded_inv_22_16_dec.sv
+ - rtl/prim_secded_inv_22_16_enc.sv
+ - rtl/prim_secded_inv_28_22_dec.sv
+ - rtl/prim_secded_inv_28_22_enc.sv
+ - rtl/prim_secded_inv_39_32_dec.sv
+ - rtl/prim_secded_inv_39_32_enc.sv
+ - rtl/prim_secded_inv_64_57_dec.sv
+ - rtl/prim_secded_inv_64_57_enc.sv
+ - rtl/prim_secded_inv_72_64_dec.sv
+ - rtl/prim_secded_inv_72_64_enc.sv
+ - rtl/prim_secded_inv_hamming_22_16_dec.sv
+ - rtl/prim_secded_inv_hamming_22_16_enc.sv
+ - rtl/prim_secded_inv_hamming_39_32_dec.sv
+ - rtl/prim_secded_inv_hamming_39_32_enc.sv
+ - rtl/prim_secded_inv_hamming_72_64_dec.sv
+ - rtl/prim_secded_inv_hamming_72_64_enc.sv
+ - rtl/prim_secded_inv_hamming_76_68_dec.sv
+ - rtl/prim_secded_inv_hamming_76_68_enc.sv
file_type: systemVerilogSource
targets:
diff --git a/hw/ip/prim/rtl/prim_secded_22_16_dec.sv b/hw/ip/prim/rtl/prim_secded_22_16_dec.sv
index 54ccfd0..4fa1196 100644
--- a/hw/ip/prim/rtl/prim_secded_22_16_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_22_16_dec.sv
@@ -11,37 +11,35 @@
output logic [1:0] err_o
);
- logic single_error;
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 22'h01496E);
+ syndrome_o[1] = ^(data_i & 22'h02F20B);
+ syndrome_o[2] = ^(data_i & 22'h048ED8);
+ syndrome_o[3] = ^(data_i & 22'h087714);
+ syndrome_o[4] = ^(data_i & 22'h10ACA5);
+ syndrome_o[5] = ^(data_i & 22'h2011F3);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 22'h01496E);
- assign syndrome_o[1] = ^(data_i & 22'h02F20B);
- assign syndrome_o[2] = ^(data_i & 22'h048ED8);
- assign syndrome_o[3] = ^(data_i & 22'h087714);
- assign syndrome_o[4] = ^(data_i & 22'h10ACA5);
- assign syndrome_o[5] = ^(data_i & 22'h2011F3);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h32) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'h23) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h19) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h7) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'h2c) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h31) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h25) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h34) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h29) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'he) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'h1c) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h15) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h2a) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h1a) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'hb) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h16) ^ data_i[15];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 6'h32) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 6'h23) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 6'h19) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 6'h7) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 6'h2c) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 6'h31) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 6'h25) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 6'h34) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 6'h29) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 6'he) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 6'h1c) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 6'h15) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 6'h2a) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 6'h1a) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 6'hb) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 6'h16) ^ data_i[15];
-
- // err_o calc. bit0: single error, bit1: double error
- assign single_error = ^syndrome_o;
- assign err_o[0] = single_error;
- assign err_o[1] = ~single_error & (|syndrome_o);
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
endmodule : prim_secded_22_16_dec
diff --git a/hw/ip/prim/rtl/prim_secded_28_22_dec.sv b/hw/ip/prim/rtl/prim_secded_28_22_dec.sv
index 57b9d10..7df02e2 100644
--- a/hw/ip/prim/rtl/prim_secded_28_22_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_28_22_dec.sv
@@ -11,43 +11,41 @@
output logic [1:0] err_o
);
- logic single_error;
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 28'h07003FF);
+ syndrome_o[1] = ^(data_i & 28'h090FC0F);
+ syndrome_o[2] = ^(data_i & 28'h1271C71);
+ syndrome_o[3] = ^(data_i & 28'h23B6592);
+ syndrome_o[4] = ^(data_i & 28'h43DAAA4);
+ syndrome_o[5] = ^(data_i & 28'h83ED348);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 28'h07003FF);
- assign syndrome_o[1] = ^(data_i & 28'h090FC0F);
- assign syndrome_o[2] = ^(data_i & 28'h1271C71);
- assign syndrome_o[3] = ^(data_i & 28'h23B6592);
- assign syndrome_o[4] = ^(data_i & 28'h43DAAA4);
- assign syndrome_o[5] = ^(data_i & 28'h83ED348);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'hd) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h15) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h25) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h19) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h29) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'h31) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'he) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h16) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h26) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h1a) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'h2a) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h32) ^ data_i[15];
+ data_o[16] = (syndrome_o == 6'h1c) ^ data_i[16];
+ data_o[17] = (syndrome_o == 6'h2c) ^ data_i[17];
+ data_o[18] = (syndrome_o == 6'h34) ^ data_i[18];
+ data_o[19] = (syndrome_o == 6'h38) ^ data_i[19];
+ data_o[20] = (syndrome_o == 6'h3b) ^ data_i[20];
+ data_o[21] = (syndrome_o == 6'h3d) ^ data_i[21];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 6'h7) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 6'hb) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 6'h13) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 6'h23) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 6'hd) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 6'h15) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 6'h25) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 6'h19) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 6'h29) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 6'h31) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 6'he) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 6'h16) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 6'h26) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 6'h1a) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 6'h2a) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 6'h32) ^ data_i[15];
- assign data_o[16] = (syndrome_o == 6'h1c) ^ data_i[16];
- assign data_o[17] = (syndrome_o == 6'h2c) ^ data_i[17];
- assign data_o[18] = (syndrome_o == 6'h34) ^ data_i[18];
- assign data_o[19] = (syndrome_o == 6'h38) ^ data_i[19];
- assign data_o[20] = (syndrome_o == 6'h3b) ^ data_i[20];
- assign data_o[21] = (syndrome_o == 6'h3d) ^ data_i[21];
-
- // err_o calc. bit0: single error, bit1: double error
- assign single_error = ^syndrome_o;
- assign err_o[0] = single_error;
- assign err_o[1] = ~single_error & (|syndrome_o);
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
endmodule : prim_secded_28_22_dec
diff --git a/hw/ip/prim/rtl/prim_secded_39_32_dec.sv b/hw/ip/prim/rtl/prim_secded_39_32_dec.sv
index af36fc0..10ee733 100644
--- a/hw/ip/prim/rtl/prim_secded_39_32_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_39_32_dec.sv
@@ -11,54 +11,52 @@
output logic [1:0] err_o
);
- logic single_error;
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 39'h012606BD25);
+ syndrome_o[1] = ^(data_i & 39'h02DEBA8050);
+ syndrome_o[2] = ^(data_i & 39'h04413D89AA);
+ syndrome_o[3] = ^(data_i & 39'h0831234ED1);
+ syndrome_o[4] = ^(data_i & 39'h10C2C1323B);
+ syndrome_o[5] = ^(data_i & 39'h202DCC624C);
+ syndrome_o[6] = ^(data_i & 39'h4098505586);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 39'h012606BD25);
- assign syndrome_o[1] = ^(data_i & 39'h02DEBA8050);
- assign syndrome_o[2] = ^(data_i & 39'h04413D89AA);
- assign syndrome_o[3] = ^(data_i & 39'h0831234ED1);
- assign syndrome_o[4] = ^(data_i & 39'h10C2C1323B);
- assign syndrome_o[5] = ^(data_i & 39'h202DCC624C);
- assign syndrome_o[6] = ^(data_i & 39'h4098505586);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h19) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'h54) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h61) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h34) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h1a) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'h15) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h2a) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h45) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h38) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h49) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'hd) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h51) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h31) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h68) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'h7) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h1c) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'hb) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h25) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h26) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h46) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'he) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h70) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h32) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h2c) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h13) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h23) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h62) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h4a) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h29) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h16) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h52) ^ data_i[31];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 7'h19) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 7'h54) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 7'h61) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 7'h34) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 7'h1a) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 7'h15) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 7'h2a) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 7'h45) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 7'h38) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 7'h49) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 7'hd) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 7'h51) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 7'h31) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 7'h68) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 7'h7) ^ data_i[15];
- assign data_o[16] = (syndrome_o == 7'h1c) ^ data_i[16];
- assign data_o[17] = (syndrome_o == 7'hb) ^ data_i[17];
- assign data_o[18] = (syndrome_o == 7'h25) ^ data_i[18];
- assign data_o[19] = (syndrome_o == 7'h26) ^ data_i[19];
- assign data_o[20] = (syndrome_o == 7'h46) ^ data_i[20];
- assign data_o[21] = (syndrome_o == 7'he) ^ data_i[21];
- assign data_o[22] = (syndrome_o == 7'h70) ^ data_i[22];
- assign data_o[23] = (syndrome_o == 7'h32) ^ data_i[23];
- assign data_o[24] = (syndrome_o == 7'h2c) ^ data_i[24];
- assign data_o[25] = (syndrome_o == 7'h13) ^ data_i[25];
- assign data_o[26] = (syndrome_o == 7'h23) ^ data_i[26];
- assign data_o[27] = (syndrome_o == 7'h62) ^ data_i[27];
- assign data_o[28] = (syndrome_o == 7'h4a) ^ data_i[28];
- assign data_o[29] = (syndrome_o == 7'h29) ^ data_i[29];
- assign data_o[30] = (syndrome_o == 7'h16) ^ data_i[30];
- assign data_o[31] = (syndrome_o == 7'h52) ^ data_i[31];
-
- // err_o calc. bit0: single error, bit1: double error
- assign single_error = ^syndrome_o;
- assign err_o[0] = single_error;
- assign err_o[1] = ~single_error & (|syndrome_o);
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
endmodule : prim_secded_39_32_dec
diff --git a/hw/ip/prim/rtl/prim_secded_64_57_dec.sv b/hw/ip/prim/rtl/prim_secded_64_57_dec.sv
index a4a58e7..dc1fd42 100644
--- a/hw/ip/prim/rtl/prim_secded_64_57_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_64_57_dec.sv
@@ -11,79 +11,77 @@
output logic [1:0] err_o
);
- logic single_error;
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 64'h0303FFF800007FFF);
+ syndrome_o[1] = ^(data_i & 64'h057C1FF801FF801F);
+ syndrome_o[2] = ^(data_i & 64'h09BDE1F87E0781E1);
+ syndrome_o[3] = ^(data_i & 64'h11DEEE3B8E388E22);
+ syndrome_o[4] = ^(data_i & 64'h21EF76CDB2C93244);
+ syndrome_o[5] = ^(data_i & 64'h41F7BB56D5525488);
+ syndrome_o[6] = ^(data_i & 64'h81FBDDA769A46910);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 64'h0303FFF800007FFF);
- assign syndrome_o[1] = ^(data_i & 64'h057C1FF801FF801F);
- assign syndrome_o[2] = ^(data_i & 64'h09BDE1F87E0781E1);
- assign syndrome_o[3] = ^(data_i & 64'h11DEEE3B8E388E22);
- assign syndrome_o[4] = ^(data_i & 64'h21EF76CDB2C93244);
- assign syndrome_o[5] = ^(data_i & 64'h41F7BB56D5525488);
- assign syndrome_o[6] = ^(data_i & 64'h81FBDDA769A46910);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h43) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'hd) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h15) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h25) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h45) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h19) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h29) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'h49) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h31) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h51) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h61) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'he) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h16) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'h26) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h46) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h1a) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h2a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'h4a) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h32) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h52) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h62) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h1c) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h2c) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h4c) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h34) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h54) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h64) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h38) ^ data_i[31];
+ data_o[32] = (syndrome_o == 7'h58) ^ data_i[32];
+ data_o[33] = (syndrome_o == 7'h68) ^ data_i[33];
+ data_o[34] = (syndrome_o == 7'h70) ^ data_i[34];
+ data_o[35] = (syndrome_o == 7'h1f) ^ data_i[35];
+ data_o[36] = (syndrome_o == 7'h2f) ^ data_i[36];
+ data_o[37] = (syndrome_o == 7'h4f) ^ data_i[37];
+ data_o[38] = (syndrome_o == 7'h37) ^ data_i[38];
+ data_o[39] = (syndrome_o == 7'h57) ^ data_i[39];
+ data_o[40] = (syndrome_o == 7'h67) ^ data_i[40];
+ data_o[41] = (syndrome_o == 7'h3b) ^ data_i[41];
+ data_o[42] = (syndrome_o == 7'h5b) ^ data_i[42];
+ data_o[43] = (syndrome_o == 7'h6b) ^ data_i[43];
+ data_o[44] = (syndrome_o == 7'h73) ^ data_i[44];
+ data_o[45] = (syndrome_o == 7'h3d) ^ data_i[45];
+ data_o[46] = (syndrome_o == 7'h5d) ^ data_i[46];
+ data_o[47] = (syndrome_o == 7'h6d) ^ data_i[47];
+ data_o[48] = (syndrome_o == 7'h75) ^ data_i[48];
+ data_o[49] = (syndrome_o == 7'h79) ^ data_i[49];
+ data_o[50] = (syndrome_o == 7'h3e) ^ data_i[50];
+ data_o[51] = (syndrome_o == 7'h5e) ^ data_i[51];
+ data_o[52] = (syndrome_o == 7'h6e) ^ data_i[52];
+ data_o[53] = (syndrome_o == 7'h76) ^ data_i[53];
+ data_o[54] = (syndrome_o == 7'h7a) ^ data_i[54];
+ data_o[55] = (syndrome_o == 7'h7c) ^ data_i[55];
+ data_o[56] = (syndrome_o == 7'h7f) ^ data_i[56];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 7'h7) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 7'hb) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 7'h13) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 7'h23) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 7'h43) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 7'hd) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 7'h15) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 7'h25) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 7'h45) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 7'h19) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 7'h29) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 7'h49) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 7'h31) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 7'h51) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 7'h61) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 7'he) ^ data_i[15];
- assign data_o[16] = (syndrome_o == 7'h16) ^ data_i[16];
- assign data_o[17] = (syndrome_o == 7'h26) ^ data_i[17];
- assign data_o[18] = (syndrome_o == 7'h46) ^ data_i[18];
- assign data_o[19] = (syndrome_o == 7'h1a) ^ data_i[19];
- assign data_o[20] = (syndrome_o == 7'h2a) ^ data_i[20];
- assign data_o[21] = (syndrome_o == 7'h4a) ^ data_i[21];
- assign data_o[22] = (syndrome_o == 7'h32) ^ data_i[22];
- assign data_o[23] = (syndrome_o == 7'h52) ^ data_i[23];
- assign data_o[24] = (syndrome_o == 7'h62) ^ data_i[24];
- assign data_o[25] = (syndrome_o == 7'h1c) ^ data_i[25];
- assign data_o[26] = (syndrome_o == 7'h2c) ^ data_i[26];
- assign data_o[27] = (syndrome_o == 7'h4c) ^ data_i[27];
- assign data_o[28] = (syndrome_o == 7'h34) ^ data_i[28];
- assign data_o[29] = (syndrome_o == 7'h54) ^ data_i[29];
- assign data_o[30] = (syndrome_o == 7'h64) ^ data_i[30];
- assign data_o[31] = (syndrome_o == 7'h38) ^ data_i[31];
- assign data_o[32] = (syndrome_o == 7'h58) ^ data_i[32];
- assign data_o[33] = (syndrome_o == 7'h68) ^ data_i[33];
- assign data_o[34] = (syndrome_o == 7'h70) ^ data_i[34];
- assign data_o[35] = (syndrome_o == 7'h1f) ^ data_i[35];
- assign data_o[36] = (syndrome_o == 7'h2f) ^ data_i[36];
- assign data_o[37] = (syndrome_o == 7'h4f) ^ data_i[37];
- assign data_o[38] = (syndrome_o == 7'h37) ^ data_i[38];
- assign data_o[39] = (syndrome_o == 7'h57) ^ data_i[39];
- assign data_o[40] = (syndrome_o == 7'h67) ^ data_i[40];
- assign data_o[41] = (syndrome_o == 7'h3b) ^ data_i[41];
- assign data_o[42] = (syndrome_o == 7'h5b) ^ data_i[42];
- assign data_o[43] = (syndrome_o == 7'h6b) ^ data_i[43];
- assign data_o[44] = (syndrome_o == 7'h73) ^ data_i[44];
- assign data_o[45] = (syndrome_o == 7'h3d) ^ data_i[45];
- assign data_o[46] = (syndrome_o == 7'h5d) ^ data_i[46];
- assign data_o[47] = (syndrome_o == 7'h6d) ^ data_i[47];
- assign data_o[48] = (syndrome_o == 7'h75) ^ data_i[48];
- assign data_o[49] = (syndrome_o == 7'h79) ^ data_i[49];
- assign data_o[50] = (syndrome_o == 7'h3e) ^ data_i[50];
- assign data_o[51] = (syndrome_o == 7'h5e) ^ data_i[51];
- assign data_o[52] = (syndrome_o == 7'h6e) ^ data_i[52];
- assign data_o[53] = (syndrome_o == 7'h76) ^ data_i[53];
- assign data_o[54] = (syndrome_o == 7'h7a) ^ data_i[54];
- assign data_o[55] = (syndrome_o == 7'h7c) ^ data_i[55];
- assign data_o[56] = (syndrome_o == 7'h7f) ^ data_i[56];
-
- // err_o calc. bit0: single error, bit1: double error
- assign single_error = ^syndrome_o;
- assign err_o[0] = single_error;
- assign err_o[1] = ~single_error & (|syndrome_o);
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
endmodule : prim_secded_64_57_dec
diff --git a/hw/ip/prim/rtl/prim_secded_72_64_dec.sv b/hw/ip/prim/rtl/prim_secded_72_64_dec.sv
index 17c5f3b..112a64f 100644
--- a/hw/ip/prim/rtl/prim_secded_72_64_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_72_64_dec.sv
@@ -11,87 +11,85 @@
output logic [1:0] err_o
);
- logic single_error;
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 72'h01B9000000001FFFFF);
+ syndrome_o[1] = ^(data_i & 72'h025E00000FFFE0003F);
+ syndrome_o[2] = ^(data_i & 72'h0467003FF003E007C1);
+ syndrome_o[3] = ^(data_i & 72'h08CD0FC0F03C207842);
+ syndrome_o[4] = ^(data_i & 72'h10B671C711C4438884);
+ syndrome_o[5] = ^(data_i & 72'h20B5B65926488C9108);
+ syndrome_o[6] = ^(data_i & 72'h40CBDAAA4A91152210);
+ syndrome_o[7] = ^(data_i & 72'h807AED348D221A4420);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 72'h01B9000000001FFFFF);
- assign syndrome_o[1] = ^(data_i & 72'h025E00000FFFE0003F);
- assign syndrome_o[2] = ^(data_i & 72'h0467003FF003E007C1);
- assign syndrome_o[3] = ^(data_i & 72'h08CD0FC0F03C207842);
- assign syndrome_o[4] = ^(data_i & 72'h10B671C711C4438884);
- assign syndrome_o[5] = ^(data_i & 72'h20B5B65926488C9108);
- assign syndrome_o[6] = ^(data_i & 72'h40CBDAAA4A91152210);
- assign syndrome_o[7] = ^(data_i & 72'h807AED348D221A4420);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h43) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h83) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'hd) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h15) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h25) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h45) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h85) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h19) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h29) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h49) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h89) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h31) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h51) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h91) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h61) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'ha1) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'hc1) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'he) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h16) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h26) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h46) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h86) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'h1a) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'h2a) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'h4a) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'h8a) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'h32) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'h52) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'h92) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'h62) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha2) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'hc2) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'h1c) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'h2c) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'h4c) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'h8c) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'h34) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'h54) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'h94) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'h64) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'ha4) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hc4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'h38) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'h58) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'h98) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'h68) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'ha8) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hc8) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'h70) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hb0) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hd0) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'he0) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'h6d) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hd6) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'h3e) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hcb) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hb3) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hb5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hce) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'h79) ^ data_i[63];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 8'h7) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 8'hb) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 8'h13) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 8'h23) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 8'h43) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 8'h83) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 8'hd) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 8'h15) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 8'h25) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 8'h45) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 8'h85) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 8'h19) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 8'h29) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 8'h49) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 8'h89) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 8'h31) ^ data_i[15];
- assign data_o[16] = (syndrome_o == 8'h51) ^ data_i[16];
- assign data_o[17] = (syndrome_o == 8'h91) ^ data_i[17];
- assign data_o[18] = (syndrome_o == 8'h61) ^ data_i[18];
- assign data_o[19] = (syndrome_o == 8'ha1) ^ data_i[19];
- assign data_o[20] = (syndrome_o == 8'hc1) ^ data_i[20];
- assign data_o[21] = (syndrome_o == 8'he) ^ data_i[21];
- assign data_o[22] = (syndrome_o == 8'h16) ^ data_i[22];
- assign data_o[23] = (syndrome_o == 8'h26) ^ data_i[23];
- assign data_o[24] = (syndrome_o == 8'h46) ^ data_i[24];
- assign data_o[25] = (syndrome_o == 8'h86) ^ data_i[25];
- assign data_o[26] = (syndrome_o == 8'h1a) ^ data_i[26];
- assign data_o[27] = (syndrome_o == 8'h2a) ^ data_i[27];
- assign data_o[28] = (syndrome_o == 8'h4a) ^ data_i[28];
- assign data_o[29] = (syndrome_o == 8'h8a) ^ data_i[29];
- assign data_o[30] = (syndrome_o == 8'h32) ^ data_i[30];
- assign data_o[31] = (syndrome_o == 8'h52) ^ data_i[31];
- assign data_o[32] = (syndrome_o == 8'h92) ^ data_i[32];
- assign data_o[33] = (syndrome_o == 8'h62) ^ data_i[33];
- assign data_o[34] = (syndrome_o == 8'ha2) ^ data_i[34];
- assign data_o[35] = (syndrome_o == 8'hc2) ^ data_i[35];
- assign data_o[36] = (syndrome_o == 8'h1c) ^ data_i[36];
- assign data_o[37] = (syndrome_o == 8'h2c) ^ data_i[37];
- assign data_o[38] = (syndrome_o == 8'h4c) ^ data_i[38];
- assign data_o[39] = (syndrome_o == 8'h8c) ^ data_i[39];
- assign data_o[40] = (syndrome_o == 8'h34) ^ data_i[40];
- assign data_o[41] = (syndrome_o == 8'h54) ^ data_i[41];
- assign data_o[42] = (syndrome_o == 8'h94) ^ data_i[42];
- assign data_o[43] = (syndrome_o == 8'h64) ^ data_i[43];
- assign data_o[44] = (syndrome_o == 8'ha4) ^ data_i[44];
- assign data_o[45] = (syndrome_o == 8'hc4) ^ data_i[45];
- assign data_o[46] = (syndrome_o == 8'h38) ^ data_i[46];
- assign data_o[47] = (syndrome_o == 8'h58) ^ data_i[47];
- assign data_o[48] = (syndrome_o == 8'h98) ^ data_i[48];
- assign data_o[49] = (syndrome_o == 8'h68) ^ data_i[49];
- assign data_o[50] = (syndrome_o == 8'ha8) ^ data_i[50];
- assign data_o[51] = (syndrome_o == 8'hc8) ^ data_i[51];
- assign data_o[52] = (syndrome_o == 8'h70) ^ data_i[52];
- assign data_o[53] = (syndrome_o == 8'hb0) ^ data_i[53];
- assign data_o[54] = (syndrome_o == 8'hd0) ^ data_i[54];
- assign data_o[55] = (syndrome_o == 8'he0) ^ data_i[55];
- assign data_o[56] = (syndrome_o == 8'h6d) ^ data_i[56];
- assign data_o[57] = (syndrome_o == 8'hd6) ^ data_i[57];
- assign data_o[58] = (syndrome_o == 8'h3e) ^ data_i[58];
- assign data_o[59] = (syndrome_o == 8'hcb) ^ data_i[59];
- assign data_o[60] = (syndrome_o == 8'hb3) ^ data_i[60];
- assign data_o[61] = (syndrome_o == 8'hb5) ^ data_i[61];
- assign data_o[62] = (syndrome_o == 8'hce) ^ data_i[62];
- assign data_o[63] = (syndrome_o == 8'h79) ^ data_i[63];
-
- // err_o calc. bit0: single error, bit1: double error
- assign single_error = ^syndrome_o;
- assign err_o[0] = single_error;
- assign err_o[1] = ~single_error & (|syndrome_o);
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
endmodule : prim_secded_72_64_dec
diff --git a/hw/ip/prim/rtl/prim_secded_hamming_22_16_dec.sv b/hw/ip/prim/rtl/prim_secded_hamming_22_16_dec.sv
index 1555e4e..135dc2f 100644
--- a/hw/ip/prim/rtl/prim_secded_hamming_22_16_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_hamming_22_16_dec.sv
@@ -11,35 +11,35 @@
output logic [1:0] err_o
);
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 22'h01AD5B);
+ syndrome_o[1] = ^(data_i & 22'h02366D);
+ syndrome_o[2] = ^(data_i & 22'h04C78E);
+ syndrome_o[3] = ^(data_i & 22'h0807F0);
+ syndrome_o[4] = ^(data_i & 22'h10F800);
+ syndrome_o[5] = ^(data_i & 22'h3FFFFF);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 22'h01AD5B);
- assign syndrome_o[1] = ^(data_i & 22'h02366D);
- assign syndrome_o[2] = ^(data_i & 22'h04C78E);
- assign syndrome_o[3] = ^(data_i & 22'h0807F0);
- assign syndrome_o[4] = ^(data_i & 22'h10F800);
- assign syndrome_o[5] = ^(data_i & 22'h3FFFFF);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h23) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'h25) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h26) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h27) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'h29) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h2a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h2b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h2c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h2d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'h2e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'h2f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h31) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h32) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h33) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'h34) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h35) ^ data_i[15];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 6'h23) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 6'h25) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 6'h26) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 6'h27) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 6'h29) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 6'h2a) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 6'h2b) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 6'h2c) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 6'h2d) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 6'h2e) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 6'h2f) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 6'h31) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 6'h32) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 6'h33) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 6'h34) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 6'h35) ^ data_i[15];
-
- // err_o calc. bit0: single error, bit1: double error
- assign err_o[0] = syndrome_o[5];
- assign err_o[1] = |syndrome_o[4:0] & ~syndrome_o[5];
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[5];
+ err_o[1] = |syndrome_o[4:0] & ~syndrome_o[5];
+ end
endmodule : prim_secded_hamming_22_16_dec
diff --git a/hw/ip/prim/rtl/prim_secded_hamming_39_32_dec.sv b/hw/ip/prim/rtl/prim_secded_hamming_39_32_dec.sv
index 3271cfc..1f41364 100644
--- a/hw/ip/prim/rtl/prim_secded_hamming_39_32_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_hamming_39_32_dec.sv
@@ -11,52 +11,52 @@
output logic [1:0] err_o
);
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 39'h0156AAAD5B);
+ syndrome_o[1] = ^(data_i & 39'h029B33366D);
+ syndrome_o[2] = ^(data_i & 39'h04E3C3C78E);
+ syndrome_o[3] = ^(data_i & 39'h0803FC07F0);
+ syndrome_o[4] = ^(data_i & 39'h1003FFF800);
+ syndrome_o[5] = ^(data_i & 39'h20FC000000);
+ syndrome_o[6] = ^(data_i & 39'h7FFFFFFFFF);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 39'h0156AAAD5B);
- assign syndrome_o[1] = ^(data_i & 39'h029B33366D);
- assign syndrome_o[2] = ^(data_i & 39'h04E3C3C78E);
- assign syndrome_o[3] = ^(data_i & 39'h0803FC07F0);
- assign syndrome_o[4] = ^(data_i & 39'h1003FFF800);
- assign syndrome_o[5] = ^(data_i & 39'h20FC000000);
- assign syndrome_o[6] = ^(data_i & 39'h7FFFFFFFFF);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h43) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'h45) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h46) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h47) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h49) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'h4a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h4b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h4d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h4e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h4f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'h51) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h52) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h53) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h54) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'h55) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h56) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'h57) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h58) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h59) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h5a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'h5b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h5c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h5d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h5e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h5f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h61) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h62) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h63) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h64) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h65) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h66) ^ data_i[31];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 7'h43) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 7'h45) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 7'h46) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 7'h47) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 7'h49) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 7'h4a) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 7'h4b) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 7'h4d) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 7'h4e) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 7'h4f) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 7'h51) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 7'h52) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 7'h53) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 7'h54) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 7'h55) ^ data_i[15];
- assign data_o[16] = (syndrome_o == 7'h56) ^ data_i[16];
- assign data_o[17] = (syndrome_o == 7'h57) ^ data_i[17];
- assign data_o[18] = (syndrome_o == 7'h58) ^ data_i[18];
- assign data_o[19] = (syndrome_o == 7'h59) ^ data_i[19];
- assign data_o[20] = (syndrome_o == 7'h5a) ^ data_i[20];
- assign data_o[21] = (syndrome_o == 7'h5b) ^ data_i[21];
- assign data_o[22] = (syndrome_o == 7'h5c) ^ data_i[22];
- assign data_o[23] = (syndrome_o == 7'h5d) ^ data_i[23];
- assign data_o[24] = (syndrome_o == 7'h5e) ^ data_i[24];
- assign data_o[25] = (syndrome_o == 7'h5f) ^ data_i[25];
- assign data_o[26] = (syndrome_o == 7'h61) ^ data_i[26];
- assign data_o[27] = (syndrome_o == 7'h62) ^ data_i[27];
- assign data_o[28] = (syndrome_o == 7'h63) ^ data_i[28];
- assign data_o[29] = (syndrome_o == 7'h64) ^ data_i[29];
- assign data_o[30] = (syndrome_o == 7'h65) ^ data_i[30];
- assign data_o[31] = (syndrome_o == 7'h66) ^ data_i[31];
-
- // err_o calc. bit0: single error, bit1: double error
- assign err_o[0] = syndrome_o[6];
- assign err_o[1] = |syndrome_o[5:0] & ~syndrome_o[6];
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[6];
+ err_o[1] = |syndrome_o[5:0] & ~syndrome_o[6];
+ end
endmodule : prim_secded_hamming_39_32_dec
diff --git a/hw/ip/prim/rtl/prim_secded_hamming_72_64_dec.sv b/hw/ip/prim/rtl/prim_secded_hamming_72_64_dec.sv
index a48cdde..7eaaa40 100644
--- a/hw/ip/prim/rtl/prim_secded_hamming_72_64_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_hamming_72_64_dec.sv
@@ -11,85 +11,85 @@
output logic [1:0] err_o
);
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 72'h01AB55555556AAAD5B);
+ syndrome_o[1] = ^(data_i & 72'h02CD9999999B33366D);
+ syndrome_o[2] = ^(data_i & 72'h04F1E1E1E1E3C3C78E);
+ syndrome_o[3] = ^(data_i & 72'h0801FE01FE03FC07F0);
+ syndrome_o[4] = ^(data_i & 72'h1001FFFE0003FFF800);
+ syndrome_o[5] = ^(data_i & 72'h2001FFFFFFFC000000);
+ syndrome_o[6] = ^(data_i & 72'h40FE00000000000000);
+ syndrome_o[7] = ^(data_i & 72'hFFFFFFFFFFFFFFFFFF);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 72'h01AB55555556AAAD5B);
- assign syndrome_o[1] = ^(data_i & 72'h02CD9999999B33366D);
- assign syndrome_o[2] = ^(data_i & 72'h04F1E1E1E1E3C3C78E);
- assign syndrome_o[3] = ^(data_i & 72'h0801FE01FE03FC07F0);
- assign syndrome_o[4] = ^(data_i & 72'h1001FFFE0003FFF800);
- assign syndrome_o[5] = ^(data_i & 72'h2001FFFFFFFC000000);
- assign syndrome_o[6] = ^(data_i & 72'h40FE00000000000000);
- assign syndrome_o[7] = ^(data_i & 72'hFFFFFFFFFFFFFFFFFF);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h83) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'h85) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h86) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h87) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h89) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h8a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'h8b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h8c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h8d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h8e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h8f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h91) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h92) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h93) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h94) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h95) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h96) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h97) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h98) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'h99) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'h9a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'h9b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h9c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h9d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h9e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h9f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'ha1) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'ha2) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'ha3) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'ha4) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'ha5) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'ha6) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'ha7) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'ha8) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha9) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'haa) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'hab) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'hac) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'had) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'hae) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'haf) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'hb0) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'hb1) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'hb2) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'hb3) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hb4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'hb5) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'hb6) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'hb7) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'hb8) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'hb9) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hba) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'hbb) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hbc) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hbd) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'hbe) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'hbf) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hc1) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'hc2) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hc3) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hc4) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hc5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hc6) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'hc7) ^ data_i[63];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 8'h83) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 8'h85) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 8'h86) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 8'h87) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 8'h89) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 8'h8a) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 8'h8b) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 8'h8c) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 8'h8d) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 8'h8e) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 8'h8f) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 8'h91) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 8'h92) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 8'h93) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 8'h94) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 8'h95) ^ data_i[15];
- assign data_o[16] = (syndrome_o == 8'h96) ^ data_i[16];
- assign data_o[17] = (syndrome_o == 8'h97) ^ data_i[17];
- assign data_o[18] = (syndrome_o == 8'h98) ^ data_i[18];
- assign data_o[19] = (syndrome_o == 8'h99) ^ data_i[19];
- assign data_o[20] = (syndrome_o == 8'h9a) ^ data_i[20];
- assign data_o[21] = (syndrome_o == 8'h9b) ^ data_i[21];
- assign data_o[22] = (syndrome_o == 8'h9c) ^ data_i[22];
- assign data_o[23] = (syndrome_o == 8'h9d) ^ data_i[23];
- assign data_o[24] = (syndrome_o == 8'h9e) ^ data_i[24];
- assign data_o[25] = (syndrome_o == 8'h9f) ^ data_i[25];
- assign data_o[26] = (syndrome_o == 8'ha1) ^ data_i[26];
- assign data_o[27] = (syndrome_o == 8'ha2) ^ data_i[27];
- assign data_o[28] = (syndrome_o == 8'ha3) ^ data_i[28];
- assign data_o[29] = (syndrome_o == 8'ha4) ^ data_i[29];
- assign data_o[30] = (syndrome_o == 8'ha5) ^ data_i[30];
- assign data_o[31] = (syndrome_o == 8'ha6) ^ data_i[31];
- assign data_o[32] = (syndrome_o == 8'ha7) ^ data_i[32];
- assign data_o[33] = (syndrome_o == 8'ha8) ^ data_i[33];
- assign data_o[34] = (syndrome_o == 8'ha9) ^ data_i[34];
- assign data_o[35] = (syndrome_o == 8'haa) ^ data_i[35];
- assign data_o[36] = (syndrome_o == 8'hab) ^ data_i[36];
- assign data_o[37] = (syndrome_o == 8'hac) ^ data_i[37];
- assign data_o[38] = (syndrome_o == 8'had) ^ data_i[38];
- assign data_o[39] = (syndrome_o == 8'hae) ^ data_i[39];
- assign data_o[40] = (syndrome_o == 8'haf) ^ data_i[40];
- assign data_o[41] = (syndrome_o == 8'hb0) ^ data_i[41];
- assign data_o[42] = (syndrome_o == 8'hb1) ^ data_i[42];
- assign data_o[43] = (syndrome_o == 8'hb2) ^ data_i[43];
- assign data_o[44] = (syndrome_o == 8'hb3) ^ data_i[44];
- assign data_o[45] = (syndrome_o == 8'hb4) ^ data_i[45];
- assign data_o[46] = (syndrome_o == 8'hb5) ^ data_i[46];
- assign data_o[47] = (syndrome_o == 8'hb6) ^ data_i[47];
- assign data_o[48] = (syndrome_o == 8'hb7) ^ data_i[48];
- assign data_o[49] = (syndrome_o == 8'hb8) ^ data_i[49];
- assign data_o[50] = (syndrome_o == 8'hb9) ^ data_i[50];
- assign data_o[51] = (syndrome_o == 8'hba) ^ data_i[51];
- assign data_o[52] = (syndrome_o == 8'hbb) ^ data_i[52];
- assign data_o[53] = (syndrome_o == 8'hbc) ^ data_i[53];
- assign data_o[54] = (syndrome_o == 8'hbd) ^ data_i[54];
- assign data_o[55] = (syndrome_o == 8'hbe) ^ data_i[55];
- assign data_o[56] = (syndrome_o == 8'hbf) ^ data_i[56];
- assign data_o[57] = (syndrome_o == 8'hc1) ^ data_i[57];
- assign data_o[58] = (syndrome_o == 8'hc2) ^ data_i[58];
- assign data_o[59] = (syndrome_o == 8'hc3) ^ data_i[59];
- assign data_o[60] = (syndrome_o == 8'hc4) ^ data_i[60];
- assign data_o[61] = (syndrome_o == 8'hc5) ^ data_i[61];
- assign data_o[62] = (syndrome_o == 8'hc6) ^ data_i[62];
- assign data_o[63] = (syndrome_o == 8'hc7) ^ data_i[63];
-
- // err_o calc. bit0: single error, bit1: double error
- assign err_o[0] = syndrome_o[7];
- assign err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[7];
+ err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
+ end
endmodule : prim_secded_hamming_72_64_dec
diff --git a/hw/ip/prim/rtl/prim_secded_hamming_76_68_dec.sv b/hw/ip/prim/rtl/prim_secded_hamming_76_68_dec.sv
index 85690bc..418a233 100644
--- a/hw/ip/prim/rtl/prim_secded_hamming_76_68_dec.sv
+++ b/hw/ip/prim/rtl/prim_secded_hamming_76_68_dec.sv
@@ -11,89 +11,89 @@
output logic [1:0] err_o
);
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^(data_i & 76'h01AAB55555556AAAD5B);
+ syndrome_o[1] = ^(data_i & 76'h02CCD9999999B33366D);
+ syndrome_o[2] = ^(data_i & 76'h040F1E1E1E1E3C3C78E);
+ syndrome_o[3] = ^(data_i & 76'h08F01FE01FE03FC07F0);
+ syndrome_o[4] = ^(data_i & 76'h10001FFFE0003FFF800);
+ syndrome_o[5] = ^(data_i & 76'h20001FFFFFFFC000000);
+ syndrome_o[6] = ^(data_i & 76'h40FFE00000000000000);
+ syndrome_o[7] = ^(data_i & 76'hFFFFFFFFFFFFFFFFFFF);
- // Syndrome calculation
- assign syndrome_o[0] = ^(data_i & 76'h01AAB55555556AAAD5B);
- assign syndrome_o[1] = ^(data_i & 76'h02CCD9999999B33366D);
- assign syndrome_o[2] = ^(data_i & 76'h040F1E1E1E1E3C3C78E);
- assign syndrome_o[3] = ^(data_i & 76'h08F01FE01FE03FC07F0);
- assign syndrome_o[4] = ^(data_i & 76'h10001FFFE0003FFF800);
- assign syndrome_o[5] = ^(data_i & 76'h20001FFFFFFFC000000);
- assign syndrome_o[6] = ^(data_i & 76'h40FFE00000000000000);
- assign syndrome_o[7] = ^(data_i & 76'hFFFFFFFFFFFFFFFFFFF);
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h83) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'h85) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h86) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h87) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h89) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h8a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'h8b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h8c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h8d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h8e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h8f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h91) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h92) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h93) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h94) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h95) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h96) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h97) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h98) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'h99) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'h9a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'h9b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h9c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h9d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h9e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h9f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'ha1) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'ha2) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'ha3) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'ha4) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'ha5) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'ha6) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'ha7) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'ha8) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha9) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'haa) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'hab) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'hac) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'had) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'hae) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'haf) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'hb0) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'hb1) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'hb2) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'hb3) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hb4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'hb5) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'hb6) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'hb7) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'hb8) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'hb9) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hba) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'hbb) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hbc) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hbd) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'hbe) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'hbf) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hc1) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'hc2) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hc3) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hc4) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hc5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hc6) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'hc7) ^ data_i[63];
+ data_o[64] = (syndrome_o == 8'hc8) ^ data_i[64];
+ data_o[65] = (syndrome_o == 8'hc9) ^ data_i[65];
+ data_o[66] = (syndrome_o == 8'hca) ^ data_i[66];
+ data_o[67] = (syndrome_o == 8'hcb) ^ data_i[67];
- // Corrected output calculation
- assign data_o[0] = (syndrome_o == 8'h83) ^ data_i[0];
- assign data_o[1] = (syndrome_o == 8'h85) ^ data_i[1];
- assign data_o[2] = (syndrome_o == 8'h86) ^ data_i[2];
- assign data_o[3] = (syndrome_o == 8'h87) ^ data_i[3];
- assign data_o[4] = (syndrome_o == 8'h89) ^ data_i[4];
- assign data_o[5] = (syndrome_o == 8'h8a) ^ data_i[5];
- assign data_o[6] = (syndrome_o == 8'h8b) ^ data_i[6];
- assign data_o[7] = (syndrome_o == 8'h8c) ^ data_i[7];
- assign data_o[8] = (syndrome_o == 8'h8d) ^ data_i[8];
- assign data_o[9] = (syndrome_o == 8'h8e) ^ data_i[9];
- assign data_o[10] = (syndrome_o == 8'h8f) ^ data_i[10];
- assign data_o[11] = (syndrome_o == 8'h91) ^ data_i[11];
- assign data_o[12] = (syndrome_o == 8'h92) ^ data_i[12];
- assign data_o[13] = (syndrome_o == 8'h93) ^ data_i[13];
- assign data_o[14] = (syndrome_o == 8'h94) ^ data_i[14];
- assign data_o[15] = (syndrome_o == 8'h95) ^ data_i[15];
- assign data_o[16] = (syndrome_o == 8'h96) ^ data_i[16];
- assign data_o[17] = (syndrome_o == 8'h97) ^ data_i[17];
- assign data_o[18] = (syndrome_o == 8'h98) ^ data_i[18];
- assign data_o[19] = (syndrome_o == 8'h99) ^ data_i[19];
- assign data_o[20] = (syndrome_o == 8'h9a) ^ data_i[20];
- assign data_o[21] = (syndrome_o == 8'h9b) ^ data_i[21];
- assign data_o[22] = (syndrome_o == 8'h9c) ^ data_i[22];
- assign data_o[23] = (syndrome_o == 8'h9d) ^ data_i[23];
- assign data_o[24] = (syndrome_o == 8'h9e) ^ data_i[24];
- assign data_o[25] = (syndrome_o == 8'h9f) ^ data_i[25];
- assign data_o[26] = (syndrome_o == 8'ha1) ^ data_i[26];
- assign data_o[27] = (syndrome_o == 8'ha2) ^ data_i[27];
- assign data_o[28] = (syndrome_o == 8'ha3) ^ data_i[28];
- assign data_o[29] = (syndrome_o == 8'ha4) ^ data_i[29];
- assign data_o[30] = (syndrome_o == 8'ha5) ^ data_i[30];
- assign data_o[31] = (syndrome_o == 8'ha6) ^ data_i[31];
- assign data_o[32] = (syndrome_o == 8'ha7) ^ data_i[32];
- assign data_o[33] = (syndrome_o == 8'ha8) ^ data_i[33];
- assign data_o[34] = (syndrome_o == 8'ha9) ^ data_i[34];
- assign data_o[35] = (syndrome_o == 8'haa) ^ data_i[35];
- assign data_o[36] = (syndrome_o == 8'hab) ^ data_i[36];
- assign data_o[37] = (syndrome_o == 8'hac) ^ data_i[37];
- assign data_o[38] = (syndrome_o == 8'had) ^ data_i[38];
- assign data_o[39] = (syndrome_o == 8'hae) ^ data_i[39];
- assign data_o[40] = (syndrome_o == 8'haf) ^ data_i[40];
- assign data_o[41] = (syndrome_o == 8'hb0) ^ data_i[41];
- assign data_o[42] = (syndrome_o == 8'hb1) ^ data_i[42];
- assign data_o[43] = (syndrome_o == 8'hb2) ^ data_i[43];
- assign data_o[44] = (syndrome_o == 8'hb3) ^ data_i[44];
- assign data_o[45] = (syndrome_o == 8'hb4) ^ data_i[45];
- assign data_o[46] = (syndrome_o == 8'hb5) ^ data_i[46];
- assign data_o[47] = (syndrome_o == 8'hb6) ^ data_i[47];
- assign data_o[48] = (syndrome_o == 8'hb7) ^ data_i[48];
- assign data_o[49] = (syndrome_o == 8'hb8) ^ data_i[49];
- assign data_o[50] = (syndrome_o == 8'hb9) ^ data_i[50];
- assign data_o[51] = (syndrome_o == 8'hba) ^ data_i[51];
- assign data_o[52] = (syndrome_o == 8'hbb) ^ data_i[52];
- assign data_o[53] = (syndrome_o == 8'hbc) ^ data_i[53];
- assign data_o[54] = (syndrome_o == 8'hbd) ^ data_i[54];
- assign data_o[55] = (syndrome_o == 8'hbe) ^ data_i[55];
- assign data_o[56] = (syndrome_o == 8'hbf) ^ data_i[56];
- assign data_o[57] = (syndrome_o == 8'hc1) ^ data_i[57];
- assign data_o[58] = (syndrome_o == 8'hc2) ^ data_i[58];
- assign data_o[59] = (syndrome_o == 8'hc3) ^ data_i[59];
- assign data_o[60] = (syndrome_o == 8'hc4) ^ data_i[60];
- assign data_o[61] = (syndrome_o == 8'hc5) ^ data_i[61];
- assign data_o[62] = (syndrome_o == 8'hc6) ^ data_i[62];
- assign data_o[63] = (syndrome_o == 8'hc7) ^ data_i[63];
- assign data_o[64] = (syndrome_o == 8'hc8) ^ data_i[64];
- assign data_o[65] = (syndrome_o == 8'hc9) ^ data_i[65];
- assign data_o[66] = (syndrome_o == 8'hca) ^ data_i[66];
- assign data_o[67] = (syndrome_o == 8'hcb) ^ data_i[67];
-
- // err_o calc. bit0: single error, bit1: double error
- assign err_o[0] = syndrome_o[7];
- assign err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
-
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[7];
+ err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
+ end
endmodule : prim_secded_hamming_76_68_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_22_16_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_22_16_dec.sv
new file mode 100644
index 0000000..386208f
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_22_16_dec.sv
@@ -0,0 +1,45 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_22_16_dec (
+ input [21:0] data_i,
+ output logic [15:0] data_o,
+ output logic [5:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 22'h3F0000) & 22'h01496E);
+ syndrome_o[1] = ^((data_i ^ 22'h3F0000) & 22'h02F20B);
+ syndrome_o[2] = ^((data_i ^ 22'h3F0000) & 22'h048ED8);
+ syndrome_o[3] = ^((data_i ^ 22'h3F0000) & 22'h087714);
+ syndrome_o[4] = ^((data_i ^ 22'h3F0000) & 22'h10ACA5);
+ syndrome_o[5] = ^((data_i ^ 22'h3F0000) & 22'h2011F3);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h32) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'h23) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h19) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h7) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'h2c) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h31) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h25) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h34) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h29) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'he) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'h1c) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h15) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h2a) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h1a) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'hb) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h16) ^ data_i[15];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
+endmodule : prim_secded_inv_22_16_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_22_16_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_22_16_enc.sv
new file mode 100644
index 0000000..b89772d
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_22_16_enc.sv
@@ -0,0 +1,22 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_22_16_enc (
+ input [15:0] data_i,
+ output logic [21:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 22'(data_i);
+ data_o[16] = ~^(data_o & 22'h00496E);
+ data_o[17] = ~^(data_o & 22'h00F20B);
+ data_o[18] = ~^(data_o & 22'h008ED8);
+ data_o[19] = ~^(data_o & 22'h007714);
+ data_o[20] = ~^(data_o & 22'h00ACA5);
+ data_o[21] = ~^(data_o & 22'h0011F3);
+ end
+
+endmodule : prim_secded_inv_22_16_enc
diff --git a/hw/ip/prim/rtl/prim_secded_inv_28_22_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_28_22_dec.sv
new file mode 100644
index 0000000..0f69caf
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_28_22_dec.sv
@@ -0,0 +1,51 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_28_22_dec (
+ input [27:0] data_i,
+ output logic [21:0] data_o,
+ output logic [5:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 28'hFC00000) & 28'h07003FF);
+ syndrome_o[1] = ^((data_i ^ 28'hFC00000) & 28'h090FC0F);
+ syndrome_o[2] = ^((data_i ^ 28'hFC00000) & 28'h1271C71);
+ syndrome_o[3] = ^((data_i ^ 28'hFC00000) & 28'h23B6592);
+ syndrome_o[4] = ^((data_i ^ 28'hFC00000) & 28'h43DAAA4);
+ syndrome_o[5] = ^((data_i ^ 28'hFC00000) & 28'h83ED348);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'hd) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h15) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h25) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h19) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h29) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'h31) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'he) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h16) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h26) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h1a) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'h2a) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h32) ^ data_i[15];
+ data_o[16] = (syndrome_o == 6'h1c) ^ data_i[16];
+ data_o[17] = (syndrome_o == 6'h2c) ^ data_i[17];
+ data_o[18] = (syndrome_o == 6'h34) ^ data_i[18];
+ data_o[19] = (syndrome_o == 6'h38) ^ data_i[19];
+ data_o[20] = (syndrome_o == 6'h3b) ^ data_i[20];
+ data_o[21] = (syndrome_o == 6'h3d) ^ data_i[21];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
+endmodule : prim_secded_inv_28_22_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_28_22_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_28_22_enc.sv
new file mode 100644
index 0000000..290dbfa
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_28_22_enc.sv
@@ -0,0 +1,22 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_28_22_enc (
+ input [21:0] data_i,
+ output logic [27:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 28'(data_i);
+ data_o[22] = ~^(data_o & 28'h03003FF);
+ data_o[23] = ~^(data_o & 28'h010FC0F);
+ data_o[24] = ~^(data_o & 28'h0271C71);
+ data_o[25] = ~^(data_o & 28'h03B6592);
+ data_o[26] = ~^(data_o & 28'h03DAAA4);
+ data_o[27] = ~^(data_o & 28'h03ED348);
+ end
+
+endmodule : prim_secded_inv_28_22_enc
diff --git a/hw/ip/prim/rtl/prim_secded_inv_39_32_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_39_32_dec.sv
new file mode 100644
index 0000000..f58a78d
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_39_32_dec.sv
@@ -0,0 +1,62 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_39_32_dec (
+ input [38:0] data_i,
+ output logic [31:0] data_o,
+ output logic [6:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 39'h7F00000000) & 39'h012606BD25);
+ syndrome_o[1] = ^((data_i ^ 39'h7F00000000) & 39'h02DEBA8050);
+ syndrome_o[2] = ^((data_i ^ 39'h7F00000000) & 39'h04413D89AA);
+ syndrome_o[3] = ^((data_i ^ 39'h7F00000000) & 39'h0831234ED1);
+ syndrome_o[4] = ^((data_i ^ 39'h7F00000000) & 39'h10C2C1323B);
+ syndrome_o[5] = ^((data_i ^ 39'h7F00000000) & 39'h202DCC624C);
+ syndrome_o[6] = ^((data_i ^ 39'h7F00000000) & 39'h4098505586);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h19) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'h54) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h61) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h34) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h1a) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'h15) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h2a) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h45) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h38) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h49) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'hd) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h51) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h31) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h68) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'h7) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h1c) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'hb) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h25) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h26) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h46) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'he) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h70) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h32) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h2c) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h13) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h23) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h62) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h4a) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h29) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h16) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h52) ^ data_i[31];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
+endmodule : prim_secded_inv_39_32_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_39_32_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_39_32_enc.sv
new file mode 100644
index 0000000..0161f71
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_39_32_enc.sv
@@ -0,0 +1,23 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_39_32_enc (
+ input [31:0] data_i,
+ output logic [38:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 39'(data_i);
+ data_o[32] = ~^(data_o & 39'h002606BD25);
+ data_o[33] = ~^(data_o & 39'h00DEBA8050);
+ data_o[34] = ~^(data_o & 39'h00413D89AA);
+ data_o[35] = ~^(data_o & 39'h0031234ED1);
+ data_o[36] = ~^(data_o & 39'h00C2C1323B);
+ data_o[37] = ~^(data_o & 39'h002DCC624C);
+ data_o[38] = ~^(data_o & 39'h0098505586);
+ end
+
+endmodule : prim_secded_inv_39_32_enc
diff --git a/hw/ip/prim/rtl/prim_secded_inv_64_57_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_64_57_dec.sv
new file mode 100644
index 0000000..83406e9
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_64_57_dec.sv
@@ -0,0 +1,87 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_64_57_dec (
+ input [63:0] data_i,
+ output logic [56:0] data_o,
+ output logic [6:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 64'hFE00000000000000) & 64'h0303FFF800007FFF);
+ syndrome_o[1] = ^((data_i ^ 64'hFE00000000000000) & 64'h057C1FF801FF801F);
+ syndrome_o[2] = ^((data_i ^ 64'hFE00000000000000) & 64'h09BDE1F87E0781E1);
+ syndrome_o[3] = ^((data_i ^ 64'hFE00000000000000) & 64'h11DEEE3B8E388E22);
+ syndrome_o[4] = ^((data_i ^ 64'hFE00000000000000) & 64'h21EF76CDB2C93244);
+ syndrome_o[5] = ^((data_i ^ 64'hFE00000000000000) & 64'h41F7BB56D5525488);
+ syndrome_o[6] = ^((data_i ^ 64'hFE00000000000000) & 64'h81FBDDA769A46910);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h43) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'hd) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h15) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h25) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h45) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h19) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h29) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'h49) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h31) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h51) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h61) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'he) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h16) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'h26) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h46) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h1a) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h2a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'h4a) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h32) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h52) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h62) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h1c) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h2c) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h4c) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h34) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h54) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h64) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h38) ^ data_i[31];
+ data_o[32] = (syndrome_o == 7'h58) ^ data_i[32];
+ data_o[33] = (syndrome_o == 7'h68) ^ data_i[33];
+ data_o[34] = (syndrome_o == 7'h70) ^ data_i[34];
+ data_o[35] = (syndrome_o == 7'h1f) ^ data_i[35];
+ data_o[36] = (syndrome_o == 7'h2f) ^ data_i[36];
+ data_o[37] = (syndrome_o == 7'h4f) ^ data_i[37];
+ data_o[38] = (syndrome_o == 7'h37) ^ data_i[38];
+ data_o[39] = (syndrome_o == 7'h57) ^ data_i[39];
+ data_o[40] = (syndrome_o == 7'h67) ^ data_i[40];
+ data_o[41] = (syndrome_o == 7'h3b) ^ data_i[41];
+ data_o[42] = (syndrome_o == 7'h5b) ^ data_i[42];
+ data_o[43] = (syndrome_o == 7'h6b) ^ data_i[43];
+ data_o[44] = (syndrome_o == 7'h73) ^ data_i[44];
+ data_o[45] = (syndrome_o == 7'h3d) ^ data_i[45];
+ data_o[46] = (syndrome_o == 7'h5d) ^ data_i[46];
+ data_o[47] = (syndrome_o == 7'h6d) ^ data_i[47];
+ data_o[48] = (syndrome_o == 7'h75) ^ data_i[48];
+ data_o[49] = (syndrome_o == 7'h79) ^ data_i[49];
+ data_o[50] = (syndrome_o == 7'h3e) ^ data_i[50];
+ data_o[51] = (syndrome_o == 7'h5e) ^ data_i[51];
+ data_o[52] = (syndrome_o == 7'h6e) ^ data_i[52];
+ data_o[53] = (syndrome_o == 7'h76) ^ data_i[53];
+ data_o[54] = (syndrome_o == 7'h7a) ^ data_i[54];
+ data_o[55] = (syndrome_o == 7'h7c) ^ data_i[55];
+ data_o[56] = (syndrome_o == 7'h7f) ^ data_i[56];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
+endmodule : prim_secded_inv_64_57_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_64_57_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_64_57_enc.sv
new file mode 100644
index 0000000..74b26b5
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_64_57_enc.sv
@@ -0,0 +1,23 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_64_57_enc (
+ input [56:0] data_i,
+ output logic [63:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 64'(data_i);
+ data_o[57] = ~^(data_o & 64'h0103FFF800007FFF);
+ data_o[58] = ~^(data_o & 64'h017C1FF801FF801F);
+ data_o[59] = ~^(data_o & 64'h01BDE1F87E0781E1);
+ data_o[60] = ~^(data_o & 64'h01DEEE3B8E388E22);
+ data_o[61] = ~^(data_o & 64'h01EF76CDB2C93244);
+ data_o[62] = ~^(data_o & 64'h01F7BB56D5525488);
+ data_o[63] = ~^(data_o & 64'h01FBDDA769A46910);
+ end
+
+endmodule : prim_secded_inv_64_57_enc
diff --git a/hw/ip/prim/rtl/prim_secded_inv_72_64_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_72_64_dec.sv
new file mode 100644
index 0000000..86ffe70
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_72_64_dec.sv
@@ -0,0 +1,95 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_72_64_dec (
+ input [71:0] data_i,
+ output logic [63:0] data_o,
+ output logic [7:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 72'hFF0000000000000000) & 72'h01B9000000001FFFFF);
+ syndrome_o[1] = ^((data_i ^ 72'hFF0000000000000000) & 72'h025E00000FFFE0003F);
+ syndrome_o[2] = ^((data_i ^ 72'hFF0000000000000000) & 72'h0467003FF003E007C1);
+ syndrome_o[3] = ^((data_i ^ 72'hFF0000000000000000) & 72'h08CD0FC0F03C207842);
+ syndrome_o[4] = ^((data_i ^ 72'hFF0000000000000000) & 72'h10B671C711C4438884);
+ syndrome_o[5] = ^((data_i ^ 72'hFF0000000000000000) & 72'h20B5B65926488C9108);
+ syndrome_o[6] = ^((data_i ^ 72'hFF0000000000000000) & 72'h40CBDAAA4A91152210);
+ syndrome_o[7] = ^((data_i ^ 72'hFF0000000000000000) & 72'h807AED348D221A4420);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h43) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h83) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'hd) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h15) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h25) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h45) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h85) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h19) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h29) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h49) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h89) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h31) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h51) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h91) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h61) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'ha1) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'hc1) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'he) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h16) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h26) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h46) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h86) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'h1a) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'h2a) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'h4a) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'h8a) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'h32) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'h52) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'h92) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'h62) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha2) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'hc2) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'h1c) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'h2c) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'h4c) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'h8c) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'h34) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'h54) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'h94) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'h64) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'ha4) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hc4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'h38) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'h58) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'h98) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'h68) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'ha8) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hc8) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'h70) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hb0) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hd0) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'he0) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'h6d) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hd6) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'h3e) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hcb) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hb3) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hb5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hce) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'h79) ^ data_i[63];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+ end
+endmodule : prim_secded_inv_72_64_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_72_64_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_72_64_enc.sv
new file mode 100644
index 0000000..7a32a2d
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_72_64_enc.sv
@@ -0,0 +1,24 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_72_64_enc (
+ input [63:0] data_i,
+ output logic [71:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 72'(data_i);
+ data_o[64] = ~^(data_o & 72'h00B9000000001FFFFF);
+ data_o[65] = ~^(data_o & 72'h005E00000FFFE0003F);
+ data_o[66] = ~^(data_o & 72'h0067003FF003E007C1);
+ data_o[67] = ~^(data_o & 72'h00CD0FC0F03C207842);
+ data_o[68] = ~^(data_o & 72'h00B671C711C4438884);
+ data_o[69] = ~^(data_o & 72'h00B5B65926488C9108);
+ data_o[70] = ~^(data_o & 72'h00CBDAAA4A91152210);
+ data_o[71] = ~^(data_o & 72'h007AED348D221A4420);
+ end
+
+endmodule : prim_secded_inv_72_64_enc
diff --git a/hw/ip/prim/rtl/prim_secded_inv_hamming_22_16_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_hamming_22_16_dec.sv
new file mode 100644
index 0000000..48b2117
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_hamming_22_16_dec.sv
@@ -0,0 +1,45 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_22_16_dec (
+ input [21:0] data_i,
+ output logic [15:0] data_o,
+ output logic [5:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 22'h3F0000) & 22'h01AD5B);
+ syndrome_o[1] = ^((data_i ^ 22'h3F0000) & 22'h02366D);
+ syndrome_o[2] = ^((data_i ^ 22'h3F0000) & 22'h04C78E);
+ syndrome_o[3] = ^((data_i ^ 22'h3F0000) & 22'h0807F0);
+ syndrome_o[4] = ^((data_i ^ 22'h3F0000) & 22'h10F800);
+ syndrome_o[5] = ^((data_i ^ 22'h3F0000) & 22'h3FFFFF);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h23) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'h25) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h26) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h27) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'h29) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h2a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h2b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h2c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h2d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'h2e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'h2f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h31) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h32) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h33) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'h34) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h35) ^ data_i[15];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[5];
+ err_o[1] = |syndrome_o[4:0] & ~syndrome_o[5];
+ end
+endmodule : prim_secded_inv_hamming_22_16_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_hamming_22_16_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_hamming_22_16_enc.sv
new file mode 100644
index 0000000..642473c
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_hamming_22_16_enc.sv
@@ -0,0 +1,22 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_22_16_enc (
+ input [15:0] data_i,
+ output logic [21:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 22'(data_i);
+ data_o[16] = ~^(data_o & 22'h00AD5B);
+ data_o[17] = ~^(data_o & 22'h00366D);
+ data_o[18] = ~^(data_o & 22'h00C78E);
+ data_o[19] = ~^(data_o & 22'h0007F0);
+ data_o[20] = ~^(data_o & 22'h00F800);
+ data_o[21] = ~^(data_o & 22'h1FFFFF);
+ end
+
+endmodule : prim_secded_inv_hamming_22_16_enc
diff --git a/hw/ip/prim/rtl/prim_secded_inv_hamming_39_32_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_hamming_39_32_dec.sv
new file mode 100644
index 0000000..9d5ccc3
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_hamming_39_32_dec.sv
@@ -0,0 +1,62 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_39_32_dec (
+ input [38:0] data_i,
+ output logic [31:0] data_o,
+ output logic [6:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 39'h7F00000000) & 39'h0156AAAD5B);
+ syndrome_o[1] = ^((data_i ^ 39'h7F00000000) & 39'h029B33366D);
+ syndrome_o[2] = ^((data_i ^ 39'h7F00000000) & 39'h04E3C3C78E);
+ syndrome_o[3] = ^((data_i ^ 39'h7F00000000) & 39'h0803FC07F0);
+ syndrome_o[4] = ^((data_i ^ 39'h7F00000000) & 39'h1003FFF800);
+ syndrome_o[5] = ^((data_i ^ 39'h7F00000000) & 39'h20FC000000);
+ syndrome_o[6] = ^((data_i ^ 39'h7F00000000) & 39'h7FFFFFFFFF);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h43) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'h45) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h46) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h47) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h49) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'h4a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h4b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h4d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h4e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h4f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'h51) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h52) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h53) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h54) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'h55) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h56) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'h57) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h58) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h59) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h5a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'h5b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h5c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h5d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h5e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h5f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h61) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h62) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h63) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h64) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h65) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h66) ^ data_i[31];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[6];
+ err_o[1] = |syndrome_o[5:0] & ~syndrome_o[6];
+ end
+endmodule : prim_secded_inv_hamming_39_32_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_hamming_39_32_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_hamming_39_32_enc.sv
new file mode 100644
index 0000000..905b6c5
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_hamming_39_32_enc.sv
@@ -0,0 +1,23 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_39_32_enc (
+ input [31:0] data_i,
+ output logic [38:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 39'(data_i);
+ data_o[32] = ~^(data_o & 39'h0056AAAD5B);
+ data_o[33] = ~^(data_o & 39'h009B33366D);
+ data_o[34] = ~^(data_o & 39'h00E3C3C78E);
+ data_o[35] = ~^(data_o & 39'h0003FC07F0);
+ data_o[36] = ~^(data_o & 39'h0003FFF800);
+ data_o[37] = ~^(data_o & 39'h00FC000000);
+ data_o[38] = ~^(data_o & 39'h3FFFFFFFFF);
+ end
+
+endmodule : prim_secded_inv_hamming_39_32_enc
diff --git a/hw/ip/prim/rtl/prim_secded_inv_hamming_72_64_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_hamming_72_64_dec.sv
new file mode 100644
index 0000000..1b94660
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_hamming_72_64_dec.sv
@@ -0,0 +1,95 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_72_64_dec (
+ input [71:0] data_i,
+ output logic [63:0] data_o,
+ output logic [7:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 72'hFF0000000000000000) & 72'h01AB55555556AAAD5B);
+ syndrome_o[1] = ^((data_i ^ 72'hFF0000000000000000) & 72'h02CD9999999B33366D);
+ syndrome_o[2] = ^((data_i ^ 72'hFF0000000000000000) & 72'h04F1E1E1E1E3C3C78E);
+ syndrome_o[3] = ^((data_i ^ 72'hFF0000000000000000) & 72'h0801FE01FE03FC07F0);
+ syndrome_o[4] = ^((data_i ^ 72'hFF0000000000000000) & 72'h1001FFFE0003FFF800);
+ syndrome_o[5] = ^((data_i ^ 72'hFF0000000000000000) & 72'h2001FFFFFFFC000000);
+ syndrome_o[6] = ^((data_i ^ 72'hFF0000000000000000) & 72'h40FE00000000000000);
+ syndrome_o[7] = ^((data_i ^ 72'hFF0000000000000000) & 72'hFFFFFFFFFFFFFFFFFF);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h83) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'h85) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h86) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h87) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h89) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h8a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'h8b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h8c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h8d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h8e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h8f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h91) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h92) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h93) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h94) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h95) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h96) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h97) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h98) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'h99) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'h9a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'h9b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h9c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h9d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h9e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h9f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'ha1) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'ha2) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'ha3) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'ha4) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'ha5) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'ha6) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'ha7) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'ha8) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha9) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'haa) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'hab) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'hac) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'had) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'hae) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'haf) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'hb0) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'hb1) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'hb2) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'hb3) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hb4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'hb5) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'hb6) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'hb7) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'hb8) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'hb9) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hba) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'hbb) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hbc) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hbd) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'hbe) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'hbf) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hc1) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'hc2) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hc3) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hc4) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hc5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hc6) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'hc7) ^ data_i[63];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[7];
+ err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
+ end
+endmodule : prim_secded_inv_hamming_72_64_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_hamming_72_64_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_hamming_72_64_enc.sv
new file mode 100644
index 0000000..9584abe
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_hamming_72_64_enc.sv
@@ -0,0 +1,24 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_72_64_enc (
+ input [63:0] data_i,
+ output logic [71:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 72'(data_i);
+ data_o[64] = ~^(data_o & 72'h00AB55555556AAAD5B);
+ data_o[65] = ~^(data_o & 72'h00CD9999999B33366D);
+ data_o[66] = ~^(data_o & 72'h00F1E1E1E1E3C3C78E);
+ data_o[67] = ~^(data_o & 72'h0001FE01FE03FC07F0);
+ data_o[68] = ~^(data_o & 72'h0001FFFE0003FFF800);
+ data_o[69] = ~^(data_o & 72'h0001FFFFFFFC000000);
+ data_o[70] = ~^(data_o & 72'h00FE00000000000000);
+ data_o[71] = ~^(data_o & 72'h7FFFFFFFFFFFFFFFFF);
+ end
+
+endmodule : prim_secded_inv_hamming_72_64_enc
diff --git a/hw/ip/prim/rtl/prim_secded_inv_hamming_76_68_dec.sv b/hw/ip/prim/rtl/prim_secded_inv_hamming_76_68_dec.sv
new file mode 100644
index 0000000..da1368b
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_hamming_76_68_dec.sv
@@ -0,0 +1,99 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED decoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_76_68_dec (
+ input [75:0] data_i,
+ output logic [67:0] data_o,
+ output logic [7:0] syndrome_o,
+ output logic [1:0] err_o
+);
+
+ always_comb begin : p_encode
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 76'hFF00000000000000000) & 76'h01AAB55555556AAAD5B);
+ syndrome_o[1] = ^((data_i ^ 76'hFF00000000000000000) & 76'h02CCD9999999B33366D);
+ syndrome_o[2] = ^((data_i ^ 76'hFF00000000000000000) & 76'h040F1E1E1E1E3C3C78E);
+ syndrome_o[3] = ^((data_i ^ 76'hFF00000000000000000) & 76'h08F01FE01FE03FC07F0);
+ syndrome_o[4] = ^((data_i ^ 76'hFF00000000000000000) & 76'h10001FFFE0003FFF800);
+ syndrome_o[5] = ^((data_i ^ 76'hFF00000000000000000) & 76'h20001FFFFFFFC000000);
+ syndrome_o[6] = ^((data_i ^ 76'hFF00000000000000000) & 76'h40FFE00000000000000);
+ syndrome_o[7] = ^((data_i ^ 76'hFF00000000000000000) & 76'hFFFFFFFFFFFFFFFFFFF);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h83) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'h85) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h86) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h87) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h89) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h8a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'h8b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h8c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h8d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h8e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h8f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h91) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h92) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h93) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h94) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h95) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h96) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h97) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h98) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'h99) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'h9a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'h9b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h9c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h9d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h9e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h9f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'ha1) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'ha2) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'ha3) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'ha4) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'ha5) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'ha6) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'ha7) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'ha8) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha9) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'haa) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'hab) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'hac) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'had) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'hae) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'haf) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'hb0) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'hb1) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'hb2) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'hb3) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hb4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'hb5) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'hb6) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'hb7) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'hb8) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'hb9) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hba) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'hbb) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hbc) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hbd) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'hbe) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'hbf) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hc1) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'hc2) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hc3) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hc4) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hc5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hc6) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'hc7) ^ data_i[63];
+ data_o[64] = (syndrome_o == 8'hc8) ^ data_i[64];
+ data_o[65] = (syndrome_o == 8'hc9) ^ data_i[65];
+ data_o[66] = (syndrome_o == 8'hca) ^ data_i[66];
+ data_o[67] = (syndrome_o == 8'hcb) ^ data_i[67];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[7];
+ err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
+ end
+endmodule : prim_secded_inv_hamming_76_68_dec
diff --git a/hw/ip/prim/rtl/prim_secded_inv_hamming_76_68_enc.sv b/hw/ip/prim/rtl/prim_secded_inv_hamming_76_68_enc.sv
new file mode 100644
index 0000000..c37f374
--- /dev/null
+++ b/hw/ip/prim/rtl/prim_secded_inv_hamming_76_68_enc.sv
@@ -0,0 +1,24 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// SECDED encoder generated by util/design/secded_gen.py
+
+module prim_secded_inv_hamming_76_68_enc (
+ input [67:0] data_i,
+ output logic [75:0] data_o
+);
+
+ always_comb begin : p_encode
+ data_o = 76'(data_i);
+ data_o[68] = ~^(data_o & 76'h00AAB55555556AAAD5B);
+ data_o[69] = ~^(data_o & 76'h00CCD9999999B33366D);
+ data_o[70] = ~^(data_o & 76'h000F1E1E1E1E3C3C78E);
+ data_o[71] = ~^(data_o & 76'h00F01FE01FE03FC07F0);
+ data_o[72] = ~^(data_o & 76'h00001FFFE0003FFF800);
+ data_o[73] = ~^(data_o & 76'h00001FFFFFFFC000000);
+ data_o[74] = ~^(data_o & 76'h00FFE00000000000000);
+ data_o[75] = ~^(data_o & 76'h7FFFFFFFFFFFFFFFFFF);
+ end
+
+endmodule : prim_secded_inv_hamming_76_68_enc
diff --git a/hw/ip/prim/rtl/prim_secded_pkg.sv b/hw/ip/prim/rtl/prim_secded_pkg.sv
index f51a961..005ff10 100644
--- a/hw/ip/prim/rtl/prim_secded_pkg.sv
+++ b/hw/ip/prim/rtl/prim_secded_pkg.sv
@@ -17,7 +17,16 @@
SecdedHamming_22_16,
SecdedHamming_39_32,
SecdedHamming_72_64,
- SecdedHamming_76_68
+ SecdedHamming_76_68,
+ SecdedInv_22_16,
+ SecdedInv_28_22,
+ SecdedInv_39_32,
+ SecdedInv_64_57,
+ SecdedInv_72_64,
+ SecdedInvHamming_22_16,
+ SecdedInvHamming_39_32,
+ SecdedInvHamming_72_64,
+ SecdedInvHamming_76_68
} prim_secded_e;
function automatic int get_ecc_data_width(prim_secded_e ecc_type);
@@ -31,6 +40,15 @@
SecdedHamming_39_32: return 32;
SecdedHamming_72_64: return 64;
SecdedHamming_76_68: return 68;
+ SecdedInv_22_16: return 16;
+ SecdedInv_28_22: return 22;
+ SecdedInv_39_32: return 32;
+ SecdedInv_64_57: return 57;
+ SecdedInv_72_64: return 64;
+ SecdedInvHamming_22_16: return 16;
+ SecdedInvHamming_39_32: return 32;
+ SecdedInvHamming_72_64: return 64;
+ SecdedInvHamming_76_68: return 68;
// Return a non-zero width to avoid VCS compile issues
default: return 32;
endcase
@@ -47,6 +65,15 @@
SecdedHamming_39_32: return 7;
SecdedHamming_72_64: return 8;
SecdedHamming_76_68: return 8;
+ SecdedInv_22_16: return 6;
+ SecdedInv_28_22: return 6;
+ SecdedInv_39_32: return 7;
+ SecdedInv_64_57: return 7;
+ SecdedInv_72_64: return 8;
+ SecdedInvHamming_22_16: return 6;
+ SecdedInvHamming_39_32: return 7;
+ SecdedInvHamming_72_64: return 8;
+ SecdedInvHamming_76_68: return 8;
default: return 0;
endcase
endfunction
@@ -105,7 +132,62 @@
logic [1:0] err;
} secded_hamming_76_68_t;
- function automatic logic [21:0] prim_secded_22_16_enc (logic [15:0] data_i);
+ typedef struct packed {
+ logic [15:0] data;
+ logic [5:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_22_16_t;
+
+ typedef struct packed {
+ logic [21:0] data;
+ logic [5:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_28_22_t;
+
+ typedef struct packed {
+ logic [31:0] data;
+ logic [6:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_39_32_t;
+
+ typedef struct packed {
+ logic [56:0] data;
+ logic [6:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_64_57_t;
+
+ typedef struct packed {
+ logic [63:0] data;
+ logic [7:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_72_64_t;
+
+ typedef struct packed {
+ logic [15:0] data;
+ logic [5:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_hamming_22_16_t;
+
+ typedef struct packed {
+ logic [31:0] data;
+ logic [6:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_hamming_39_32_t;
+
+ typedef struct packed {
+ logic [63:0] data;
+ logic [7:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_hamming_72_64_t;
+
+ typedef struct packed {
+ logic [67:0] data;
+ logic [7:0] syndrome;
+ logic [1:0] err;
+ } secded_inv_hamming_76_68_t;
+
+ function automatic logic [21:0]
+ prim_secded_22_16_enc (logic [15:0] data_i);
logic [21:0] data_o;
data_o = 22'(data_i);
data_o[16] = ^(data_o & 22'h00496E);
@@ -117,15 +199,14 @@
return data_o;
endfunction
- function automatic secded_22_16_t prim_secded_22_16_dec (logic [21:0] data_i);
+ function automatic secded_22_16_t
+ prim_secded_22_16_dec (logic [21:0] data_i);
logic [15:0] data_o;
logic [5:0] syndrome_o;
logic [1:0] err_o;
secded_22_16_t dec;
- logic single_error;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 22'h01496E);
syndrome_o[1] = ^(data_i & 22'h02F20B);
@@ -153,9 +234,8 @@
data_o[15] = (syndrome_o == 6'h16) ^ data_i[15];
// err_o calc. bit0: single error, bit1: double error
- single_error = ^syndrome_o;
- err_o[0] = single_error;
- err_o[1] = ~single_error & (|syndrome_o);
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
dec.data = data_o;
dec.syndrome = syndrome_o;
@@ -164,7 +244,8 @@
endfunction
- function automatic logic [27:0] prim_secded_28_22_enc (logic [21:0] data_i);
+ function automatic logic [27:0]
+ prim_secded_28_22_enc (logic [21:0] data_i);
logic [27:0] data_o;
data_o = 28'(data_i);
data_o[22] = ^(data_o & 28'h03003FF);
@@ -176,15 +257,14 @@
return data_o;
endfunction
- function automatic secded_28_22_t prim_secded_28_22_dec (logic [27:0] data_i);
+ function automatic secded_28_22_t
+ prim_secded_28_22_dec (logic [27:0] data_i);
logic [21:0] data_o;
logic [5:0] syndrome_o;
logic [1:0] err_o;
secded_28_22_t dec;
- logic single_error;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 28'h07003FF);
syndrome_o[1] = ^(data_i & 28'h090FC0F);
@@ -218,9 +298,8 @@
data_o[21] = (syndrome_o == 6'h3d) ^ data_i[21];
// err_o calc. bit0: single error, bit1: double error
- single_error = ^syndrome_o;
- err_o[0] = single_error;
- err_o[1] = ~single_error & (|syndrome_o);
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
dec.data = data_o;
dec.syndrome = syndrome_o;
@@ -229,7 +308,8 @@
endfunction
- function automatic logic [38:0] prim_secded_39_32_enc (logic [31:0] data_i);
+ function automatic logic [38:0]
+ prim_secded_39_32_enc (logic [31:0] data_i);
logic [38:0] data_o;
data_o = 39'(data_i);
data_o[32] = ^(data_o & 39'h002606BD25);
@@ -242,15 +322,14 @@
return data_o;
endfunction
- function automatic secded_39_32_t prim_secded_39_32_dec (logic [38:0] data_i);
+ function automatic secded_39_32_t
+ prim_secded_39_32_dec (logic [38:0] data_i);
logic [31:0] data_o;
logic [6:0] syndrome_o;
logic [1:0] err_o;
secded_39_32_t dec;
- logic single_error;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 39'h012606BD25);
syndrome_o[1] = ^(data_i & 39'h02DEBA8050);
@@ -295,9 +374,8 @@
data_o[31] = (syndrome_o == 7'h52) ^ data_i[31];
// err_o calc. bit0: single error, bit1: double error
- single_error = ^syndrome_o;
- err_o[0] = single_error;
- err_o[1] = ~single_error & (|syndrome_o);
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
dec.data = data_o;
dec.syndrome = syndrome_o;
@@ -306,7 +384,8 @@
endfunction
- function automatic logic [63:0] prim_secded_64_57_enc (logic [56:0] data_i);
+ function automatic logic [63:0]
+ prim_secded_64_57_enc (logic [56:0] data_i);
logic [63:0] data_o;
data_o = 64'(data_i);
data_o[57] = ^(data_o & 64'h0103FFF800007FFF);
@@ -319,15 +398,14 @@
return data_o;
endfunction
- function automatic secded_64_57_t prim_secded_64_57_dec (logic [63:0] data_i);
+ function automatic secded_64_57_t
+ prim_secded_64_57_dec (logic [63:0] data_i);
logic [56:0] data_o;
logic [6:0] syndrome_o;
logic [1:0] err_o;
secded_64_57_t dec;
- logic single_error;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 64'h0303FFF800007FFF);
syndrome_o[1] = ^(data_i & 64'h057C1FF801FF801F);
@@ -397,9 +475,8 @@
data_o[56] = (syndrome_o == 7'h7f) ^ data_i[56];
// err_o calc. bit0: single error, bit1: double error
- single_error = ^syndrome_o;
- err_o[0] = single_error;
- err_o[1] = ~single_error & (|syndrome_o);
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
dec.data = data_o;
dec.syndrome = syndrome_o;
@@ -408,7 +485,8 @@
endfunction
- function automatic logic [71:0] prim_secded_72_64_enc (logic [63:0] data_i);
+ function automatic logic [71:0]
+ prim_secded_72_64_enc (logic [63:0] data_i);
logic [71:0] data_o;
data_o = 72'(data_i);
data_o[64] = ^(data_o & 72'h00B9000000001FFFFF);
@@ -422,15 +500,14 @@
return data_o;
endfunction
- function automatic secded_72_64_t prim_secded_72_64_dec (logic [71:0] data_i);
+ function automatic secded_72_64_t
+ prim_secded_72_64_dec (logic [71:0] data_i);
logic [63:0] data_o;
logic [7:0] syndrome_o;
logic [1:0] err_o;
secded_72_64_t dec;
- logic single_error;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 72'h01B9000000001FFFFF);
syndrome_o[1] = ^(data_i & 72'h025E00000FFFE0003F);
@@ -508,9 +585,8 @@
data_o[63] = (syndrome_o == 8'h79) ^ data_i[63];
// err_o calc. bit0: single error, bit1: double error
- single_error = ^syndrome_o;
- err_o[0] = single_error;
- err_o[1] = ~single_error & (|syndrome_o);
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
dec.data = data_o;
dec.syndrome = syndrome_o;
@@ -519,7 +595,8 @@
endfunction
- function automatic logic [21:0] prim_secded_hamming_22_16_enc (logic [15:0] data_i);
+ function automatic logic [21:0]
+ prim_secded_hamming_22_16_enc (logic [15:0] data_i);
logic [21:0] data_o;
data_o = 22'(data_i);
data_o[16] = ^(data_o & 22'h00AD5B);
@@ -531,14 +608,14 @@
return data_o;
endfunction
- function automatic secded_hamming_22_16_t prim_secded_hamming_22_16_dec (logic [21:0] data_i);
+ function automatic secded_hamming_22_16_t
+ prim_secded_hamming_22_16_dec (logic [21:0] data_i);
logic [15:0] data_o;
logic [5:0] syndrome_o;
logic [1:0] err_o;
secded_hamming_22_16_t dec;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 22'h01AD5B);
syndrome_o[1] = ^(data_i & 22'h02366D);
@@ -576,7 +653,8 @@
endfunction
- function automatic logic [38:0] prim_secded_hamming_39_32_enc (logic [31:0] data_i);
+ function automatic logic [38:0]
+ prim_secded_hamming_39_32_enc (logic [31:0] data_i);
logic [38:0] data_o;
data_o = 39'(data_i);
data_o[32] = ^(data_o & 39'h0056AAAD5B);
@@ -589,14 +667,14 @@
return data_o;
endfunction
- function automatic secded_hamming_39_32_t prim_secded_hamming_39_32_dec (logic [38:0] data_i);
+ function automatic secded_hamming_39_32_t
+ prim_secded_hamming_39_32_dec (logic [38:0] data_i);
logic [31:0] data_o;
logic [6:0] syndrome_o;
logic [1:0] err_o;
secded_hamming_39_32_t dec;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 39'h0156AAAD5B);
syndrome_o[1] = ^(data_i & 39'h029B33366D);
@@ -651,7 +729,8 @@
endfunction
- function automatic logic [71:0] prim_secded_hamming_72_64_enc (logic [63:0] data_i);
+ function automatic logic [71:0]
+ prim_secded_hamming_72_64_enc (logic [63:0] data_i);
logic [71:0] data_o;
data_o = 72'(data_i);
data_o[64] = ^(data_o & 72'h00AB55555556AAAD5B);
@@ -665,14 +744,14 @@
return data_o;
endfunction
- function automatic secded_hamming_72_64_t prim_secded_hamming_72_64_dec (logic [71:0] data_i);
+ function automatic secded_hamming_72_64_t
+ prim_secded_hamming_72_64_dec (logic [71:0] data_i);
logic [63:0] data_o;
logic [7:0] syndrome_o;
logic [1:0] err_o;
secded_hamming_72_64_t dec;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 72'h01AB55555556AAAD5B);
syndrome_o[1] = ^(data_i & 72'h02CD9999999B33366D);
@@ -760,7 +839,8 @@
endfunction
- function automatic logic [75:0] prim_secded_hamming_76_68_enc (logic [67:0] data_i);
+ function automatic logic [75:0]
+ prim_secded_hamming_76_68_enc (logic [67:0] data_i);
logic [75:0] data_o;
data_o = 76'(data_i);
data_o[68] = ^(data_o & 76'h00AAB55555556AAAD5B);
@@ -774,14 +854,14 @@
return data_o;
endfunction
- function automatic secded_hamming_76_68_t prim_secded_hamming_76_68_dec (logic [75:0] data_i);
+ function automatic secded_hamming_76_68_t
+ prim_secded_hamming_76_68_dec (logic [75:0] data_i);
logic [67:0] data_o;
logic [7:0] syndrome_o;
logic [1:0] err_o;
secded_hamming_76_68_t dec;
-
// Syndrome calculation
syndrome_o[0] = ^(data_i & 76'h01AAB55555556AAAD5B);
syndrome_o[1] = ^(data_i & 76'h02CCD9999999B33366D);
@@ -873,5 +953,772 @@
endfunction
+ function automatic logic [21:0]
+ prim_secded_inv_22_16_enc (logic [15:0] data_i);
+ logic [21:0] data_o;
+ data_o = 22'(data_i);
+ data_o[16] = ~^(data_o & 22'h00496E);
+ data_o[17] = ~^(data_o & 22'h00F20B);
+ data_o[18] = ~^(data_o & 22'h008ED8);
+ data_o[19] = ~^(data_o & 22'h007714);
+ data_o[20] = ~^(data_o & 22'h00ACA5);
+ data_o[21] = ~^(data_o & 22'h0011F3);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_22_16_t
+ prim_secded_inv_22_16_dec (logic [21:0] data_i);
+ logic [15:0] data_o;
+ logic [5:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_22_16_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 22'h3F0000) & 22'h01496E);
+ syndrome_o[1] = ^((data_i ^ 22'h3F0000) & 22'h02F20B);
+ syndrome_o[2] = ^((data_i ^ 22'h3F0000) & 22'h048ED8);
+ syndrome_o[3] = ^((data_i ^ 22'h3F0000) & 22'h087714);
+ syndrome_o[4] = ^((data_i ^ 22'h3F0000) & 22'h10ACA5);
+ syndrome_o[5] = ^((data_i ^ 22'h3F0000) & 22'h2011F3);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h32) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'h23) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h19) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h7) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'h2c) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h31) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h25) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h34) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h29) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'he) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'h1c) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h15) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h2a) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h1a) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'hb) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h16) ^ data_i[15];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
+ function automatic logic [27:0]
+ prim_secded_inv_28_22_enc (logic [21:0] data_i);
+ logic [27:0] data_o;
+ data_o = 28'(data_i);
+ data_o[22] = ~^(data_o & 28'h03003FF);
+ data_o[23] = ~^(data_o & 28'h010FC0F);
+ data_o[24] = ~^(data_o & 28'h0271C71);
+ data_o[25] = ~^(data_o & 28'h03B6592);
+ data_o[26] = ~^(data_o & 28'h03DAAA4);
+ data_o[27] = ~^(data_o & 28'h03ED348);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_28_22_t
+ prim_secded_inv_28_22_dec (logic [27:0] data_i);
+ logic [21:0] data_o;
+ logic [5:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_28_22_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 28'hFC00000) & 28'h07003FF);
+ syndrome_o[1] = ^((data_i ^ 28'hFC00000) & 28'h090FC0F);
+ syndrome_o[2] = ^((data_i ^ 28'hFC00000) & 28'h1271C71);
+ syndrome_o[3] = ^((data_i ^ 28'hFC00000) & 28'h23B6592);
+ syndrome_o[4] = ^((data_i ^ 28'hFC00000) & 28'h43DAAA4);
+ syndrome_o[5] = ^((data_i ^ 28'hFC00000) & 28'h83ED348);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'hd) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h15) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h25) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h19) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h29) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'h31) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'he) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h16) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h26) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h1a) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'h2a) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h32) ^ data_i[15];
+ data_o[16] = (syndrome_o == 6'h1c) ^ data_i[16];
+ data_o[17] = (syndrome_o == 6'h2c) ^ data_i[17];
+ data_o[18] = (syndrome_o == 6'h34) ^ data_i[18];
+ data_o[19] = (syndrome_o == 6'h38) ^ data_i[19];
+ data_o[20] = (syndrome_o == 6'h3b) ^ data_i[20];
+ data_o[21] = (syndrome_o == 6'h3d) ^ data_i[21];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
+ function automatic logic [38:0]
+ prim_secded_inv_39_32_enc (logic [31:0] data_i);
+ logic [38:0] data_o;
+ data_o = 39'(data_i);
+ data_o[32] = ~^(data_o & 39'h002606BD25);
+ data_o[33] = ~^(data_o & 39'h00DEBA8050);
+ data_o[34] = ~^(data_o & 39'h00413D89AA);
+ data_o[35] = ~^(data_o & 39'h0031234ED1);
+ data_o[36] = ~^(data_o & 39'h00C2C1323B);
+ data_o[37] = ~^(data_o & 39'h002DCC624C);
+ data_o[38] = ~^(data_o & 39'h0098505586);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_39_32_t
+ prim_secded_inv_39_32_dec (logic [38:0] data_i);
+ logic [31:0] data_o;
+ logic [6:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_39_32_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 39'h7F00000000) & 39'h012606BD25);
+ syndrome_o[1] = ^((data_i ^ 39'h7F00000000) & 39'h02DEBA8050);
+ syndrome_o[2] = ^((data_i ^ 39'h7F00000000) & 39'h04413D89AA);
+ syndrome_o[3] = ^((data_i ^ 39'h7F00000000) & 39'h0831234ED1);
+ syndrome_o[4] = ^((data_i ^ 39'h7F00000000) & 39'h10C2C1323B);
+ syndrome_o[5] = ^((data_i ^ 39'h7F00000000) & 39'h202DCC624C);
+ syndrome_o[6] = ^((data_i ^ 39'h7F00000000) & 39'h4098505586);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h19) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'h54) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h61) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h34) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h1a) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'h15) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h2a) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h45) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h38) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h49) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'hd) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h51) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h31) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h68) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'h7) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h1c) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'hb) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h25) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h26) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h46) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'he) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h70) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h32) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h2c) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h13) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h23) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h62) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h4a) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h29) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h16) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h52) ^ data_i[31];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
+ function automatic logic [63:0]
+ prim_secded_inv_64_57_enc (logic [56:0] data_i);
+ logic [63:0] data_o;
+ data_o = 64'(data_i);
+ data_o[57] = ~^(data_o & 64'h0103FFF800007FFF);
+ data_o[58] = ~^(data_o & 64'h017C1FF801FF801F);
+ data_o[59] = ~^(data_o & 64'h01BDE1F87E0781E1);
+ data_o[60] = ~^(data_o & 64'h01DEEE3B8E388E22);
+ data_o[61] = ~^(data_o & 64'h01EF76CDB2C93244);
+ data_o[62] = ~^(data_o & 64'h01F7BB56D5525488);
+ data_o[63] = ~^(data_o & 64'h01FBDDA769A46910);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_64_57_t
+ prim_secded_inv_64_57_dec (logic [63:0] data_i);
+ logic [56:0] data_o;
+ logic [6:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_64_57_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 64'hFE00000000000000) & 64'h0303FFF800007FFF);
+ syndrome_o[1] = ^((data_i ^ 64'hFE00000000000000) & 64'h057C1FF801FF801F);
+ syndrome_o[2] = ^((data_i ^ 64'hFE00000000000000) & 64'h09BDE1F87E0781E1);
+ syndrome_o[3] = ^((data_i ^ 64'hFE00000000000000) & 64'h11DEEE3B8E388E22);
+ syndrome_o[4] = ^((data_i ^ 64'hFE00000000000000) & 64'h21EF76CDB2C93244);
+ syndrome_o[5] = ^((data_i ^ 64'hFE00000000000000) & 64'h41F7BB56D5525488);
+ syndrome_o[6] = ^((data_i ^ 64'hFE00000000000000) & 64'h81FBDDA769A46910);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h43) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'hd) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h15) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h25) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h45) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h19) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h29) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'h49) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h31) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h51) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h61) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'he) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h16) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'h26) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h46) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h1a) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h2a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'h4a) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h32) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h52) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h62) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h1c) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h2c) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h4c) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h34) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h54) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h64) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h38) ^ data_i[31];
+ data_o[32] = (syndrome_o == 7'h58) ^ data_i[32];
+ data_o[33] = (syndrome_o == 7'h68) ^ data_i[33];
+ data_o[34] = (syndrome_o == 7'h70) ^ data_i[34];
+ data_o[35] = (syndrome_o == 7'h1f) ^ data_i[35];
+ data_o[36] = (syndrome_o == 7'h2f) ^ data_i[36];
+ data_o[37] = (syndrome_o == 7'h4f) ^ data_i[37];
+ data_o[38] = (syndrome_o == 7'h37) ^ data_i[38];
+ data_o[39] = (syndrome_o == 7'h57) ^ data_i[39];
+ data_o[40] = (syndrome_o == 7'h67) ^ data_i[40];
+ data_o[41] = (syndrome_o == 7'h3b) ^ data_i[41];
+ data_o[42] = (syndrome_o == 7'h5b) ^ data_i[42];
+ data_o[43] = (syndrome_o == 7'h6b) ^ data_i[43];
+ data_o[44] = (syndrome_o == 7'h73) ^ data_i[44];
+ data_o[45] = (syndrome_o == 7'h3d) ^ data_i[45];
+ data_o[46] = (syndrome_o == 7'h5d) ^ data_i[46];
+ data_o[47] = (syndrome_o == 7'h6d) ^ data_i[47];
+ data_o[48] = (syndrome_o == 7'h75) ^ data_i[48];
+ data_o[49] = (syndrome_o == 7'h79) ^ data_i[49];
+ data_o[50] = (syndrome_o == 7'h3e) ^ data_i[50];
+ data_o[51] = (syndrome_o == 7'h5e) ^ data_i[51];
+ data_o[52] = (syndrome_o == 7'h6e) ^ data_i[52];
+ data_o[53] = (syndrome_o == 7'h76) ^ data_i[53];
+ data_o[54] = (syndrome_o == 7'h7a) ^ data_i[54];
+ data_o[55] = (syndrome_o == 7'h7c) ^ data_i[55];
+ data_o[56] = (syndrome_o == 7'h7f) ^ data_i[56];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
+ function automatic logic [71:0]
+ prim_secded_inv_72_64_enc (logic [63:0] data_i);
+ logic [71:0] data_o;
+ data_o = 72'(data_i);
+ data_o[64] = ~^(data_o & 72'h00B9000000001FFFFF);
+ data_o[65] = ~^(data_o & 72'h005E00000FFFE0003F);
+ data_o[66] = ~^(data_o & 72'h0067003FF003E007C1);
+ data_o[67] = ~^(data_o & 72'h00CD0FC0F03C207842);
+ data_o[68] = ~^(data_o & 72'h00B671C711C4438884);
+ data_o[69] = ~^(data_o & 72'h00B5B65926488C9108);
+ data_o[70] = ~^(data_o & 72'h00CBDAAA4A91152210);
+ data_o[71] = ~^(data_o & 72'h007AED348D221A4420);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_72_64_t
+ prim_secded_inv_72_64_dec (logic [71:0] data_i);
+ logic [63:0] data_o;
+ logic [7:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_72_64_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 72'hFF0000000000000000) & 72'h01B9000000001FFFFF);
+ syndrome_o[1] = ^((data_i ^ 72'hFF0000000000000000) & 72'h025E00000FFFE0003F);
+ syndrome_o[2] = ^((data_i ^ 72'hFF0000000000000000) & 72'h0467003FF003E007C1);
+ syndrome_o[3] = ^((data_i ^ 72'hFF0000000000000000) & 72'h08CD0FC0F03C207842);
+ syndrome_o[4] = ^((data_i ^ 72'hFF0000000000000000) & 72'h10B671C711C4438884);
+ syndrome_o[5] = ^((data_i ^ 72'hFF0000000000000000) & 72'h20B5B65926488C9108);
+ syndrome_o[6] = ^((data_i ^ 72'hFF0000000000000000) & 72'h40CBDAAA4A91152210);
+ syndrome_o[7] = ^((data_i ^ 72'hFF0000000000000000) & 72'h807AED348D221A4420);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h7) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'hb) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h13) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h23) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h43) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h83) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'hd) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h15) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h25) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h45) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h85) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h19) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h29) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h49) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h89) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h31) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h51) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h91) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h61) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'ha1) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'hc1) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'he) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h16) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h26) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h46) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h86) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'h1a) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'h2a) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'h4a) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'h8a) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'h32) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'h52) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'h92) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'h62) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha2) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'hc2) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'h1c) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'h2c) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'h4c) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'h8c) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'h34) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'h54) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'h94) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'h64) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'ha4) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hc4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'h38) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'h58) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'h98) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'h68) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'ha8) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hc8) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'h70) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hb0) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hd0) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'he0) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'h6d) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hd6) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'h3e) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hcb) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hb3) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hb5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hce) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'h79) ^ data_i[63];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = ^syndrome_o;
+ err_o[1] = ~err_o[0] & (|syndrome_o);
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
+ function automatic logic [21:0]
+ prim_secded_inv_hamming_22_16_enc (logic [15:0] data_i);
+ logic [21:0] data_o;
+ data_o = 22'(data_i);
+ data_o[16] = ~^(data_o & 22'h00AD5B);
+ data_o[17] = ~^(data_o & 22'h00366D);
+ data_o[18] = ~^(data_o & 22'h00C78E);
+ data_o[19] = ~^(data_o & 22'h0007F0);
+ data_o[20] = ~^(data_o & 22'h00F800);
+ data_o[21] = ~^(data_o & 22'h1FFFFF);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_hamming_22_16_t
+ prim_secded_inv_hamming_22_16_dec (logic [21:0] data_i);
+ logic [15:0] data_o;
+ logic [5:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_hamming_22_16_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 22'h3F0000) & 22'h01AD5B);
+ syndrome_o[1] = ^((data_i ^ 22'h3F0000) & 22'h02366D);
+ syndrome_o[2] = ^((data_i ^ 22'h3F0000) & 22'h04C78E);
+ syndrome_o[3] = ^((data_i ^ 22'h3F0000) & 22'h0807F0);
+ syndrome_o[4] = ^((data_i ^ 22'h3F0000) & 22'h10F800);
+ syndrome_o[5] = ^((data_i ^ 22'h3F0000) & 22'h3FFFFF);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 6'h23) ^ data_i[0];
+ data_o[1] = (syndrome_o == 6'h25) ^ data_i[1];
+ data_o[2] = (syndrome_o == 6'h26) ^ data_i[2];
+ data_o[3] = (syndrome_o == 6'h27) ^ data_i[3];
+ data_o[4] = (syndrome_o == 6'h29) ^ data_i[4];
+ data_o[5] = (syndrome_o == 6'h2a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 6'h2b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 6'h2c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 6'h2d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 6'h2e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 6'h2f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 6'h31) ^ data_i[11];
+ data_o[12] = (syndrome_o == 6'h32) ^ data_i[12];
+ data_o[13] = (syndrome_o == 6'h33) ^ data_i[13];
+ data_o[14] = (syndrome_o == 6'h34) ^ data_i[14];
+ data_o[15] = (syndrome_o == 6'h35) ^ data_i[15];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[5];
+ err_o[1] = |syndrome_o[4:0] & ~syndrome_o[5];
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
+ function automatic logic [38:0]
+ prim_secded_inv_hamming_39_32_enc (logic [31:0] data_i);
+ logic [38:0] data_o;
+ data_o = 39'(data_i);
+ data_o[32] = ~^(data_o & 39'h0056AAAD5B);
+ data_o[33] = ~^(data_o & 39'h009B33366D);
+ data_o[34] = ~^(data_o & 39'h00E3C3C78E);
+ data_o[35] = ~^(data_o & 39'h0003FC07F0);
+ data_o[36] = ~^(data_o & 39'h0003FFF800);
+ data_o[37] = ~^(data_o & 39'h00FC000000);
+ data_o[38] = ~^(data_o & 39'h3FFFFFFFFF);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_hamming_39_32_t
+ prim_secded_inv_hamming_39_32_dec (logic [38:0] data_i);
+ logic [31:0] data_o;
+ logic [6:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_hamming_39_32_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 39'h7F00000000) & 39'h0156AAAD5B);
+ syndrome_o[1] = ^((data_i ^ 39'h7F00000000) & 39'h029B33366D);
+ syndrome_o[2] = ^((data_i ^ 39'h7F00000000) & 39'h04E3C3C78E);
+ syndrome_o[3] = ^((data_i ^ 39'h7F00000000) & 39'h0803FC07F0);
+ syndrome_o[4] = ^((data_i ^ 39'h7F00000000) & 39'h1003FFF800);
+ syndrome_o[5] = ^((data_i ^ 39'h7F00000000) & 39'h20FC000000);
+ syndrome_o[6] = ^((data_i ^ 39'h7F00000000) & 39'h7FFFFFFFFF);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 7'h43) ^ data_i[0];
+ data_o[1] = (syndrome_o == 7'h45) ^ data_i[1];
+ data_o[2] = (syndrome_o == 7'h46) ^ data_i[2];
+ data_o[3] = (syndrome_o == 7'h47) ^ data_i[3];
+ data_o[4] = (syndrome_o == 7'h49) ^ data_i[4];
+ data_o[5] = (syndrome_o == 7'h4a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 7'h4b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 7'h4c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 7'h4d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 7'h4e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 7'h4f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 7'h51) ^ data_i[11];
+ data_o[12] = (syndrome_o == 7'h52) ^ data_i[12];
+ data_o[13] = (syndrome_o == 7'h53) ^ data_i[13];
+ data_o[14] = (syndrome_o == 7'h54) ^ data_i[14];
+ data_o[15] = (syndrome_o == 7'h55) ^ data_i[15];
+ data_o[16] = (syndrome_o == 7'h56) ^ data_i[16];
+ data_o[17] = (syndrome_o == 7'h57) ^ data_i[17];
+ data_o[18] = (syndrome_o == 7'h58) ^ data_i[18];
+ data_o[19] = (syndrome_o == 7'h59) ^ data_i[19];
+ data_o[20] = (syndrome_o == 7'h5a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 7'h5b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 7'h5c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 7'h5d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 7'h5e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 7'h5f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 7'h61) ^ data_i[26];
+ data_o[27] = (syndrome_o == 7'h62) ^ data_i[27];
+ data_o[28] = (syndrome_o == 7'h63) ^ data_i[28];
+ data_o[29] = (syndrome_o == 7'h64) ^ data_i[29];
+ data_o[30] = (syndrome_o == 7'h65) ^ data_i[30];
+ data_o[31] = (syndrome_o == 7'h66) ^ data_i[31];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[6];
+ err_o[1] = |syndrome_o[5:0] & ~syndrome_o[6];
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
+ function automatic logic [71:0]
+ prim_secded_inv_hamming_72_64_enc (logic [63:0] data_i);
+ logic [71:0] data_o;
+ data_o = 72'(data_i);
+ data_o[64] = ~^(data_o & 72'h00AB55555556AAAD5B);
+ data_o[65] = ~^(data_o & 72'h00CD9999999B33366D);
+ data_o[66] = ~^(data_o & 72'h00F1E1E1E1E3C3C78E);
+ data_o[67] = ~^(data_o & 72'h0001FE01FE03FC07F0);
+ data_o[68] = ~^(data_o & 72'h0001FFFE0003FFF800);
+ data_o[69] = ~^(data_o & 72'h0001FFFFFFFC000000);
+ data_o[70] = ~^(data_o & 72'h00FE00000000000000);
+ data_o[71] = ~^(data_o & 72'h7FFFFFFFFFFFFFFFFF);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_hamming_72_64_t
+ prim_secded_inv_hamming_72_64_dec (logic [71:0] data_i);
+ logic [63:0] data_o;
+ logic [7:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_hamming_72_64_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 72'hFF0000000000000000) & 72'h01AB55555556AAAD5B);
+ syndrome_o[1] = ^((data_i ^ 72'hFF0000000000000000) & 72'h02CD9999999B33366D);
+ syndrome_o[2] = ^((data_i ^ 72'hFF0000000000000000) & 72'h04F1E1E1E1E3C3C78E);
+ syndrome_o[3] = ^((data_i ^ 72'hFF0000000000000000) & 72'h0801FE01FE03FC07F0);
+ syndrome_o[4] = ^((data_i ^ 72'hFF0000000000000000) & 72'h1001FFFE0003FFF800);
+ syndrome_o[5] = ^((data_i ^ 72'hFF0000000000000000) & 72'h2001FFFFFFFC000000);
+ syndrome_o[6] = ^((data_i ^ 72'hFF0000000000000000) & 72'h40FE00000000000000);
+ syndrome_o[7] = ^((data_i ^ 72'hFF0000000000000000) & 72'hFFFFFFFFFFFFFFFFFF);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h83) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'h85) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h86) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h87) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h89) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h8a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'h8b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h8c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h8d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h8e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h8f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h91) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h92) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h93) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h94) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h95) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h96) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h97) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h98) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'h99) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'h9a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'h9b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h9c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h9d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h9e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h9f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'ha1) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'ha2) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'ha3) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'ha4) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'ha5) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'ha6) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'ha7) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'ha8) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha9) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'haa) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'hab) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'hac) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'had) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'hae) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'haf) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'hb0) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'hb1) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'hb2) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'hb3) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hb4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'hb5) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'hb6) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'hb7) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'hb8) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'hb9) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hba) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'hbb) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hbc) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hbd) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'hbe) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'hbf) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hc1) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'hc2) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hc3) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hc4) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hc5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hc6) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'hc7) ^ data_i[63];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[7];
+ err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
+ function automatic logic [75:0]
+ prim_secded_inv_hamming_76_68_enc (logic [67:0] data_i);
+ logic [75:0] data_o;
+ data_o = 76'(data_i);
+ data_o[68] = ~^(data_o & 76'h00AAB55555556AAAD5B);
+ data_o[69] = ~^(data_o & 76'h00CCD9999999B33366D);
+ data_o[70] = ~^(data_o & 76'h000F1E1E1E1E3C3C78E);
+ data_o[71] = ~^(data_o & 76'h00F01FE01FE03FC07F0);
+ data_o[72] = ~^(data_o & 76'h00001FFFE0003FFF800);
+ data_o[73] = ~^(data_o & 76'h00001FFFFFFFC000000);
+ data_o[74] = ~^(data_o & 76'h00FFE00000000000000);
+ data_o[75] = ~^(data_o & 76'h7FFFFFFFFFFFFFFFFFF);
+ return data_o;
+ endfunction
+
+ function automatic secded_inv_hamming_76_68_t
+ prim_secded_inv_hamming_76_68_dec (logic [75:0] data_i);
+ logic [67:0] data_o;
+ logic [7:0] syndrome_o;
+ logic [1:0] err_o;
+
+ secded_inv_hamming_76_68_t dec;
+
+ // Syndrome calculation
+ syndrome_o[0] = ^((data_i ^ 76'hFF00000000000000000) & 76'h01AAB55555556AAAD5B);
+ syndrome_o[1] = ^((data_i ^ 76'hFF00000000000000000) & 76'h02CCD9999999B33366D);
+ syndrome_o[2] = ^((data_i ^ 76'hFF00000000000000000) & 76'h040F1E1E1E1E3C3C78E);
+ syndrome_o[3] = ^((data_i ^ 76'hFF00000000000000000) & 76'h08F01FE01FE03FC07F0);
+ syndrome_o[4] = ^((data_i ^ 76'hFF00000000000000000) & 76'h10001FFFE0003FFF800);
+ syndrome_o[5] = ^((data_i ^ 76'hFF00000000000000000) & 76'h20001FFFFFFFC000000);
+ syndrome_o[6] = ^((data_i ^ 76'hFF00000000000000000) & 76'h40FFE00000000000000);
+ syndrome_o[7] = ^((data_i ^ 76'hFF00000000000000000) & 76'hFFFFFFFFFFFFFFFFFFF);
+
+ // Corrected output calculation
+ data_o[0] = (syndrome_o == 8'h83) ^ data_i[0];
+ data_o[1] = (syndrome_o == 8'h85) ^ data_i[1];
+ data_o[2] = (syndrome_o == 8'h86) ^ data_i[2];
+ data_o[3] = (syndrome_o == 8'h87) ^ data_i[3];
+ data_o[4] = (syndrome_o == 8'h89) ^ data_i[4];
+ data_o[5] = (syndrome_o == 8'h8a) ^ data_i[5];
+ data_o[6] = (syndrome_o == 8'h8b) ^ data_i[6];
+ data_o[7] = (syndrome_o == 8'h8c) ^ data_i[7];
+ data_o[8] = (syndrome_o == 8'h8d) ^ data_i[8];
+ data_o[9] = (syndrome_o == 8'h8e) ^ data_i[9];
+ data_o[10] = (syndrome_o == 8'h8f) ^ data_i[10];
+ data_o[11] = (syndrome_o == 8'h91) ^ data_i[11];
+ data_o[12] = (syndrome_o == 8'h92) ^ data_i[12];
+ data_o[13] = (syndrome_o == 8'h93) ^ data_i[13];
+ data_o[14] = (syndrome_o == 8'h94) ^ data_i[14];
+ data_o[15] = (syndrome_o == 8'h95) ^ data_i[15];
+ data_o[16] = (syndrome_o == 8'h96) ^ data_i[16];
+ data_o[17] = (syndrome_o == 8'h97) ^ data_i[17];
+ data_o[18] = (syndrome_o == 8'h98) ^ data_i[18];
+ data_o[19] = (syndrome_o == 8'h99) ^ data_i[19];
+ data_o[20] = (syndrome_o == 8'h9a) ^ data_i[20];
+ data_o[21] = (syndrome_o == 8'h9b) ^ data_i[21];
+ data_o[22] = (syndrome_o == 8'h9c) ^ data_i[22];
+ data_o[23] = (syndrome_o == 8'h9d) ^ data_i[23];
+ data_o[24] = (syndrome_o == 8'h9e) ^ data_i[24];
+ data_o[25] = (syndrome_o == 8'h9f) ^ data_i[25];
+ data_o[26] = (syndrome_o == 8'ha1) ^ data_i[26];
+ data_o[27] = (syndrome_o == 8'ha2) ^ data_i[27];
+ data_o[28] = (syndrome_o == 8'ha3) ^ data_i[28];
+ data_o[29] = (syndrome_o == 8'ha4) ^ data_i[29];
+ data_o[30] = (syndrome_o == 8'ha5) ^ data_i[30];
+ data_o[31] = (syndrome_o == 8'ha6) ^ data_i[31];
+ data_o[32] = (syndrome_o == 8'ha7) ^ data_i[32];
+ data_o[33] = (syndrome_o == 8'ha8) ^ data_i[33];
+ data_o[34] = (syndrome_o == 8'ha9) ^ data_i[34];
+ data_o[35] = (syndrome_o == 8'haa) ^ data_i[35];
+ data_o[36] = (syndrome_o == 8'hab) ^ data_i[36];
+ data_o[37] = (syndrome_o == 8'hac) ^ data_i[37];
+ data_o[38] = (syndrome_o == 8'had) ^ data_i[38];
+ data_o[39] = (syndrome_o == 8'hae) ^ data_i[39];
+ data_o[40] = (syndrome_o == 8'haf) ^ data_i[40];
+ data_o[41] = (syndrome_o == 8'hb0) ^ data_i[41];
+ data_o[42] = (syndrome_o == 8'hb1) ^ data_i[42];
+ data_o[43] = (syndrome_o == 8'hb2) ^ data_i[43];
+ data_o[44] = (syndrome_o == 8'hb3) ^ data_i[44];
+ data_o[45] = (syndrome_o == 8'hb4) ^ data_i[45];
+ data_o[46] = (syndrome_o == 8'hb5) ^ data_i[46];
+ data_o[47] = (syndrome_o == 8'hb6) ^ data_i[47];
+ data_o[48] = (syndrome_o == 8'hb7) ^ data_i[48];
+ data_o[49] = (syndrome_o == 8'hb8) ^ data_i[49];
+ data_o[50] = (syndrome_o == 8'hb9) ^ data_i[50];
+ data_o[51] = (syndrome_o == 8'hba) ^ data_i[51];
+ data_o[52] = (syndrome_o == 8'hbb) ^ data_i[52];
+ data_o[53] = (syndrome_o == 8'hbc) ^ data_i[53];
+ data_o[54] = (syndrome_o == 8'hbd) ^ data_i[54];
+ data_o[55] = (syndrome_o == 8'hbe) ^ data_i[55];
+ data_o[56] = (syndrome_o == 8'hbf) ^ data_i[56];
+ data_o[57] = (syndrome_o == 8'hc1) ^ data_i[57];
+ data_o[58] = (syndrome_o == 8'hc2) ^ data_i[58];
+ data_o[59] = (syndrome_o == 8'hc3) ^ data_i[59];
+ data_o[60] = (syndrome_o == 8'hc4) ^ data_i[60];
+ data_o[61] = (syndrome_o == 8'hc5) ^ data_i[61];
+ data_o[62] = (syndrome_o == 8'hc6) ^ data_i[62];
+ data_o[63] = (syndrome_o == 8'hc7) ^ data_i[63];
+ data_o[64] = (syndrome_o == 8'hc8) ^ data_i[64];
+ data_o[65] = (syndrome_o == 8'hc9) ^ data_i[65];
+ data_o[66] = (syndrome_o == 8'hca) ^ data_i[66];
+ data_o[67] = (syndrome_o == 8'hcb) ^ data_i[67];
+
+ // err_o calc. bit0: single error, bit1: double error
+ err_o[0] = syndrome_o[7];
+ err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
+
+ dec.data = data_o;
+ dec.syndrome = syndrome_o;
+ dec.err = err_o;
+ return dec;
+
+ endfunction
+
endpackage
diff --git a/util/design/data/secded_cfg.hjson b/util/design/data/secded_cfg.hjson
index 61a43b3..6a2359b 100644
--- a/util/design/data/secded_cfg.hjson
+++ b/util/design/data/secded_cfg.hjson
@@ -11,6 +11,15 @@
{k: 32, m: 7, code_type: "hamming"},
{k: 64, m: 8, code_type: "hamming"},
{k: 68, m: 8, code_type: "hamming"},
+ {k: 16, m: 6, code_type: "inv_hsiao" },
+ {k: 22, m: 6, code_type: "inv_hsiao" },
+ {k: 32, m: 7, code_type: "inv_hsiao" },
+ {k: 57, m: 7, code_type: "inv_hsiao" },
+ {k: 64, m: 8, code_type: "inv_hsiao" },
+ {k: 16, m: 6, code_type: "inv_hamming"},
+ {k: 32, m: 7, code_type: "inv_hamming"},
+ {k: 64, m: 8, code_type: "inv_hamming"},
+ {k: 68, m: 8, code_type: "inv_hamming"},
],
// This seed can be changed here if re-generation of ECC RTL
// with a different seed is desired.