blob: 16897b61f5cf429dcd2af506701e4fc20aa34b6f [file]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Life cycle state encoding definition.
//
// DO NOT EDIT THIS FILE DIRECTLY.
// It has been generated with
// $ ./util/design/gen-lc-state-enc.py --seed 10167336684108184581
//
package lc_ctrl_state_pkg;
import prim_util_pkg::vbits;
///////////////////////////////
// General size declarations //
///////////////////////////////
parameter int LcValueWidth = 16;
parameter int NumLcStateValues = 20;
parameter int LcStateWidth = NumLcStateValues * LcValueWidth;
parameter int NumLcStates = 21;
parameter int DecLcStateWidth = vbits(NumLcStates);
// Redundant version used in the CSRs.
parameter int DecLcStateNumRep = 32/DecLcStateWidth;
parameter int ExtDecLcStateWidth = DecLcStateNumRep*DecLcStateWidth;
parameter int NumLcCountValues = 24;
parameter int LcCountWidth = NumLcCountValues * LcValueWidth;
parameter int NumLcCountStates = 25;
parameter int DecLcCountWidth = vbits(NumLcCountStates);
// This state is not stored in OTP, but inferred from the locked
// status of the secret partitions. Hence, only the decoded ID state
// is declared here for exposure through the CSR interface.
parameter int NumLcIdStates = 2;
parameter int DecLcIdStateWidth = vbits(NumLcIdStates+1);
// Redundant version used in the CSRs.
parameter int DecLcIdStateNumRep = 32/DecLcIdStateWidth;
parameter int ExtDecLcIdStateWidth = DecLcIdStateNumRep*DecLcIdStateWidth;
/////////////////////////////////////////////
// Life cycle manufacturing state encoding //
/////////////////////////////////////////////
// These values have been generated such that they are incrementally writeable with respect
// to the ECC polynomial specified. The values are used to define the life cycle manufacturing
// state and transition counter encoding in lc_ctrl_pkg.sv.
//
// The values are unique and have the following statistics (considering all 16
// data and 6 ECC bits):
//
// - Minimum Hamming weight: 8
// - Maximum Hamming weight: 16
// - Minimum Hamming distance from any other value: 6
// - Maximum Hamming distance from any other value: 20
//
// Hamming distance histogram:
//
// 0: --
// 1: --
// 2: --
// 3: --
// 4: --
// 5: --
// 6: ||| (5.85%)
// 7: --
// 8: ||||||||||| (17.40%)
// 9: --
// 10: |||||||||||||||||||| (29.60%)
// 11: --
// 12: ||||||||||||||||||| (29.21%)
// 13: --
// 14: ||||||||| (13.51%)
// 15: --
// 16: || (4.02%)
// 17: --
// 18: (0.37%)
// 19: --
// 20: (0.05%)
// 21: --
// 22: --
//
//
// Note that the ECC bits are not defined in this package as they will be calculated by
// the OTP ECC logic at runtime.
// SEC_CM: MANUF.STATE.SPARSE
// The A/B values are used for the encoded LC state.
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'b1100011000100110; // ECC: 6'b101001
parameter logic [15:0] B1 = 16'b1101111101101110; // ECC: 6'b101011
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'b0001100111101000; // ECC: 6'b000100
parameter logic [15:0] B3 = 16'b1101101111101100; // ECC: 6'b001101
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'b0001011000010110; // ECC: 6'b111001
parameter logic [15:0] B5 = 16'b1011011001110111; // ECC: 6'b111101
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'b0010001001011111; // ECC: 6'b011000
parameter logic [15:0] B7 = 16'b0011101011111111; // ECC: 6'b011101
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'b1100100101111000; // ECC: 6'b010010
parameter logic [15:0] B9 = 16'b1111101101111001; // ECC: 6'b011110
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'b1011000100000111; // ECC: 6'b011001
parameter logic [15:0] B11 = 16'b1111110110000111; // ECC: 6'b011111
parameter logic [15:0] A12 = 16'b0011100000010000; // ECC: 6'b111001
parameter logic [15:0] B12 = 16'b1111100100110000; // ECC: 6'b111111
parameter logic [15:0] A13 = 16'b0011000010101011; // ECC: 6'b100110
parameter logic [15:0] B13 = 16'b1011010011111011; // ECC: 6'b111110
parameter logic [15:0] A14 = 16'b0011110100100000; // ECC: 6'b011000
parameter logic [15:0] B14 = 16'b0011111101101011; // ECC: 6'b011100
parameter logic [15:0] A15 = 16'b1010101100010010; // ECC: 6'b111000
parameter logic [15:0] B15 = 16'b1111111110011010; // ECC: 6'b111010
parameter logic [15:0] A16 = 16'b0100011010010100; // ECC: 6'b110110
parameter logic [15:0] B16 = 16'b0101111110010111; // ECC: 6'b111110
parameter logic [15:0] A17 = 16'b1011111110000101; // ECC: 6'b000000
parameter logic [15:0] B17 = 16'b1011111111010111; // ECC: 6'b000111
parameter logic [15:0] A18 = 16'b1110010000010111; // ECC: 6'b010100
parameter logic [15:0] B18 = 16'b1111110010111111; // ECC: 6'b010110
parameter logic [15:0] A19 = 16'b0100100101011010; // ECC: 6'b001000
parameter logic [15:0] B19 = 16'b1110100111111111; // ECC: 6'b001101
// SEC_CM: TRANSITION.CTR.SPARSE
// The C/D values are used for the encoded LC transition counter.
parameter logic [15:0] C0 = 16'b0000110000011011; // ECC: 6'b110110
parameter logic [15:0] D0 = 16'b0011111000011111; // ECC: 6'b111111
parameter logic [15:0] C1 = 16'b0111001100010100; // ECC: 6'b011001
parameter logic [15:0] D1 = 16'b1111101101110110; // ECC: 6'b111001
parameter logic [15:0] C2 = 16'b0001101110100010; // ECC: 6'b100011
parameter logic [15:0] D2 = 16'b0011111111100011; // ECC: 6'b110111
parameter logic [15:0] C3 = 16'b0000110101000010; // ECC: 6'b111101
parameter logic [15:0] D3 = 16'b1100110111010110; // ECC: 6'b111111
parameter logic [15:0] C4 = 16'b0001111111010001; // ECC: 6'b000010
parameter logic [15:0] D4 = 16'b0001111111111001; // ECC: 6'b101111
parameter logic [15:0] C5 = 16'b0010010000110000; // ECC: 6'b111111
parameter logic [15:0] D5 = 16'b0111011100110101; // ECC: 6'b111111
parameter logic [15:0] C6 = 16'b0010111010001111; // ECC: 6'b001000
parameter logic [15:0] D6 = 16'b1011111010111111; // ECC: 6'b101100
parameter logic [15:0] C7 = 16'b0100010000111101; // ECC: 6'b011010
parameter logic [15:0] D7 = 16'b0101110011111101; // ECC: 6'b111110
parameter logic [15:0] C8 = 16'b1110000000101100; // ECC: 6'b111001
parameter logic [15:0] D8 = 16'b1110010110111101; // ECC: 6'b111101
parameter logic [15:0] C9 = 16'b0010011100101110; // ECC: 6'b010001
parameter logic [15:0] D9 = 16'b1011011110101111; // ECC: 6'b111001
parameter logic [15:0] C10 = 16'b0010110011101110; // ECC: 6'b000100
parameter logic [15:0] D10 = 16'b1010111011111110; // ECC: 6'b110110
parameter logic [15:0] C11 = 16'b1100000100010011; // ECC: 6'b000011
parameter logic [15:0] D11 = 16'b1110000110011011; // ECC: 6'b111011
parameter logic [15:0] C12 = 16'b1000110110101101; // ECC: 6'b000010
parameter logic [15:0] D12 = 16'b1001111110111101; // ECC: 6'b010111
parameter logic [15:0] C13 = 16'b0000011111001011; // ECC: 6'b001010
parameter logic [15:0] D13 = 16'b1001111111001111; // ECC: 6'b111010
parameter logic [15:0] C14 = 16'b1101001001001010; // ECC: 6'b110100
parameter logic [15:0] D14 = 16'b1101001011101111; // ECC: 6'b110111
parameter logic [15:0] C15 = 16'b0001100011110101; // ECC: 6'b100010
parameter logic [15:0] D15 = 16'b0011110011110111; // ECC: 6'b111011
parameter logic [15:0] C16 = 16'b1000001110100011; // ECC: 6'b010110
parameter logic [15:0] D16 = 16'b1100111111101111; // ECC: 6'b010110
parameter logic [15:0] C17 = 16'b0100110101010001; // ECC: 6'b100110
parameter logic [15:0] D17 = 16'b1111110101010011; // ECC: 6'b110111
parameter logic [15:0] C18 = 16'b1010010000101010; // ECC: 6'b100001
parameter logic [15:0] D18 = 16'b1010011111101110; // ECC: 6'b100011
parameter logic [15:0] C19 = 16'b0001111001110000; // ECC: 6'b101010
parameter logic [15:0] D19 = 16'b0111111111110011; // ECC: 6'b101010
parameter logic [15:0] C20 = 16'b0010101001111110; // ECC: 6'b100000
parameter logic [15:0] D20 = 16'b0110101111111110; // ECC: 6'b110101
parameter logic [15:0] C21 = 16'b1001000011110000; // ECC: 6'b000011
parameter logic [15:0] D21 = 16'b1001001011111101; // ECC: 6'b001111
parameter logic [15:0] C22 = 16'b0101101010000001; // ECC: 6'b110110
parameter logic [15:0] D22 = 16'b1111101010010101; // ECC: 6'b111111
parameter logic [15:0] C23 = 16'b1101000100101110; // ECC: 6'b110000
parameter logic [15:0] D23 = 16'b1111100110101110; // ECC: 6'b111110
parameter logic [15:0] ZRO = 16'h0;
////////////////////////
// Derived enum types //
////////////////////////
// Use lc_state_t and lc_cnt_t in interfaces as very wide enumerations ( > 64 bits )
// are not supported for virtual interfaces by Excelium yet
// https://github.com/lowRISC/opentitan/issues/8884 (Cadence issue: cds_46570160)
// The enumeration types lc_state_e and lc_cnt_e are still ok in other circumstances
typedef logic [LcStateWidth-1:0] lc_state_t;
typedef enum lc_state_t {
LcStRaw = {ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO},
LcStTestUnlocked0 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, A8, A7, A6, A5, A4, A3, A2, A1, B0},
LcStTestLocked0 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, A8, A7, A6, A5, A4, A3, A2, B1, B0},
LcStTestUnlocked1 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, A8, A7, A6, A5, A4, A3, B2, B1, B0},
LcStTestLocked1 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, A8, A7, A6, A5, A4, B3, B2, B1, B0},
LcStTestUnlocked2 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, A8, A7, A6, A5, B4, B3, B2, B1, B0},
LcStTestLocked2 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, A8, A7, A6, B5, B4, B3, B2, B1, B0},
LcStTestUnlocked3 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, A8, A7, B6, B5, B4, B3, B2, B1, B0},
LcStTestLocked3 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, A8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStTestUnlocked4 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, A9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStTestLocked4 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, A10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStTestUnlocked5 = {A19, A18, A17, A16, A15, A14, A13, A12, A11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStTestLocked5 = {A19, A18, A17, A16, A15, A14, A13, A12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStTestUnlocked6 = {A19, A18, A17, A16, A15, A14, A13, B12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStTestLocked6 = {A19, A18, A17, A16, A15, A14, B13, B12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStTestUnlocked7 = {A19, A18, A17, A16, A15, B14, B13, B12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStDev = {A19, A18, A17, A16, B15, B14, B13, B12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStProd = {A19, A18, A17, B16, A15, B14, B13, B12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStProdEnd = {A19, A18, B17, A16, A15, B14, B13, B12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStRma = {B19, B18, A17, B16, B15, B14, B13, B12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
LcStScrap = {B19, B18, B17, B16, B15, B14, B13, B12, B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0}
} lc_state_e;
typedef logic [LcCountWidth-1:0] lc_cnt_t;
typedef enum lc_cnt_t {
LcCnt0 = {ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO},
LcCnt1 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, C4, C3, C2, C1, D0},
LcCnt2 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, C4, C3, C2, D1, D0},
LcCnt3 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, C4, C3, D2, D1, D0},
LcCnt4 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, C4, D3, D2, D1, D0},
LcCnt5 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, D4, D3, D2, D1, D0},
LcCnt6 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, D5, D4, D3, D2, D1, D0},
LcCnt7 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, C8, C7, D6, D5, D4, D3, D2, D1, D0},
LcCnt8 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, C8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt9 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, C9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt10 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, C10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt11 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, C11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt12 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, C12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt13 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, C13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt14 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, C14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt15 = {C23, C22, C21, C20, C19, C18, C17, C16, C15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt16 = {C23, C22, C21, C20, C19, C18, C17, C16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt17 = {C23, C22, C21, C20, C19, C18, C17, D16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt18 = {C23, C22, C21, C20, C19, C18, D17, D16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt19 = {C23, C22, C21, C20, C19, D18, D17, D16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt20 = {C23, C22, C21, C20, D19, D18, D17, D16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt21 = {C23, C22, C21, D20, D19, D18, D17, D16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt22 = {C23, C22, D21, D20, D19, D18, D17, D16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt23 = {C23, D22, D21, D20, D19, D18, D17, D16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
LcCnt24 = {D23, D22, D21, D20, D19, D18, D17, D16, D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0}
} lc_cnt_e;
// Decoded life cycle state, used to interface with CSRs and TAP.
typedef enum logic [DecLcStateWidth-1:0] {
DecLcStRaw = 0,
DecLcStTestUnlocked0 = 1,
DecLcStTestLocked0 = 2,
DecLcStTestUnlocked1 = 3,
DecLcStTestLocked1 = 4,
DecLcStTestUnlocked2 = 5,
DecLcStTestLocked2 = 6,
DecLcStTestUnlocked3 = 7,
DecLcStTestLocked3 = 8,
DecLcStTestUnlocked4 = 9,
DecLcStTestLocked4 = 10,
DecLcStTestUnlocked5 = 11,
DecLcStTestLocked5 = 12,
DecLcStTestUnlocked6 = 13,
DecLcStTestLocked6 = 14,
DecLcStTestUnlocked7 = 15,
DecLcStDev = 16,
DecLcStProd = 17,
DecLcStProdEnd = 18,
DecLcStRma = 19,
DecLcStScrap = 20,
DecLcStPostTrans = 21,
DecLcStEscalate = 22,
DecLcStInvalid = 23
} dec_lc_state_e;
typedef dec_lc_state_e [DecLcStateNumRep-1:0] ext_dec_lc_state_t;
typedef enum logic [DecLcIdStateWidth-1:0] {
DecLcIdBlank,
DecLcIdPersonalized,
DecLcIdInvalid
} dec_lc_id_state_e;
typedef logic [DecLcCountWidth-1:0] dec_lc_cnt_t;
///////////////////////////////////////////
// Hashed RAW unlock and all-zero tokens //
///////////////////////////////////////////
parameter int LcTokenWidth = 128;
typedef logic [LcTokenWidth-1:0] lc_token_t;
parameter lc_token_t AllZeroToken = {
128'h0
};
parameter lc_token_t RndCnstRawUnlockToken = {
128'h1C8BE2FF12790AE2E6D6A68151CBD084
};
parameter lc_token_t AllZeroTokenHashed = {
128'h3852305BAECF5FF1D5C1D25F6DB9058D
};
parameter lc_token_t RndCnstRawUnlockTokenHashed = {
128'hDEC8CCA47526BC0793AF7BB7560DD5A2
};
endpackage : lc_ctrl_state_pkg