[util] add `dec` types to prim_secded_pkg

this PR creates specific struct types for each of the secded decoding
functions, and modifies the decoding functions to return an instance of
the appropriate struct.

this helps DV out by encapsulating the field sizes, and also avoids some
CI errors.

Signed-off-by: Udi Jonnalagadda <udij@google.com>
diff --git a/hw/ip/prim/rtl/prim_secded_pkg.sv b/hw/ip/prim/rtl/prim_secded_pkg.sv
index e668dcf..e14374b 100644
--- a/hw/ip/prim/rtl/prim_secded_pkg.sv
+++ b/hw/ip/prim/rtl/prim_secded_pkg.sv
@@ -7,6 +7,54 @@
 
 package prim_secded_pkg;
 
+  typedef struct packed {
+    logic [15:0] data;
+    logic [5:0] syndrome;
+    logic [1:0]  err;
+  } secded_22_16_t;
+
+  typedef struct packed {
+    logic [21:0] data;
+    logic [5:0] syndrome;
+    logic [1:0]  err;
+  } secded_28_22_t;
+
+  typedef struct packed {
+    logic [31:0] data;
+    logic [6:0] syndrome;
+    logic [1:0]  err;
+  } secded_39_32_t;
+
+  typedef struct packed {
+    logic [56:0] data;
+    logic [6:0] syndrome;
+    logic [1:0]  err;
+  } secded_64_57_t;
+
+  typedef struct packed {
+    logic [63:0] data;
+    logic [7:0] syndrome;
+    logic [1:0]  err;
+  } secded_72_64_t;
+
+  typedef struct packed {
+    logic [15:0] data;
+    logic [5:0] syndrome;
+    logic [1:0]  err;
+  } secded_hamming_22_16_t;
+
+  typedef struct packed {
+    logic [31:0] data;
+    logic [6:0] syndrome;
+    logic [1:0]  err;
+  } secded_hamming_39_32_t;
+
+  typedef struct packed {
+    logic [63:0] data;
+    logic [7:0] syndrome;
+    logic [1:0]  err;
+  } secded_hamming_72_64_t;
+
   function automatic logic [21:0] prim_secded_22_16_enc (logic [15:0] in);
     logic [21:0] out;
     out = 22'(in);
@@ -19,12 +67,13 @@
     return out;
   endfunction
 
-  function automatic prim_secded_22_16_dec (
-    input  logic [21:0] in,
-    output logic [15:0] d_o,
-    output logic [5:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic secded_22_16_t prim_secded_22_16_dec (logic [21:0] in);
+    logic [15:0] d_o;
+    logic [5:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    secded_22_16_t dec;
+
     logic single_error;
 
     // Syndrome calculation
@@ -58,6 +107,11 @@
     err_o[0] = single_error;
     err_o[1] = ~single_error & (|syndrome_o);
 
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 
   function automatic logic [27:0] prim_secded_28_22_enc (logic [21:0] in);
@@ -72,12 +126,13 @@
     return out;
   endfunction
 
-  function automatic prim_secded_28_22_dec (
-    input  logic [27:0] in,
-    output logic [21:0] d_o,
-    output logic [5:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic secded_28_22_t prim_secded_28_22_dec (logic [27:0] in);
+    logic [21:0] d_o;
+    logic [5:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    secded_28_22_t dec;
+
     logic single_error;
 
     // Syndrome calculation
@@ -117,6 +172,11 @@
     err_o[0] = single_error;
     err_o[1] = ~single_error & (|syndrome_o);
 
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 
   function automatic logic [38:0] prim_secded_39_32_enc (logic [31:0] in);
@@ -132,12 +192,13 @@
     return out;
   endfunction
 
-  function automatic prim_secded_39_32_dec (
-    input  logic [38:0] in,
-    output logic [31:0] d_o,
-    output logic [6:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic secded_39_32_t prim_secded_39_32_dec (logic [38:0] in);
+    logic [31:0] d_o;
+    logic [6:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    secded_39_32_t dec;
+
     logic single_error;
 
     // Syndrome calculation
@@ -188,6 +249,11 @@
     err_o[0] = single_error;
     err_o[1] = ~single_error & (|syndrome_o);
 
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 
   function automatic logic [63:0] prim_secded_64_57_enc (logic [56:0] in);
@@ -203,12 +269,13 @@
     return out;
   endfunction
 
-  function automatic prim_secded_64_57_dec (
-    input  logic [63:0] in,
-    output logic [56:0] d_o,
-    output logic [6:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic secded_64_57_t prim_secded_64_57_dec (logic [63:0] in);
+    logic [56:0] d_o;
+    logic [6:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    secded_64_57_t dec;
+
     logic single_error;
 
     // Syndrome calculation
@@ -284,6 +351,11 @@
     err_o[0] = single_error;
     err_o[1] = ~single_error & (|syndrome_o);
 
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 
   function automatic logic [71:0] prim_secded_72_64_enc (logic [63:0] in);
@@ -300,12 +372,13 @@
     return out;
   endfunction
 
-  function automatic prim_secded_72_64_dec (
-    input  logic [71:0] in,
-    output logic [63:0] d_o,
-    output logic [7:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic secded_72_64_t prim_secded_72_64_dec (logic [71:0] in);
+    logic [63:0] d_o;
+    logic [7:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    secded_72_64_t dec;
+
     logic single_error;
 
     // Syndrome calculation
@@ -389,6 +462,11 @@
     err_o[0] = single_error;
     err_o[1] = ~single_error & (|syndrome_o);
 
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 
   function automatic logic [21:0] prim_secded_hamming_22_16_enc (logic [15:0] in);
@@ -403,12 +481,13 @@
     return out;
   endfunction
 
-  function automatic prim_secded_hamming_22_16_dec (
-    input  logic [21:0] in,
-    output logic [15:0] d_o,
-    output logic [5:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic secded_hamming_22_16_t prim_secded_hamming_22_16_dec (logic [21:0] in);
+    logic [15:0] d_o;
+    logic [5:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    secded_hamming_22_16_t dec;
+
 
     // Syndrome calculation
     syndrome_o[0] = ^(in & 22'h01AD5B);
@@ -440,6 +519,11 @@
     err_o[0] = syndrome_o[5];
     err_o[1] = |syndrome_o[4:0] & ~syndrome_o[5];
 
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 
   function automatic logic [38:0] prim_secded_hamming_39_32_enc (logic [31:0] in);
@@ -455,12 +539,13 @@
     return out;
   endfunction
 
-  function automatic prim_secded_hamming_39_32_dec (
-    input  logic [38:0] in,
-    output logic [31:0] d_o,
-    output logic [6:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic secded_hamming_39_32_t prim_secded_hamming_39_32_dec (logic [38:0] in);
+    logic [31:0] d_o;
+    logic [6:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    secded_hamming_39_32_t dec;
+
 
     // Syndrome calculation
     syndrome_o[0] = ^(in & 39'h0156AAAD5B);
@@ -509,6 +594,11 @@
     err_o[0] = syndrome_o[6];
     err_o[1] = |syndrome_o[5:0] & ~syndrome_o[6];
 
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 
   function automatic logic [71:0] prim_secded_hamming_72_64_enc (logic [63:0] in);
@@ -525,12 +615,13 @@
     return out;
   endfunction
 
-  function automatic prim_secded_hamming_72_64_dec (
-    input  logic [71:0] in,
-    output logic [63:0] d_o,
-    output logic [7:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic secded_hamming_72_64_t prim_secded_hamming_72_64_dec (logic [71:0] in);
+    logic [63:0] d_o;
+    logic [7:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    secded_hamming_72_64_t dec;
+
 
     // Syndrome calculation
     syndrome_o[0] = ^(in & 72'h01AB55555556AAAD5B);
@@ -612,6 +703,11 @@
     err_o[0] = syndrome_o[7];
     err_o[1] = |syndrome_o[6:0] & ~syndrome_o[7];
 
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 
 
diff --git a/util/design/secded_gen.py b/util/design/secded_gen.py
index 3c19fb6..4a32f64 100755
--- a/util/design/secded_gen.py
+++ b/util/design/secded_gen.py
@@ -80,10 +80,25 @@
     return fanin_masks
 
 
+def print_pkg_types(n, k, m, codes, suffix, codetype):
+    typename = "secded%s_%d_%d_t" % (suffix, n, k)
+
+    typestr = '''
+  typedef struct packed {{
+    logic [{}:0] data;
+    logic [{}:0] syndrome;
+    logic [1:0]  err;
+  }} {};
+'''.format((k - 1), (m - 1), typename)
+
+    return typestr
+
+
 def print_fn(n, k, m, codes, suffix, codetype):
     enc_out = print_enc(n, k, m, codes)
     dec_out = print_dec(n, k, m, codes, codetype, "function")
 
+    typename = "secded%s_%d_%d_t" % (suffix, n, k)
     module_name = "prim_secded%s_%d_%d" % (suffix, n, k)
 
     outstr = '''
@@ -92,16 +107,22 @@
 {}    return out;
   endfunction
 
-  function automatic {}_dec (
-    input  logic [{}:0] in,
-    output logic [{}:0] d_o,
-    output logic [{}:0] syndrome_o,
-    output logic [1:0]  err_o
-  );
+  function automatic {} {}_dec (logic [{}:0] in);
+    logic [{}:0] d_o;
+    logic [{}:0] syndrome_o;
+    logic [1:0]  err_o;
+
+    {} dec;
+
 {}
+    dec.data      = d_o;
+    dec.syndrome  = syndrome_o;
+    dec.err       = err_o;
+    return dec;
+
   endfunction
 '''.format((n - 1), module_name, (k - 1), (n - 1), enc_out,
-           module_name, (n - 1), (k - 1), (m - 1), dec_out)
+           typename, module_name, (n - 1), (k - 1), (m - 1), typename, dec_out)
 
     return outstr
 
@@ -127,8 +148,8 @@
 
     outstr = ""
     if codetype == "hsiao":
-      outstr += "  {}logic single_error;\n".format(
-          preamble if print_type == "function" else "")
+        outstr += "  {}logic single_error;\n".format(
+            preamble if print_type == "function" else "")
 
     outstr += "\n"
     outstr += "  {}// Syndrome calculation\n".format(
@@ -204,6 +225,7 @@
 
 def generate(cfgs, args, seed):
     pkg_out_str = ""
+    pkg_type_str = ""
     for cfg in cfgs['cfgs']:
         log.debug("Working on {}".format(cfg))
         k = cfg['k']
@@ -219,6 +241,8 @@
         # write out rtl files
         write_enc_dec_files(n, k, m, seed, codes, suffix, args.outdir, codetype)
 
+        # write out package typedefs
+        pkg_type_str += print_pkg_types(n, k, m, codes, suffix, codetype)
         # print out functions
         pkg_out_str += print_fn(n, k, m, codes, suffix, codetype)
 
@@ -226,7 +250,8 @@
             write_fpv_files(n, k, m, codes, codetype, args.fpv_outdir)
 
     # write out package file
-    write_pkg_file(seed, args.outdir, pkg_out_str)
+    full_pkg_str = pkg_type_str + pkg_out_str
+    write_pkg_file(seed, args.outdir, full_pkg_str)
 
 
 # k = data bits