[lc_ctrl/otp_ctrl] Add diversification constant to generation scripts

This diversification constant allows to use the two scripts with the
same seed without risking an overlap in the PRNG sequence.

Signed-off-by: Michael Schaffner <msf@opentitan.org>
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv
index d36e900..c66f3c4 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv
@@ -25,7 +25,7 @@
   // - Minimum Hamming weight: 8
   // - Maximum Hamming weight: 16
   // - Minimum Hamming distance from any other value: 6
-  // - Maximum Hamming distance from any other value: 18
+  // - Maximum Hamming distance from any other value: 20
   //
   // Hamming distance histogram:
   //
@@ -35,21 +35,21 @@
   //  3: --
   //  4: --
   //  5: --
-  //  6: |||| (6.23%)
+  //  6: |||| (6.84%)
   //  7: --
-  //  8: ||||||||||| (17.60%)
+  //  8: ||||||||||| (16.70%)
   //  9: --
-  // 10: |||||||||||||||||||| (29.76%)
+  // 10: ||||||||||||||||||| (29.10%)
   // 11: --
-  // 12: |||||||||||||||||| (27.71%)
+  // 12: |||||||||||||||||||| (29.82%)
   // 13: --
-  // 14: |||||||||| (15.25%)
+  // 14: |||||||| (12.83%)
   // 15: --
-  // 16: || (3.27%)
+  // 16: || (4.30%)
   // 17: --
-  // 18:  (0.18%)
+  // 18:  (0.36%)
   // 19: --
-  // 20: --
+  // 20:  (0.06%)
   // 21: --
   // 22: --
   //
@@ -58,96 +58,96 @@
   // the OTP ECC logic at runtime.
 
   // The A/B values are used for the encoded LC state.
-  parameter logic [15:0] A0 = 16'b0110010111010110; // ECC: 6'b001000
-  parameter logic [15:0] B0 = 16'b0111010111011111; // ECC: 6'b011110
+  parameter logic [15:0] A0 = 16'b1000011000111000; // ECC: 6'b110000
+  parameter logic [15:0] B0 = 16'b1110011001111001; // ECC: 6'b111111
 
-  parameter logic [15:0] A1 = 16'b1011000010101001; // ECC: 6'b010110
-  parameter logic [15:0] B1 = 16'b1011000011111111; // ECC: 6'b110111
+  parameter logic [15:0] A1 = 16'b1100011000100110; // ECC: 6'b101001
+  parameter logic [15:0] B1 = 16'b1101111101101110; // ECC: 6'b101011
 
-  parameter logic [15:0] A2 = 16'b1010100011000001; // ECC: 6'b110011
-  parameter logic [15:0] B2 = 16'b1111100111011011; // ECC: 6'b110011
+  parameter logic [15:0] A2 = 16'b0010000111101100; // ECC: 6'b110010
+  parameter logic [15:0] B2 = 16'b0111011111101101; // ECC: 6'b110110
 
-  parameter logic [15:0] A3 = 16'b1111001011100001; // ECC: 6'b100000
-  parameter logic [15:0] B3 = 16'b1111011111111001; // ECC: 6'b101100
+  parameter logic [15:0] A3 = 16'b0001100111101000; // ECC: 6'b000100
+  parameter logic [15:0] B3 = 16'b1101101111101100; // ECC: 6'b001101
 
-  parameter logic [15:0] A4 = 16'b0011010100001010; // ECC: 6'b100001
-  parameter logic [15:0] B4 = 16'b0111010100111011; // ECC: 6'b110101
+  parameter logic [15:0] A4 = 16'b1001011001100100; // ECC: 6'b000001
+  parameter logic [15:0] B4 = 16'b1101111001110100; // ECC: 6'b101101
 
-  parameter logic [15:0] A5 = 16'b1101000101000100; // ECC: 6'b110011
-  parameter logic [15:0] B5 = 16'b1111101101100111; // ECC: 6'b110011
+  parameter logic [15:0] A5 = 16'b0001011000010110; // ECC: 6'b111001
+  parameter logic [15:0] B5 = 16'b1011011001110111; // ECC: 6'b111101
 
-  parameter logic [15:0] A6 = 16'b1001101001100000; // ECC: 6'b111001
-  parameter logic [15:0] B6 = 16'b1001111011101011; // ECC: 6'b111011
+  parameter logic [15:0] A6 = 16'b0101001001010010; // ECC: 6'b001111
+  parameter logic [15:0] B6 = 16'b1101111111110010; // ECC: 6'b001111
 
-  parameter logic [15:0] A7 = 16'b0001110110100001; // ECC: 6'b000100
-  parameter logic [15:0] B7 = 16'b0011111110100011; // ECC: 6'b111100
+  parameter logic [15:0] A7 = 16'b0010001001011111; // ECC: 6'b011000
+  parameter logic [15:0] B7 = 16'b0011101011111111; // ECC: 6'b011101
 
-  parameter logic [15:0] A8 = 16'b0100111010001011; // ECC: 6'b001001
-  parameter logic [15:0] B8 = 16'b0101111110011011; // ECC: 6'b011111
+  parameter logic [15:0] A8 = 16'b0000001110111001; // ECC: 6'b001000
+  parameter logic [15:0] B8 = 16'b1100001110111111; // ECC: 6'b101010
 
-  parameter logic [15:0] A9 = 16'b0011011000110101; // ECC: 6'b000110
-  parameter logic [15:0] B9 = 16'b1011011001111101; // ECC: 6'b011111
+  parameter logic [15:0] A9 = 16'b1100100101111000; // ECC: 6'b010010
+  parameter logic [15:0] B9 = 16'b1111101101111001; // ECC: 6'b011110
 
-  parameter logic [15:0] A10 = 16'b0001110010011100; // ECC: 6'b001000
-  parameter logic [15:0] B10 = 16'b0101110011111110; // ECC: 6'b111000
+  parameter logic [15:0] A10 = 16'b0010000110110111; // ECC: 6'b010001
+  parameter logic [15:0] B10 = 16'b1011010111111111; // ECC: 6'b010101
 
-  parameter logic [15:0] A11 = 16'b0101011000001101; // ECC: 6'b100101
-  parameter logic [15:0] B11 = 16'b0111011110101101; // ECC: 6'b111101
+  parameter logic [15:0] A11 = 16'b1011000100000111; // ECC: 6'b011001
+  parameter logic [15:0] B11 = 16'b1111110110000111; // ECC: 6'b011111
 
 
   // The C/D values are used for the encoded LC transition counter.
-  parameter logic [15:0] C0 = 16'b1000010011010011; // ECC: 6'b110010
-  parameter logic [15:0] D0 = 16'b1100110011110111; // ECC: 6'b111011
+  parameter logic [15:0] C0 = 16'b0011100000010000; // ECC: 6'b111001
+  parameter logic [15:0] D0 = 16'b1111100100110000; // ECC: 6'b111111
 
-  parameter logic [15:0] C1 = 16'b1010010010000011; // ECC: 6'b000011
-  parameter logic [15:0] D1 = 16'b1010110011011011; // ECC: 6'b010111
+  parameter logic [15:0] C1 = 16'b0011000010101011; // ECC: 6'b100110
+  parameter logic [15:0] D1 = 16'b1011010011111011; // ECC: 6'b111110
 
-  parameter logic [15:0] C2 = 16'b0110010000011011; // ECC: 6'b100000
-  parameter logic [15:0] D2 = 16'b0111111011111011; // ECC: 6'b100000
+  parameter logic [15:0] C2 = 16'b0011110100100000; // ECC: 6'b011000
+  parameter logic [15:0] D2 = 16'b0011111101101011; // ECC: 6'b011100
 
-  parameter logic [15:0] C3 = 16'b1000010010001100; // ECC: 6'b110111
-  parameter logic [15:0] D3 = 16'b1010111010101111; // ECC: 6'b110111
+  parameter logic [15:0] C3 = 16'b1010101100010010; // ECC: 6'b111000
+  parameter logic [15:0] D3 = 16'b1111111110011010; // ECC: 6'b111010
 
-  parameter logic [15:0] C4 = 16'b1010010001100101; // ECC: 6'b001101
-  parameter logic [15:0] D4 = 16'b1111010111100111; // ECC: 6'b001111
+  parameter logic [15:0] C4 = 16'b0100011010010100; // ECC: 6'b110110
+  parameter logic [15:0] D4 = 16'b0101111110010111; // ECC: 6'b111110
 
-  parameter logic [15:0] C5 = 16'b0010010000101110; // ECC: 6'b010010
-  parameter logic [15:0] D5 = 16'b0010011111111110; // ECC: 6'b011111
+  parameter logic [15:0] C5 = 16'b1011111110000101; // ECC: 6'b000000
+  parameter logic [15:0] D5 = 16'b1011111111010111; // ECC: 6'b000111
 
-  parameter logic [15:0] C6 = 16'b0010111110000000; // ECC: 6'b100010
-  parameter logic [15:0] D6 = 16'b1010111110110011; // ECC: 6'b110010
+  parameter logic [15:0] C6 = 16'b1110010000010111; // ECC: 6'b010100
+  parameter logic [15:0] D6 = 16'b1111110010111111; // ECC: 6'b010110
 
-  parameter logic [15:0] C7 = 16'b0001000111001110; // ECC: 6'b011100
-  parameter logic [15:0] D7 = 16'b1111100111111110; // ECC: 6'b011100
+  parameter logic [15:0] C7 = 16'b0100100101011010; // ECC: 6'b001000
+  parameter logic [15:0] D7 = 16'b1110100111111111; // ECC: 6'b001101
 
-  parameter logic [15:0] C8 = 16'b1100001000110001; // ECC: 6'b001111
-  parameter logic [15:0] D8 = 16'b1100011001111111; // ECC: 6'b101111
+  parameter logic [15:0] C8 = 16'b0000110000011011; // ECC: 6'b110110
+  parameter logic [15:0] D8 = 16'b0011111000011111; // ECC: 6'b111111
 
-  parameter logic [15:0] C9 = 16'b1100100001010000; // ECC: 6'b110010
-  parameter logic [15:0] D9 = 16'b1111101001111011; // ECC: 6'b110110
+  parameter logic [15:0] C9 = 16'b0111001100010100; // ECC: 6'b011001
+  parameter logic [15:0] D9 = 16'b1111101101110110; // ECC: 6'b111001
 
-  parameter logic [15:0] C10 = 16'b1000000010001010; // ECC: 6'b011011
-  parameter logic [15:0] D10 = 16'b1011010010101010; // ECC: 6'b111111
+  parameter logic [15:0] C10 = 16'b0001101110100010; // ECC: 6'b100011
+  parameter logic [15:0] D10 = 16'b0011111111100011; // ECC: 6'b110111
 
-  parameter logic [15:0] C11 = 16'b0100011101010000; // ECC: 6'b111010
-  parameter logic [15:0] D11 = 16'b0111011111110100; // ECC: 6'b111011
+  parameter logic [15:0] C11 = 16'b0000110101000010; // ECC: 6'b111101
+  parameter logic [15:0] D11 = 16'b1100110111010110; // ECC: 6'b111111
 
-  parameter logic [15:0] C12 = 16'b1011001000010010; // ECC: 6'b110110
-  parameter logic [15:0] D12 = 16'b1011011111010111; // ECC: 6'b110110
+  parameter logic [15:0] C12 = 16'b0001111111010001; // ECC: 6'b000010
+  parameter logic [15:0] D12 = 16'b0001111111111001; // ECC: 6'b101111
 
-  parameter logic [15:0] C13 = 16'b0000101101000110; // ECC: 6'b111010
-  parameter logic [15:0] D13 = 16'b0011101101001111; // ECC: 6'b111111
+  parameter logic [15:0] C13 = 16'b0010010000110000; // ECC: 6'b111111
+  parameter logic [15:0] D13 = 16'b0111011100110101; // ECC: 6'b111111
 
-  parameter logic [15:0] C14 = 16'b0010010000000111; // ECC: 6'b011100
-  parameter logic [15:0] D14 = 16'b0011111011010111; // ECC: 6'b011111
+  parameter logic [15:0] C14 = 16'b0010111010001111; // ECC: 6'b001000
+  parameter logic [15:0] D14 = 16'b1011111010111111; // ECC: 6'b101100
 
-  parameter logic [15:0] C15 = 16'b1101110100010010; // ECC: 6'b001100
-  parameter logic [15:0] D15 = 16'b1111111101011010; // ECC: 6'b011101
+  parameter logic [15:0] C15 = 16'b0100010000111101; // ECC: 6'b011010
+  parameter logic [15:0] D15 = 16'b0101110011111101; // ECC: 6'b111110
 
 
   // The E/F values are used for the encoded ID state.
-  parameter logic [15:0] E0 = 16'b0001010001100001; // ECC: 6'b011111
-  parameter logic [15:0] F0 = 16'b0101111101100101; // ECC: 6'b111111
+  parameter logic [15:0] E0 = 16'b1110000000101100; // ECC: 6'b111001
+  parameter logic [15:0] F0 = 16'b1110010110111101; // ECC: 6'b111101
 
 
   ///////////////////////////////////////////
@@ -158,13 +158,13 @@
     128'h0
   };
   parameter logic [127:0] RndCnstRawUnlockToken = {
-    128'hB780BFD319A4E2E89805540CDDE5E04E
+    128'h1C8BE2FF12790AE2E6D6A68151CBD084
   };
   parameter logic [127:0] AllZeroTokenHashed = {
     128'h0
   };
   parameter logic [127:0] RndCnstRawUnlockTokenHashed = {
-    128'hB780BFD319A4E2E89805540CDDE5E04E
+    128'h1C8BE2FF12790AE2E6D6A68151CBD084
   };
 
 endpackage : lc_ctrl_state_pkg
diff --git a/hw/ip/otp_ctrl/rtl/otp_ctrl_part_pkg.sv b/hw/ip/otp_ctrl/rtl/otp_ctrl_part_pkg.sv
index 0ce3d47..9a87424 100644
--- a/hw/ip/otp_ctrl/rtl/otp_ctrl_part_pkg.sv
+++ b/hw/ip/otp_ctrl/rtl/otp_ctrl_part_pkg.sv
@@ -49,27 +49,27 @@
   } digest_sel_e;
 
   parameter key_array_t RndCnstKey = {
-    128'h111726B87A8DA7734528FE65ACF2E91C,
-    128'h299E94734DB9ADC6E4F933346ABB52C3,
-    128'h4B75748FF0382D870340676BD2414F29
+    128'h63E7BF615ABDA4C5EECB3771DA2139CE,
+    128'h5703C3EB2BB563689E00A67814EFBDE8,
+    128'h74FC825441343DA9273226119C9DD48B
   };
 
   // Note: digest set 0 is used for computing the partition digests. Constants at
   // higher indices are used to compute the scrambling keys.
   parameter digest_const_array_t RndCnstDigestConst = {
-    128'h8E0C348CA8E4395F0EFCA49A4E5EB112,
-    128'hC7E4407BD9F59142D45FA53EB0D0F448,
-    128'h33097F8516255FC2544E8ABF449BF43D,
-    128'h250EA46FD91AB2A83D5E6030EE24C8F2,
-    128'hAF9FA146B03363A90511ECF5677CAA8A
+    128'h9F1F413E87242971B6B52A656A1CAB7F,
+    128'h611704E34C28FA16828246F4644F54A7,
+    128'h39AED01B4B2277312E9480868216A281,
+    128'h1D888AC88259C44AAB06CB4A4C65A7EA,
+    128'h219BBD0AA479845504869E0D3A799D1E
   };
 
   parameter digest_iv_array_t RndCnstDigestIV = {
-    64'hD223F9F96B3AF018,
-    64'hA856DBEA82CE4F60,
-    64'h795369DD1E832668,
-    64'hB6CAD24622EEB3FC,
-    64'hD2367D979F3792E6
+    64'hEBF21E5BF1F45EDD,
+    64'h7CAD45B5C88E4548,
+    64'h97883548F536F544,
+    64'hC5F5C1D8AEF35040,
+    64'hEABF9A089852A3FA
   };
 
 
@@ -219,33 +219,33 @@
       192'h0
     }),
     960'({
-      64'h7A8F190A7B1D49A5,
-      256'h802C7A6E3D1C112059AE8F16A03C02CF9D80A110C00FE4A62422357CD36F3FC9,
-      256'h643B3F6AB70C8616D71DB2F32F19B944B7172CA9558B5AA504FF281CE77D9A44,
-      128'hE9260D8600B44DB3FC18B776639287E9
+      64'h1E2960279AB8F882,
+      256'hA991BEA2CF16541724A52D80A891BCD52BE973D4C5752E3A6912899150240B3A,
+      256'hD53651B6259AF2A4FB9DCA186AE168595B637FF7F7BF2E7C26917DDC15EB6827,
+      128'hA1AFEC939D240482026740905E57CA6C
     }),
     704'({
-      64'h61758EC952F1A1D,
-      128'hB40DCDFC699B861395454DACB648013D,
-      256'hCCF53B7AFA27198CE7E98FC2D1C99DDD9278BCA26D2B916BB12C647D32C9A4EF,
-      256'hBCC41D60D86650FD69951800D0E052B49C213B2BAEFBA438D579305E26ED25AF
+      64'h1D96CF9CAB089A9C,
+      128'hF80423F61EC116FD7CB3D374E7DF05B6,
+      256'h6C61869C02BC11008561BFB99BAFAFC47DED6F942A7014DD9A0656978D66A3C4,
+      256'h19617EDF0BD69B2320EA378AE9812F1F53911418BCBBCCCA9F4C41511001F6AD
     }),
     320'({
-      64'h46CAA9DDBB9EBC86,
-      128'h54C4BC30BA8D41DEE99396872E5F45DD,
-      128'hFF60D27A6D4879A390B7F9A66D065A09
+      64'h24DEEF385A7B3CA6,
+      128'h5869574E09B5710738066DCD7EF4BB9B,
+      128'hC48FDBD8A0031C11FA602470308055C4
     }),
     1664'({
-      64'hC7409D6C7A2009AE,
+      64'hABFF25A58087D34A,
       1344'h0,
-      256'hE50D60613825E913269174353E22EACF80BAA225DDFD1DE49ED083876F9B45F8
+      256'h37E5AE39A58FACEE41389646B3968A3B128F4AF0AFFC1AAC77ADEFF42376E09D
     }),
     6144'({
-      64'hEA1D657FDC80B705,
+      64'h523D5C06786AAC34,
       6080'h0
     }),
     6144'({
-      64'hFC8924E565C353A2,
+      64'hFA53B8058E157CB6,
       6080'h0
     })});
 
diff --git a/util/design/lib/LcStEnc.py b/util/design/lib/LcStEnc.py
index 980c982..f162300 100644
--- a/util/design/lib/LcStEnc.py
+++ b/util/design/lib/LcStEnc.py
@@ -11,6 +11,10 @@
 from lib.common import (check_int, ecc_encode, get_hd, hd_histogram,
                         is_valid_codeword, scatter_bits, random_or_hexvalue)
 
+# Seed diversification constant for LcStEnc (this enables to use
+# the same seed for different classes)
+LC_SEED_DIVERSIFIER = 1939944205722120255
+
 
 def _is_incremental_codeword(word1, word2):
     '''Test whether word2 is incremental wrt word1.'''
@@ -174,6 +178,9 @@
         log.info('Seed: {0:x}'.format(config['seed']))
         log.info('')
 
+        # Re-initialize with seed to make results reproducible.
+        random.seed(LC_SEED_DIVERSIFIER + int(config['seed']))
+
         config['secded']['data_width'] = check_int(
             config['secded']['data_width'])
         config['secded']['ecc_width'] = check_int(
@@ -232,9 +239,6 @@
 
         self.config = config
 
-        # Re-initialize with seed to make results reproducible.
-        random.seed(int(self.config['seed']))
-
         # Generate new encoding words
         word_types = ['ab_words', 'cd_words', 'ef_words']
         existing_words = []
diff --git a/util/design/lib/OtpMemMap.py b/util/design/lib/OtpMemMap.py
index ab5731a..0080c94 100644
--- a/util/design/lib/OtpMemMap.py
+++ b/util/design/lib/OtpMemMap.py
@@ -16,6 +16,10 @@
 DIGEST_SUFFIX = "_DIGEST"
 DIGEST_SIZE = 8
 
+# Seed diversification constant for OtpMemMap (this enables to use
+# the same seed for different classes)
+OTP_SEED_DIVERSIFIER = 177149201092001677687
+
 
 def _validate_otp(otp):
     '''Validate OTP entry'''
@@ -234,7 +238,7 @@
         config["seed"] = check_int(config["seed"])
 
         # Initialize RNG.
-        random.seed(int(config['seed']))
+        random.seed(OTP_SEED_DIVERSIFIER + int(config['seed']))
 
         if "otp" not in config:
             log.error("Missing otp configuration.")