[lc_ctrl] Increase number of test states from 4 to 8
Signed-off-by: Michael Schaffner <msf@opentitan.org>
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_pkg.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_pkg.sv
index 39a42c4..83de6c6 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_pkg.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_pkg.sv
@@ -102,89 +102,77 @@
// Manufacturing State Transition Matrix //
///////////////////////////////////////////
+ // Helper macro to assemble the token index matrix below.
+ // From TEST_UNLOCKED(N)
+ // -> SCRAP, RMA
+ // -> PROD, PROD_END, DEV
+ // -> TEST_UNLOCKED(N+1)-7
+ // -> TEST_LOCKED(N)-6
+ // -> TEST_UNLOCKED0-(N), RAW
+ `define TEST_UNLOCKED(idx) \
+ {2{ZeroTokenIdx}}, \
+ {3{TestExitTokenIdx}}, \
+ {(7-idx){InvalidTokenIdx, \
+ ZeroTokenIdx}}, \
+ {(2*idx+2){InvalidTokenIdx}}
+
+ // Helper macro to assemble the token index matrix below.
+ // From TEST_LOCKED(N)
+ // -> SCRAP
+ // -> RMA
+ // -> PROD, PROD_END, DEV
+ // -> TEST_UNLOCKED(N+1)-7
+ // -> TEST_LOCKED(N)-6
+ // -> TEST_UNLOCKED0-(N), RAW
+ `define TEST_LOCKED(idx) \
+ ZeroTokenIdx, \
+ InvalidTokenIdx, \
+ {3{TestExitTokenIdx}}, \
+ {(7-idx){TestUnlockTokenIdx, \
+ InvalidTokenIdx}}, \
+ {(2*idx+2){InvalidTokenIdx}}
+
// The token index matrix below encodes 1) which transition edges are valid and 2) which token
// to use for a given transition edge. Note that unconditional but otherwise valid transitions
// are assigned the ZeroTokenIdx, whereas invalid transitions are assigned an InvalidTokenIdx.
parameter token_idx_e [NumLcStates-1:0][NumLcStates-1:0] TransTokenIdxMatrix = {
// SCRAP
- {13{InvalidTokenIdx}}, // -> TEST_LOCKED0-2, TEST_UNLOCKED0-3, DEV, PROD, PROD_END, RMA, SCRAP
+ {21{InvalidTokenIdx}}, // -> TEST_LOCKED0-6, TEST_UNLOCKED0-7, DEV, PROD, PROD_END, RMA, SCRAP
// RMA
ZeroTokenIdx, // -> SCRAP
- {12{InvalidTokenIdx}}, // -> TEST_LOCKED0-2, TEST_UNLOCKED0-3, DEV, PROD, PROD_END, RMA
+ {20{InvalidTokenIdx}}, // -> TEST_LOCKED0-6, TEST_UNLOCKED0-7, DEV, PROD, PROD_END, RMA
// PROD_END
ZeroTokenIdx, // -> SCRAP
- {12{InvalidTokenIdx}}, // -> TEST_LOCKED0-2, TEST_UNLOCKED0-3, DEV, PROD, PROD_END, RMA
+ {20{InvalidTokenIdx}}, // -> TEST_LOCKED0-6, TEST_UNLOCKED0-7, DEV, PROD, PROD_END, RMA
// PROD
ZeroTokenIdx, // -> SCRAP
RmaTokenIdx, // -> RMA
- {11{InvalidTokenIdx}}, // -> TEST_LOCKED0-2, TEST_UNLOCKED0-3, DEV, PROD, PROD_END
+ {19{InvalidTokenIdx}}, // -> TEST_LOCKED0-6, TEST_UNLOCKED0-7, DEV, PROD, PROD_END
// DEV
ZeroTokenIdx, // -> SCRAP
RmaTokenIdx, // -> RMA
- {11{InvalidTokenIdx}}, // -> TEST_LOCKED0-2, TEST_UNLOCKED0-3, DEV, PROD, PROD_END
- // TEST_UNLOCKED3
- {2{ZeroTokenIdx}}, // -> SCRAP, RMA
- {3{TestExitTokenIdx}}, // -> PROD, PROD_END, DEV
- {8{InvalidTokenIdx}}, // -> TEST_LOCKED0-2, TEST_UNLOCKED0-3, RAW
- // TEST_LOCKED2
- ZeroTokenIdx, // -> SCRAP
- InvalidTokenIdx, // -> RMA
- {3{TestExitTokenIdx}}, // -> PROD, PROD_END, DEV
- TestUnlockTokenIdx, // -> TEST_UNLOCKED3
- {7{InvalidTokenIdx}}, // -> TEST_LOCKED0-2, TEST_UNLOCKED0-2, RAW
- // TEST_UNLOCKED2
- {2{ZeroTokenIdx}}, // -> SCRAP, RMA
- {3{TestExitTokenIdx}}, // -> PROD, PROD_END, DEV
- InvalidTokenIdx, // -> TEST_UNLOCKED3
- ZeroTokenIdx, // -> TEST_LOCKED2
- {6{InvalidTokenIdx}}, // -> TEST_LOCKED0-1, TEST_UNLOCKED0-2, RAW
- // TEST_LOCKED1
- ZeroTokenIdx, // -> SCRAP
- InvalidTokenIdx, // -> RMA
- {3{TestExitTokenIdx}}, // -> PROD, PROD_END, DEV
- TestUnlockTokenIdx, // -> TEST_UNLOCKED3
- InvalidTokenIdx , // -> TEST_LOCKED2
- TestUnlockTokenIdx, // -> TEST_UNLOCKED2
- {5{InvalidTokenIdx}}, // -> TEST_LOCKED0-1, TEST_UNLOCKED0-1, RAW
- // TEST_UNLOCKED1
- {2{ZeroTokenIdx}}, // -> SCRAP, RMA
- {3{TestExitTokenIdx}}, // -> PROD, PROD_END, DEV
- InvalidTokenIdx, // -> TEST_UNLOCKED3
- ZeroTokenIdx, // -> TEST_LOCKED2
- InvalidTokenIdx, // -> TEST_UNLOCKED2
- ZeroTokenIdx, // -> TEST_LOCKED1
- {4{InvalidTokenIdx}}, // -> TEST_LOCKED0, TEST_UNLOCKED0-1, RAW
- // TEST_LOCKED0
- ZeroTokenIdx, // -> SCRAP
- InvalidTokenIdx, // -> RMA
- {3{TestExitTokenIdx}}, // -> PROD, PROD_END, DEV
- TestUnlockTokenIdx, // -> TEST_UNLOCKED3
- InvalidTokenIdx, // -> TEST_LOCKED2
- TestUnlockTokenIdx, // -> TEST_UNLOCKED2
- InvalidTokenIdx, // -> TEST_LOCKED1
- TestUnlockTokenIdx, // -> TEST_UNLOCKED1
- {3{InvalidTokenIdx}}, // -> TEST_LOCKED0, TEST_UNLOCKED0, RAW
- // TEST_UNLOCKED0
- {2{ZeroTokenIdx}}, // -> SCRAP, RMA
- {3{TestExitTokenIdx}}, // -> PROD, PROD_END, DEV
- InvalidTokenIdx, // -> TEST_UNLOCKED3
- ZeroTokenIdx, // -> TEST_LOCKED2
- InvalidTokenIdx, // -> TEST_UNLOCKED2
- ZeroTokenIdx, // -> TEST_LOCKED1
- InvalidTokenIdx, // -> TEST_UNLOCKED1
- ZeroTokenIdx, // -> TEST_LOCKED0
- {2{InvalidTokenIdx}}, // -> TEST_UNLOCKED0, RAW
+ {19{InvalidTokenIdx}}, // -> TEST_LOCKED0-6, TEST_UNLOCKED0-7, DEV, PROD, PROD_END
+ // TEST_UNLOCKED0-7, TEST_LOCKED0-6
+ `TEST_UNLOCKED(7),
+ `TEST_LOCKED(6),
+ `TEST_UNLOCKED(6),
+ `TEST_LOCKED(5),
+ `TEST_UNLOCKED(5),
+ `TEST_LOCKED(4),
+ `TEST_UNLOCKED(4),
+ `TEST_LOCKED(3),
+ `TEST_UNLOCKED(3),
+ `TEST_LOCKED(2),
+ `TEST_UNLOCKED(2),
+ `TEST_LOCKED(1),
+ `TEST_UNLOCKED(1),
+ `TEST_LOCKED(0),
+ `TEST_UNLOCKED(0),
// RAW
ZeroTokenIdx, // -> SCRAP
{4{InvalidTokenIdx}}, // -> RMA, PROD, PROD_END, DEV
- RawUnlockTokenIdx, // -> TEST_UNLOCKED3
- InvalidTokenIdx, // -> TEST_LOCKED2
- RawUnlockTokenIdx, // -> TEST_UNLOCKED2
- InvalidTokenIdx, // -> TEST_LOCKED1
- RawUnlockTokenIdx, // -> TEST_UNLOCKED1
- InvalidTokenIdx, // -> TEST_LOCKED0
- RawUnlockTokenIdx, // -> TEST_UNLOCKED0
- InvalidTokenIdx // -> RAW
+ {8{RawUnlockTokenIdx, // -> TEST_UNLOCKED0-7
+ InvalidTokenIdx}} // -> RAW, TEST_LOCKED0-6
};
endpackage : lc_ctrl_pkg
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv
index fcbedfc..d3e1536 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_pkg.sv
@@ -8,7 +8,7 @@
// Param list
parameter int NumTokenWords = 4;
- parameter int CsrLcStateWidth = 4;
+ parameter int CsrLcStateWidth = 5;
parameter int CsrLcCountWidth = 5;
parameter int CsrLcIdStateWidth = 2;
parameter int CsrOtpTestCtrlWidth = 8;
@@ -53,7 +53,7 @@
} lc_ctrl_reg2hw_transition_token_mreg_t;
typedef struct packed {
- logic [3:0] q;
+ logic [4:0] q;
logic qe;
} lc_ctrl_reg2hw_transition_target_reg_t;
@@ -114,7 +114,7 @@
} lc_ctrl_hw2reg_transition_token_mreg_t;
typedef struct packed {
- logic [3:0] d;
+ logic [4:0] d;
} lc_ctrl_hw2reg_transition_target_reg_t;
typedef struct packed {
@@ -127,7 +127,7 @@
} lc_ctrl_hw2reg_otp_test_ctrl_reg_t;
typedef struct packed {
- logic [3:0] d;
+ logic [4:0] d;
} lc_ctrl_hw2reg_lc_state_reg_t;
typedef struct packed {
@@ -144,23 +144,23 @@
// Register -> HW type
typedef struct packed {
- lc_ctrl_reg2hw_alert_test_reg_t alert_test; // [164:159]
- lc_ctrl_reg2hw_claim_transition_if_reg_t claim_transition_if; // [158:150]
- lc_ctrl_reg2hw_transition_cmd_reg_t transition_cmd; // [149:148]
- lc_ctrl_reg2hw_transition_token_mreg_t [3:0] transition_token; // [147:16]
- lc_ctrl_reg2hw_transition_target_reg_t transition_target; // [15:11]
+ lc_ctrl_reg2hw_alert_test_reg_t alert_test; // [165:160]
+ lc_ctrl_reg2hw_claim_transition_if_reg_t claim_transition_if; // [159:151]
+ lc_ctrl_reg2hw_transition_cmd_reg_t transition_cmd; // [150:149]
+ lc_ctrl_reg2hw_transition_token_mreg_t [3:0] transition_token; // [148:17]
+ lc_ctrl_reg2hw_transition_target_reg_t transition_target; // [16:11]
lc_ctrl_reg2hw_otp_test_ctrl_reg_t otp_test_ctrl; // [10:0]
} lc_ctrl_reg2hw_t;
// HW -> register type
typedef struct packed {
- lc_ctrl_hw2reg_status_reg_t status; // [426:417]
- lc_ctrl_hw2reg_claim_transition_if_reg_t claim_transition_if; // [416:409]
- lc_ctrl_hw2reg_transition_regwen_reg_t transition_regwen; // [408:408]
- lc_ctrl_hw2reg_transition_token_mreg_t [3:0] transition_token; // [407:280]
- lc_ctrl_hw2reg_transition_target_reg_t transition_target; // [279:276]
- lc_ctrl_hw2reg_otp_test_ctrl_reg_t otp_test_ctrl; // [275:267]
- lc_ctrl_hw2reg_lc_state_reg_t lc_state; // [266:263]
+ lc_ctrl_hw2reg_status_reg_t status; // [428:419]
+ lc_ctrl_hw2reg_claim_transition_if_reg_t claim_transition_if; // [418:411]
+ lc_ctrl_hw2reg_transition_regwen_reg_t transition_regwen; // [410:410]
+ lc_ctrl_hw2reg_transition_token_mreg_t [3:0] transition_token; // [409:282]
+ lc_ctrl_hw2reg_transition_target_reg_t transition_target; // [281:277]
+ lc_ctrl_hw2reg_otp_test_ctrl_reg_t otp_test_ctrl; // [276:268]
+ lc_ctrl_hw2reg_lc_state_reg_t lc_state; // [267:263]
lc_ctrl_hw2reg_lc_transition_cnt_reg_t lc_transition_cnt; // [262:258]
lc_ctrl_hw2reg_lc_id_state_reg_t lc_id_state; // [257:256]
lc_ctrl_hw2reg_device_id_mreg_t [7:0] device_id; // [255:0]
@@ -204,9 +204,9 @@
parameter logic [31:0] LC_CTRL_TRANSITION_TOKEN_1_RESVAL = 32'h 0;
parameter logic [31:0] LC_CTRL_TRANSITION_TOKEN_2_RESVAL = 32'h 0;
parameter logic [31:0] LC_CTRL_TRANSITION_TOKEN_3_RESVAL = 32'h 0;
- parameter logic [3:0] LC_CTRL_TRANSITION_TARGET_RESVAL = 4'h 0;
+ parameter logic [4:0] LC_CTRL_TRANSITION_TARGET_RESVAL = 5'h 0;
parameter logic [16:0] LC_CTRL_OTP_TEST_CTRL_RESVAL = 17'h 0;
- parameter logic [3:0] LC_CTRL_LC_STATE_RESVAL = 4'h 0;
+ parameter logic [4:0] LC_CTRL_LC_STATE_RESVAL = 5'h 0;
parameter logic [4:0] LC_CTRL_LC_TRANSITION_CNT_RESVAL = 5'h 0;
parameter logic [1:0] LC_CTRL_LC_ID_STATE_RESVAL = 2'h 0;
parameter logic [31:0] LC_CTRL_DEVICE_ID_0_RESVAL = 32'h 0;
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_top.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_top.sv
index 0bac7bf..b594b3f 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_top.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_reg_top.sv
@@ -145,8 +145,8 @@
logic [31:0] transition_token_3_wd;
logic transition_target_re;
logic transition_target_we;
- logic [3:0] transition_target_qs;
- logic [3:0] transition_target_wd;
+ logic [4:0] transition_target_qs;
+ logic [4:0] transition_target_wd;
logic otp_test_ctrl_re;
logic otp_test_ctrl_we;
logic [7:0] otp_test_ctrl_val_qs;
@@ -154,7 +154,7 @@
logic otp_test_ctrl_ext_clock_qs;
logic otp_test_ctrl_ext_clock_wd;
logic lc_state_re;
- logic [3:0] lc_state_qs;
+ logic [4:0] lc_state_qs;
logic lc_transition_cnt_re;
logic [4:0] lc_transition_cnt_qs;
logic lc_id_state_re;
@@ -493,7 +493,7 @@
// R[transition_target]: V(True)
prim_subreg_ext #(
- .DW (4)
+ .DW (5)
) u_transition_target (
.re (transition_target_re),
.we (transition_target_we & transition_regwen_qs),
@@ -541,7 +541,7 @@
// R[lc_state]: V(True)
prim_subreg_ext #(
- .DW (4)
+ .DW (5)
) u_lc_state (
.re (lc_state_re),
.we (1'b0),
@@ -808,7 +808,7 @@
assign transition_target_re = addr_hit[9] & reg_re & !reg_error;
assign transition_target_we = addr_hit[9] & reg_we & !reg_error;
- assign transition_target_wd = reg_wdata[3:0];
+ assign transition_target_wd = reg_wdata[4:0];
assign otp_test_ctrl_re = addr_hit[10] & reg_re & !reg_error;
assign otp_test_ctrl_we = addr_hit[10] & reg_we & !reg_error;
@@ -879,7 +879,7 @@
end
addr_hit[9]: begin
- reg_rdata_next[3:0] = transition_target_qs;
+ reg_rdata_next[4:0] = transition_target_qs;
end
addr_hit[10]: begin
@@ -888,7 +888,7 @@
end
addr_hit[11]: begin
- reg_rdata_next[3:0] = lc_state_qs;
+ reg_rdata_next[4:0] = lc_state_qs;
end
addr_hit[12]: begin
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_signal_decode.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_signal_decode.sv
index f5080b1..a569db8 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_signal_decode.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_signal_decode.sv
@@ -91,7 +91,11 @@
LcStRaw,
LcStTestLocked0,
LcStTestLocked1,
- LcStTestLocked2: begin
+ LcStTestLocked2,
+ LcStTestLocked3,
+ LcStTestLocked4,
+ LcStTestLocked5,
+ LcStTestLocked6: begin
lc_test_or_rma = On;
end
///////////////////////////////////////////////////////////////////
@@ -100,7 +104,11 @@
LcStTestUnlocked0,
LcStTestUnlocked1,
LcStTestUnlocked2,
- LcStTestUnlocked3: begin
+ LcStTestUnlocked3,
+ LcStTestUnlocked4,
+ LcStTestUnlocked5,
+ LcStTestUnlocked6,
+ LcStTestUnlocked7: begin
lc_test_or_rma = On;
lc_dft_en = On;
lc_nvm_debug_en = On;
@@ -343,12 +351,20 @@
PostTransSt} &&
!(lc_state_i inside {LcStRaw,
LcStTestUnlocked0,
- LcStTestLocked0,
LcStTestUnlocked1,
- LcStTestLocked1,
LcStTestUnlocked2,
- LcStTestLocked2,
LcStTestUnlocked3,
+ LcStTestUnlocked4,
+ LcStTestUnlocked5,
+ LcStTestUnlocked6,
+ LcStTestUnlocked7,
+ LcStTestLocked0,
+ LcStTestLocked1,
+ LcStTestLocked2,
+ LcStTestLocked3,
+ LcStTestLocked4,
+ LcStTestLocked5,
+ LcStTestLocked6,
LcStDev,
LcStProd,
LcStProdEnd,
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_decode.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_decode.sv
index d8f8d6f..250a02f 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_decode.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_decode.sv
@@ -63,6 +63,14 @@
LcStTestUnlocked2: dec_lc_state_o = DecLcStTestUnlocked2;
LcStTestLocked2: dec_lc_state_o = DecLcStTestLocked2;
LcStTestUnlocked3: dec_lc_state_o = DecLcStTestUnlocked3;
+ LcStTestLocked3: dec_lc_state_o = DecLcStTestLocked3;
+ LcStTestUnlocked4: dec_lc_state_o = DecLcStTestUnlocked4;
+ LcStTestLocked4: dec_lc_state_o = DecLcStTestLocked4;
+ LcStTestUnlocked5: dec_lc_state_o = DecLcStTestUnlocked5;
+ LcStTestLocked5: dec_lc_state_o = DecLcStTestLocked5;
+ LcStTestUnlocked6: dec_lc_state_o = DecLcStTestUnlocked6;
+ LcStTestLocked6: dec_lc_state_o = DecLcStTestLocked6;
+ LcStTestUnlocked7: dec_lc_state_o = DecLcStTestUnlocked7;
LcStDev: dec_lc_state_o = DecLcStDev;
LcStProd: dec_lc_state_o = DecLcStProd;
LcStProdEnd: dec_lc_state_o = DecLcStProdEnd;
@@ -89,6 +97,14 @@
LcCnt14: dec_lc_cnt_o = 5'd14;
LcCnt15: dec_lc_cnt_o = 5'd15;
LcCnt16: dec_lc_cnt_o = 5'd16;
+ LcCnt17: dec_lc_cnt_o = 5'd17;
+ LcCnt18: dec_lc_cnt_o = 5'd18;
+ LcCnt19: dec_lc_cnt_o = 5'd19;
+ LcCnt20: dec_lc_cnt_o = 5'd20;
+ LcCnt21: dec_lc_cnt_o = 5'd21;
+ LcCnt22: dec_lc_cnt_o = 5'd22;
+ LcCnt23: dec_lc_cnt_o = 5'd23;
+ LcCnt24: dec_lc_cnt_o = 5'd24;
default: state_invalid_error_o = 1'b1;
endcase // lc_cnt_i
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 cc4177e..983ff5d 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv
@@ -18,14 +18,14 @@
parameter int LcValueWidth = 16;
- parameter int NumLcStateValues = 12;
+ parameter int NumLcStateValues = 20;
parameter int LcStateWidth = NumLcStateValues * LcValueWidth;
- parameter int NumLcStates = 13;
+ parameter int NumLcStates = 21;
parameter int DecLcStateWidth = vbits(NumLcStates);
- parameter int NumLcCountValues = 16;
+ parameter int NumLcCountValues = 24;
parameter int LcCountWidth = NumLcCountValues * LcValueWidth;
- parameter int NumLcCountStates = 17;
+ parameter int NumLcCountStates = 25;
parameter int DecLcCountWidth = vbits(NumLcCountStates);
// This state is not stored in OTP, but inferred from the locked
@@ -48,7 +48,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:
//
@@ -58,21 +58,21 @@
// 3: --
// 4: --
// 5: --
- // 6: |||| (6.95%)
+ // 6: ||| (5.85%)
// 7: --
- // 8: |||||||||| (16.36%)
+ // 8: ||||||||||| (17.40%)
// 9: --
- // 10: ||||||||||||||||||| (29.22%)
+ // 10: |||||||||||||||||||| (29.60%)
// 11: --
- // 12: |||||||||||||||||||| (29.81%)
+ // 12: ||||||||||||||||||| (29.21%)
// 13: --
- // 14: |||||||| (13.18%)
+ // 14: ||||||||| (13.51%)
// 15: --
- // 16: || (4.16%)
+ // 16: || (4.02%)
// 17: --
- // 18: (0.32%)
+ // 18: (0.37%)
// 19: --
- // 20: --
+ // 20: (0.05%)
// 21: --
// 22: --
//
@@ -117,55 +117,103 @@
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
+
// The C/D values are used for the encoded LC transition counter.
- parameter logic [15:0] C0 = 16'b0011100000010000; // ECC: 6'b111001
- parameter logic [15:0] D0 = 16'b1111100100110000; // ECC: 6'b111111
+ 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'b0011000010101011; // ECC: 6'b100110
- parameter logic [15:0] D1 = 16'b1011010011111011; // ECC: 6'b111110
+ 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'b0011110100100000; // ECC: 6'b011000
- parameter logic [15:0] D2 = 16'b0011111101101011; // ECC: 6'b011100
+ 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'b1010101100010010; // ECC: 6'b111000
- parameter logic [15:0] D3 = 16'b1111111110011010; // ECC: 6'b111010
+ 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'b0100011010010100; // ECC: 6'b110110
- parameter logic [15:0] D4 = 16'b0101111110010111; // ECC: 6'b111110
+ 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'b1011111110000101; // ECC: 6'b000000
- parameter logic [15:0] D5 = 16'b1011111111010111; // ECC: 6'b000111
+ 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'b1110010000010111; // ECC: 6'b010100
- parameter logic [15:0] D6 = 16'b1111110010111111; // ECC: 6'b010110
+ 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'b0100100101011010; // ECC: 6'b001000
- parameter logic [15:0] D7 = 16'b1110100111111111; // ECC: 6'b001101
+ 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'b0000110000011011; // ECC: 6'b110110
- parameter logic [15:0] D8 = 16'b0011111000011111; // ECC: 6'b111111
+ 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'b0111001100010100; // ECC: 6'b011001
- parameter logic [15:0] D9 = 16'b1111101101110110; // ECC: 6'b111001
+ 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'b0001101110100010; // ECC: 6'b100011
- parameter logic [15:0] D10 = 16'b0011111111100011; // ECC: 6'b110111
+ 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'b0000110101000010; // ECC: 6'b111101
- parameter logic [15:0] D11 = 16'b1100110111010110; // ECC: 6'b111111
+ 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'b0001111111010001; // ECC: 6'b000010
- parameter logic [15:0] D12 = 16'b0001111111111001; // ECC: 6'b101111
+ 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'b0010010000110000; // ECC: 6'b111111
- parameter logic [15:0] D13 = 16'b0111011100110101; // ECC: 6'b111111
+ 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'b0010111010001111; // ECC: 6'b001000
- parameter logic [15:0] D14 = 16'b1011111010111111; // ECC: 6'b101100
+ 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'b0100010000111101; // ECC: 6'b011010
- parameter logic [15:0] D15 = 16'b0101110011111101; // ECC: 6'b111110
+ 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;
@@ -175,59 +223,83 @@
////////////////////////
typedef enum logic [LcStateWidth-1:0] {
- LcStRaw = {ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO},
- LcStTestUnlocked0 = {A11, A10, A9, A8, A7, A6, A5, A4, A3, A2, A1, B0},
- LcStTestLocked0 = {A11, A10, A9, A8, A7, A6, A5, A4, A3, A2, B1, B0},
- LcStTestUnlocked1 = {A11, A10, A9, A8, A7, A6, A5, A4, A3, B2, B1, B0},
- LcStTestLocked1 = {A11, A10, A9, A8, A7, A6, A5, A4, B3, B2, B1, B0},
- LcStTestUnlocked2 = {A11, A10, A9, A8, A7, A6, A5, B4, B3, B2, B1, B0},
- LcStTestLocked2 = {A11, A10, A9, A8, A7, A6, B5, B4, B3, B2, B1, B0},
- LcStTestUnlocked3 = {A11, A10, A9, A8, A7, B6, B5, B4, B3, B2, B1, B0},
- LcStDev = {A11, A10, A9, A8, B7, B6, B5, B4, B3, B2, B1, B0},
- LcStProd = {A11, A10, A9, B8, A7, B6, B5, B4, B3, B2, B1, B0},
- LcStProdEnd = {A11, A10, B9, A8, A7, B6, B5, B4, B3, B2, B1, B0},
- LcStRma = {B11, B10, A9, B8, B7, B6, B5, B4, B3, B2, B1, B0},
- LcStScrap = {B11, B10, B9, B8, B7, B6, B5, B4, B3, B2, B1, B0}
+ 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 enum logic [LcCountWidth-1:0] {
- LcCnt0 = {ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO, ZRO},
- LcCnt1 = {C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, C4, C3, C2, C1, D0},
- LcCnt2 = {C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, C4, C3, C2, D1, D0},
- LcCnt3 = {C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, C4, C3, D2, D1, D0},
- LcCnt4 = {C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, C4, D3, D2, D1, D0},
- LcCnt5 = {C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, C5, D4, D3, D2, D1, D0},
- LcCnt6 = {C15, C14, C13, C12, C11, C10, C9, C8, C7, C6, D5, D4, D3, D2, D1, D0},
- LcCnt7 = {C15, C14, C13, C12, C11, C10, C9, C8, C7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt8 = {C15, C14, C13, C12, C11, C10, C9, C8, D7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt9 = {C15, C14, C13, C12, C11, C10, C9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt10 = {C15, C14, C13, C12, C11, C10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt11 = {C15, C14, C13, C12, C11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt12 = {C15, C14, C13, C12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt13 = {C15, C14, C13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt14 = {C15, C14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt15 = {C15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0},
- LcCnt16 = {D15, D14, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0}
+ 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,
- DecLcStTestUnlocked0,
- DecLcStTestLocked0,
- DecLcStTestUnlocked1,
- DecLcStTestLocked1,
- DecLcStTestUnlocked2,
- DecLcStTestLocked2,
- DecLcStTestUnlocked3,
- DecLcStDev,
- DecLcStProd,
- DecLcStProdEnd,
- DecLcStRma,
- DecLcStScrap,
- DecLcStPostTrans,
- DecLcStEscalate,
- DecLcStInvalid
+ 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 enum logic [DecLcIdStateWidth-1:0] {
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv.tpl b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv.tpl
index 439ead5..581928b 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv.tpl
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_pkg.sv.tpl
@@ -147,11 +147,11 @@
// Decoded life cycle state, used to interface with CSRs and TAP.
typedef enum logic [DecLcStateWidth-1:0] {
% for state in lc_st_enc.config['lc_state'].keys():
- DecLcSt${_to_pascal_case(state)},
+ DecLcSt${_to_pascal_case(state)} = ${loop.index},
% endfor
- DecLcStPostTrans,
- DecLcStEscalate,
- DecLcStInvalid
+ DecLcStPostTrans = ${len(lc_st_enc.config['lc_state']) + 0},
+ DecLcStEscalate = ${len(lc_st_enc.config['lc_state']) + 1},
+ DecLcStInvalid = ${len(lc_st_enc.config['lc_state']) + 2}
} dec_lc_state_e;
typedef enum logic [DecLcIdStateWidth-1:0] {
diff --git a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_transition.sv b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_transition.sv
index ad480c4..bdbbbe2 100644
--- a/hw/ip/lc_ctrl/rtl/lc_ctrl_state_transition.sv
+++ b/hw/ip/lc_ctrl/rtl/lc_ctrl_state_transition.sv
@@ -67,7 +67,15 @@
LcCnt13: next_lc_cnt_o = LcCnt14;
LcCnt14: next_lc_cnt_o = LcCnt15;
LcCnt15: next_lc_cnt_o = LcCnt16;
- LcCnt16: trans_cnt_oflw_error_o = 1'b1;
+ LcCnt16: next_lc_cnt_o = LcCnt17;
+ LcCnt17: next_lc_cnt_o = LcCnt18;
+ LcCnt18: next_lc_cnt_o = LcCnt19;
+ LcCnt19: next_lc_cnt_o = LcCnt20;
+ LcCnt20: next_lc_cnt_o = LcCnt21;
+ LcCnt21: next_lc_cnt_o = LcCnt22;
+ LcCnt22: next_lc_cnt_o = LcCnt23;
+ LcCnt23: next_lc_cnt_o = LcCnt24;
+ LcCnt24: trans_cnt_oflw_error_o = 1'b1;
default: trans_cnt_oflw_error_o = 1'b1;
endcase // lc_cnt_i
@@ -103,6 +111,14 @@
DecLcStTestUnlocked2: next_lc_state_o = LcStTestUnlocked2;
DecLcStTestLocked2: next_lc_state_o = LcStTestLocked2;
DecLcStTestUnlocked3: next_lc_state_o = LcStTestUnlocked3;
+ DecLcStTestLocked3: next_lc_state_o = LcStTestLocked3;
+ DecLcStTestUnlocked4: next_lc_state_o = LcStTestUnlocked4;
+ DecLcStTestLocked4: next_lc_state_o = LcStTestLocked4;
+ DecLcStTestUnlocked5: next_lc_state_o = LcStTestUnlocked5;
+ DecLcStTestLocked5: next_lc_state_o = LcStTestLocked5;
+ DecLcStTestUnlocked6: next_lc_state_o = LcStTestUnlocked6;
+ DecLcStTestLocked6: next_lc_state_o = LcStTestLocked6;
+ DecLcStTestUnlocked7: next_lc_state_o = LcStTestUnlocked7;
DecLcStDev: next_lc_state_o = LcStDev;
DecLcStProd: next_lc_state_o = LcStProd;
DecLcStProdEnd: next_lc_state_o = LcStProdEnd;