[keymgr] Hook-up random compile time constants

- minor fixes to scripts

Signed-off-by: Timothy Chen <timothytim@google.com>

[keymgr] fix copy/paste issue from util gen

Signed-off-by: Timothy Chen <timothytim@google.com>

[keymgr] fix assertion variables

Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/keymgr/data/keymgr.hjson b/hw/ip/keymgr/data/keymgr.hjson
index 7358b81..fc2fab1 100644
--- a/hw/ip/keymgr/data/keymgr.hjson
+++ b/hw/ip/keymgr/data/keymgr.hjson
@@ -66,6 +66,61 @@
   ],
 
   param_list: [
+    // Random netlist constants
+    { name:      "RndCnstLfsrSeed",
+      desc:      "Compile-time random bits for initial LFSR seed",
+      type:      "keymgr_pkg::lfsr_seed_t"
+      randcount: "64",
+      randtype:  "data",
+    }
+    { name:      "RndCnstLfsrPerm",
+      desc:      "Compile-time random permutation for LFSR output",
+      type:      "keymgr_pkg::lfsr_perm_t"
+      randcount: "64",
+      randtype:  "perm",
+    }
+    { name:      "RndCnstRevisionSeed",
+      desc:      "Compile-time random bits for revision seed",
+      type:      "keymgr_pkg::seed_t"
+      randcount: "256",
+      randtype:  "data",
+    },
+
+    { name:      "RndCnstCreatorIdentitySeed",
+      desc:      "Compile-time random bits for creator identity seed",
+      type:      "keymgr_pkg::seed_t"
+      randcount: "256",
+      randtype:  "data",
+    },
+
+    { name:      "RndCnstOwnerIntIdentitySeed",
+      desc:      "Compile-time random bits for owner intermediate identity seed",
+      type:      "keymgr_pkg::seed_t"
+      randcount: "256",
+      randtype:  "data",
+    },
+
+    { name:      "RndCnstOwnerIdentitySeed",
+      desc:      "Compile-time random bits for owner identity seed",
+      type:      "keymgr_pkg::seed_t"
+      randcount: "256",
+      randtype:  "data",
+    },
+
+    { name:      "RndCnstSoftOutputSeed",
+      desc:      "Compile-time random bits for software generation seed",
+      type:      "keymgr_pkg::seed_t"
+      randcount: "256",
+      randtype:  "data",
+    },
+
+    { name:      "RndCnstHardOutputSeed",
+      desc:      "Compile-time random bits for hardware generation seed",
+      type:      "keymgr_pkg::seed_t"
+      randcount: "256",
+      randtype:  "data",
+    },
+
     { name: "NumRomExtReg",
       desc: "Number of Registers for ROM_ext descriptor",
       type: "int",
diff --git a/hw/ip/keymgr/rtl/keymgr.sv b/hw/ip/keymgr/rtl/keymgr.sv
index c91ce3f..6e26c97 100644
--- a/hw/ip/keymgr/rtl/keymgr.sv
+++ b/hw/ip/keymgr/rtl/keymgr.sv
@@ -8,7 +8,15 @@
 `include "prim_assert.sv"
 
 module keymgr import keymgr_pkg::*; #(
-  parameter logic AlertAsyncOn = 1'b1
+  parameter logic AlertAsyncOn                 = 1'b1,
+  parameter lfsr_seed_t RndCnstLfsrSeed        = RndCnstLfsrSeedDefault,
+  parameter lfsr_perm_t RndCnstLfsrPerm        = RndCnstLfsrPermDefault,
+  parameter seed_t RndCnstRevisionSeed         = RndCnstRevisionSeedDefault,
+  parameter seed_t RndCnstCreatorIdentitySeed  = RndCnstCreatorIdentitySeedDefault,
+  parameter seed_t RndCnstOwnerIntIdentitySeed = RndCnstOwnerIntIdentitySeedDefault,
+  parameter seed_t RndCnstOwnerIdentitySeed    = RndCnstOwnerIdentitySeedDefault,
+  parameter seed_t RndCnstSoftOutputSeed       = RndCnstSoftOutputSeedDefault,
+  parameter seed_t RndCnstHardOutputSeed       = RndCnstHardOutputSeedDefault
 ) (
   input clk_i,
   input rst_ni,
@@ -43,7 +51,7 @@
   `ASSERT_INIT(AdvDataWidth_A, AdvDataWidth <= KDFMaxWidth)
   `ASSERT_INIT(IdDataWidth_A,  IdDataWidth  <= KDFMaxWidth)
   `ASSERT_INIT(GenDataWidth_A, GenDataWidth <= KDFMaxWidth)
-  `ASSERT_INIT(OutputKeyDiff_A, HardOutputKey != SoftOutputKey)
+  `ASSERT_INIT(OutputKeyDiff_A, RndCnstHardOutputSeed != RndCnstSoftOutputSeed)
 
   // Register module
   keymgr_reg2hw_t reg2hw;
@@ -77,8 +85,11 @@
   logic ctrl_lfsr_en, data_lfsr_en, sideload_lfsr_en;
 
   prim_lfsr #(
-    .LfsrDw(64),
-    .StateOutDw(64)
+    .LfsrDw(LfsrWidth),
+    .StateOutDw(LfsrWidth),
+    .DefaultSeed(RndCnstLfsrSeed),
+    .StatePermEn(1'b1),
+    .StatePerm(RndCnstLfsrPerm)
   ) u_lfsr (
     .clk_i,
     .rst_ni,
@@ -196,7 +207,7 @@
   logic [KeyWidth-1:0] creator_seed;
   assign creator_seed = flash_i.seeds[flash_ctrl_pkg::CreatorSeedIdx];
   assign adv_matrix[Creator] = AdvDataWidth'({reg2hw.rom_ext_desc,
-                                              RevisionSecret,
+                                              RndCnstRevisionSeed,
                                               otp_i.devid,
                                               lc_i.health_state,
                                               creator_seed});
@@ -215,15 +226,15 @@
     assign id_matrix[i] = {IdLfsrCopies{lfsr[31:0]}};
   end
 
-  assign id_matrix[Creator]  = CreatorIdentityKey;
-  assign id_matrix[OwnerInt] = OwnerIntIdentityKey;
-  assign id_matrix[Owner]    = OwnerIdentityKey;
+  assign id_matrix[Creator]  = RndCnstCreatorIdentitySeed;
+  assign id_matrix[OwnerInt] = RndCnstOwnerIntIdentitySeed;
+  assign id_matrix[Owner]    = RndCnstOwnerIdentitySeed;
 
 
   // Generate output operation input construction
   logic [KeyWidth-1:0] output_key;
 
-  assign output_key = (key_sel == HwKey) ? HardOutputKey : SoftOutputKey;
+  assign output_key = (key_sel == HwKey) ? RndCnstHardOutputSeed : RndCnstSoftOutputSeed;
   assign gen_in = (stage_sel == Disable) ? {GenLfsrCopies{lfsr[31:0]}} : {reg2hw.key_version,
                                                                           reg2hw.salt,
                                                                           output_key};
diff --git a/hw/ip/keymgr/rtl/keymgr_pkg.sv b/hw/ip/keymgr/rtl/keymgr_pkg.sv
index e13e710..d385079 100644
--- a/hw/ip/keymgr/rtl/keymgr_pkg.sv
+++ b/hw/ip/keymgr/rtl/keymgr_pkg.sv
@@ -12,21 +12,39 @@
   parameter int KmacDataIfWidth = 64;  // KMAC interface data width
   parameter int KeyMgrStages = 3;      // Number of key manager stages (creator, ownerInt, owner)
   parameter int RomExtDescWidth = 128; // Size of rom_ext hash, truncated
-  parameter int LfsrWidth = 64;
   parameter int Shares = 2; // number of key shares
 
   // These should be defined in another module's package
   parameter int HealthStateWidth = 128;
   parameter int DevIdWidth = 256;
 
-  // These should eventually reference top_pkg so that they can be easily managed per
-  // device
-  parameter logic[KeyWidth-1:0] RevisionSecret      = 256'hAAAA5555;
-  parameter logic[KeyWidth-1:0] CreatorIdentityKey  = 256'hDEADBEEF;
-  parameter logic[KeyWidth-1:0] OwnerIntIdentityKey = 256'hDEADBEEF;
-  parameter logic[KeyWidth-1:0] OwnerIdentityKey    = 256'hDEADBEEF;
-  parameter logic[KeyWidth-1:0] SoftOutputKey       = 256'hDEADBEEF;
-  parameter logic[KeyWidth-1:0] HardOutputKey       = 256'hDEADBEEE;
+  // Default seeds
+  // These are generated using random.org byte dumper
+  typedef logic [KeyWidth-1:0] seed_t;
+  parameter seed_t RndCnstRevisionSeedDefault =
+    256'h3a0a6d73cd50897de4d744bd65ebdb3837ea77087d878651c517c18a5742b2f9;
+  parameter seed_t RndCnstCreatorIdentitySeedDefault =
+    256'h6d234651d535ebb0dce4d82f503096614355fc7b84595e4f67a866177d421df6;
+  parameter seed_t RndCnstOwnerIntIdentitySeedDefault =
+    256'hdba98db4fb1413b32fd5a4deac3ce546966a4bc2761235643358c8e76083d382;
+  parameter seed_t RndCnstOwnerIdentitySeedDefault =
+    256'h8c0a27ef53e0e0bf5f5f5e26a30a0d0db10761ed802c6d2fd22873209976021e;
+  parameter seed_t RndCnstSoftOutputSeedDefault =
+    256'h99cadb2c2d9b438591d943a89bc64dbb3bc2abc842eeea5faf74d27f7a7c99b6;
+  parameter seed_t RndCnstHardOutputSeedDefault =
+    256'hd551b351decbb6f687c7f5c845363f12d6411fae812e16b23bc8ae59885a56b1;
+
+  // Default Lfsr configurations
+  // These LFSR parameters have been generated with
+  // $ hw/ip/prim/util/gen-lfsr-seed.py --width 64 --seed 691876113 --prefix ""
+  parameter int LfsrWidth = 64;
+  typedef logic [LfsrWidth-1:0] lfsr_seed_t;
+  typedef logic [LfsrWidth-1:0][$clog2(LfsrWidth)-1:0] lfsr_perm_t;
+  parameter lfsr_seed_t RndCnstLfsrSeedDefault = 64'h22d326255bd24320;
+  parameter lfsr_perm_t RndCnstLfsrPermDefault = {
+    128'h16108c9f9008aa37e5118d1ec1df64a7,
+    256'h24f3f1b73537f42d38383ee8f897286df81d49ab54b6bbbb666cbd1a16c41252
+  };
 
   // Width calculations
   // These are the largest calculations in use across all stages
diff --git a/hw/ip/prim/util/gen-lfsr-seed.py b/hw/ip/prim/util/gen-lfsr-seed.py
index f287c8f..6bf56e6 100755
--- a/hw/ip/prim/util/gen-lfsr-seed.py
+++ b/hw/ip/prim/util/gen-lfsr-seed.py
@@ -40,6 +40,25 @@
     return literal_str
 
 
+def _blockify(s, size, limit):
+    """ Make sure the output does not exceed a certain size per line"""
+
+    str_idx = 2
+    remain = size % (limit * 4)
+    numbits = remain if remain else limit * 4
+    s_list = []
+
+    remain = size
+    while remain > 0:
+        s_incr = int(numbits / 4)
+        s_list.append("{}'h{}".format(numbits, s[str_idx: str_idx + s_incr]))
+        str_idx += s_incr
+        remain -= numbits
+        numbits = limit * 4
+
+    return(",\n  ".join(s_list))
+
+
 def _get_random_perm_hex_literal(numel):
     """ Compute a random permutation of 'numel' elements and
     return as packed hex literal"""
@@ -52,8 +71,7 @@
         literal_str += format(k, '0' + str(width) + 'b')
     # convert to hex for space efficiency
     literal_str = hex(int(literal_str, 2))
-    literal_str = str(width * numel) + "'h" + literal_str[2:]
-    return literal_str
+    return _blockify(literal_str, width * numel, 64)
 
 
 def _wrapped_docstring():
@@ -126,8 +144,9 @@
 typedef logic [{}LfsrWidth-1:0] {}lfsr_seed_t;
 typedef logic [{}LfsrWidth-1:0][$clog2({}LfsrWidth)-1:0] {}lfsr_perm_t;
 parameter {}lfsr_seed_t RndCnst{}LfsrSeedDefault = {};
-parameter {}lfsr_perm_t RndCnst{}LfsrPermDefault =
-    {};
+parameter {}lfsr_perm_t RndCnst{}LfsrPermDefault = {{
+  {}
+}};
 '''.format(args.width, args.seed, args.prefix,
            args.prefix, args.width,
            args.prefix, type_prefix,
diff --git a/hw/top_earlgrey/data/top_earlgrey_rnd_cnst_pkg.sv.tpl b/hw/top_earlgrey/data/top_earlgrey_rnd_cnst_pkg.sv.tpl
index 92fd81b..2210abb 100644
--- a/hw/top_earlgrey/data/top_earlgrey_rnd_cnst_pkg.sv.tpl
+++ b/hw/top_earlgrey/data/top_earlgrey_rnd_cnst_pkg.sv.tpl
@@ -11,7 +11,8 @@
     hexstr = str(hexstr[2:]).upper()
     # Block width in hex chars
     blockwidth = 64
-    numbits = randwidth % (4*blockwidth)
+    remainder = randwidth % (4*blockwidth)
+    numbits = remainder if remainder else 4*blockwidth
     idx = 0
     hexblocks = []
     while randwidth > 0: