[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.")