Module Definition
dashboard | hierarchy | modlist | groups | tests | asserts



Module Instance : tb.dut.u_kmac_core

Instance :
SCORELINECONDTOGGLEFSMBRANCHASSERT
91.96 98.55 92.86 87.50 92.00 88.89


Instance's subtree :
SCORELINECONDTOGGLEFSMBRANCHASSERT
93.72 98.75 92.86 100.00 87.50 92.31 90.91


Parent :
SCORELINECONDTOGGLEFSMBRANCHASSERTNAME
97.24 96.27 93.33 100.00 100.00 93.85 100.00 dut


Subtrees :
NAMESCORELINECONDTOGGLEFSMBRANCHASSERT
gen_key_slicer[0].u_key_slicer 100.00 100.00 100.00
u_key_index_count 100.00 100.00
u_state_regs 100.00 100.00 100.00 100.00


Since this is the module's only instance, the coverage report is the same as for the module.
Line Coverage for Module : kmac_core
Line No.TotalCoveredPercent
TOTAL696898.55
CONT_ASSIGN15311100.00
ALWAYS16133100.00
ALWAYS1663030100.00
CONT_ASSIGN25111100.00
CONT_ASSIGN25211100.00
CONT_ASSIGN25311100.00
CONT_ASSIGN25411100.00
CONT_ASSIGN25811100.00
CONT_ASSIGN26011100.00
CONT_ASSIGN26511100.00
ALWAYS2686583.33
CONT_ASSIGN28711100.00
ALWAYS30766100.00
ALWAYS33866100.00
CONT_ASSIGN37211100.00
CONT_ASSIGN39411100.00
ALWAYS42066100.00
CONT_ASSIGN43111100.00

152 logic unused_signals; 153 1/1 assign unused_signals = ^{mode_i, key_valid_i}; Tests: T1 T2 T3  154 155 ///////// 156 // FSM // 157 ///////// 158 kmac_st_e st, st_d; 159 160 // State register 161 3/3 `PRIM_FLOP_SPARSE_FSM(u_state_regs, st_d, st, kmac_st_e, StKmacIdle) Tests: T1 T2 T3  | T1 T2 T3  | T1 T2 T3 
PRIM_FLOP_SPARSE_FSM(u_state_regs, st_d, st, kmac_st_e, StKmacIdle): 161.1 `ifdef SIMULATION 161.2 prim_sparse_fsm_flop #( 161.3 .StateEnumT(kmac_st_e), 161.4 .Width($bits(kmac_st_e)), 161.5 .ResetValue($bits(kmac_st_e)'(StKmacIdle)), 161.6 .EnableAlertTriggerSVA(1), 161.7 .CustomForceName("st") 161.8 ) u_state_regs ( 161.9 .clk_i ( clk_i ), 161.10 .rst_ni ( rst_ni ), 161.11 .state_i ( st_d ), 161.12 .state_o ( ) 161.13 ); 161.14 always_ff @(posedge clk_i or negedge rst_ni) begin 161.15 1/1 if (!rst_ni) begin Tests: T1 T2 T3  161.16 1/1 st <= StKmacIdle; Tests: T1 T2 T3  161.17 end else begin 161.18 1/1 st <= st_d; Tests: T1 T2 T3  161.19 end 161.20 end 161.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (st === u_state_regs.state_o)) 161.22 else begin 161.23 `ifdef UVM 161.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE, 161.25 "../src/lowrisc_ip_kmac_0.1/rtl/kmac_core.sv", 161, "", 1); 161.26 `else 161.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__, 161.28 `PRIM_STRINGIFY(u_state_regs_A)); 161.29 `endif 161.30 end 161.31 `else 161.32 prim_sparse_fsm_flop #( 161.33 .StateEnumT(kmac_st_e), 161.34 .Width($bits(kmac_st_e)), 161.35 .ResetValue($bits(kmac_st_e)'(StKmacIdle)), 161.36 .EnableAlertTriggerSVA(1) 161.37 ) u_state_regs ( 161.38 .clk_i ( `PRIM_FLOP_CLK ), 161.39 .rst_ni ( `PRIM_FLOP_RST ), 161.40 .state_i ( st_d ), 161.41 .state_o ( st ) 161.42 ); 161.43 `endif162 163 // Next state and output logic 164 // SEC_CM: FSM.SPARSE 165 always_comb begin 166 1/1 st_d = st; Tests: T1 T2 T3  167 168 1/1 en_kmac_datapath = 1'b 0; Tests: T1 T2 T3  169 1/1 en_key_write = 1'b 0; Tests: T1 T2 T3  170 171 1/1 clr_keyidx = 1'b 0; Tests: T1 T2 T3  172 173 1/1 kmac_valid = 1'b 0; Tests: T1 T2 T3  174 1/1 kmac_process = 1'b 0; Tests: T1 T2 T3  175 176 1/1 sparse_fsm_error_o = 1'b 0; Tests: T1 T2 T3  177 178 1/1 unique case (st) Tests: T1 T2 T3  179 StKmacIdle: begin 180 1/1 if (kmac_en_i && start_i) begin Tests: T1 T2 T3  181 1/1 st_d = StKey; Tests: T1 T2 T3  182 end else begin 183 1/1 st_d = StKmacIdle; Tests: T1 T2 T3  184 end 185 end 186 187 // If State enters here, regardless of the `process_i`, the state writes 188 // full block size of the key into SHA3 hashing engine. 189 StKey: begin 190 1/1 en_kmac_datapath = 1'b 1; Tests: T1 T2 T3  191 1/1 en_key_write = 1'b 1; Tests: T1 T2 T3  192 193 1/1 if (sent_blocksize) begin Tests: T1 T2 T3  194 1/1 st_d = StKmacMsg; Tests: T1 T2 T3  195 196 1/1 kmac_valid = 1'b 0; Tests: T1 T2 T3  197 1/1 clr_keyidx = 1'b 1; Tests: T1 T2 T3  198 end else begin 199 1/1 st_d = StKey; Tests: T1 T2 T3  200 201 1/1 kmac_valid = 1'b 1; Tests: T1 T2 T3  202 end 203 end 204 205 StKmacMsg: begin 206 // If process is previously latched, it is sent to SHA3 here. 207 1/1 if (process_i || process_latched) begin Tests: T1 T2 T3  208 1/1 st_d = StKmacFlush; Tests: T1 T2 T3  209 210 1/1 kmac_process = 1'b 1; Tests: T1 T2 T3  211 end else begin 212 1/1 st_d = StKmacMsg; Tests: T1 T2 T3  213 end 214 end 215 216 StKmacFlush: begin 217 1/1 if (prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin Tests: T1 T2 T3  218 1/1 st_d = StKmacIdle; Tests: T1 T2 T3  219 end else begin 220 1/1 st_d = StKmacFlush; Tests: T1 T2 T3  221 end 222 end 223 224 StTerminalError: begin 225 // this state is terminal 226 1/1 st_d = st; Tests: T4 T5 T6  227 1/1 sparse_fsm_error_o = 1'b 1; Tests: T4 T5 T6  228 end 229 230 default: begin 231 // this state is terminal 232 st_d = StTerminalError; 233 sparse_fsm_error_o = 1'b 1; 234 end 235 endcase 236 237 // SEC_CM: FSM.GLOBAL_ESC, FSM.LOCAL_ESC 238 // Unconditionally jump into the terminal error state 239 // if the life cycle controller triggers an escalation. 240 1/1 if (lc_ctrl_pkg::lc_tx_test_true_loose(lc_escalate_en_i)) begin Tests: T1 T2 T3  241 1/1 st_d = StTerminalError; Tests: T4 T5 T6  242 end MISSING_ELSE 243 end 244 245 ////////////// 246 // Datapath // 247 ////////////// 248 249 // DATA Mux depending on kmac_en 250 // When Key write happens, hold the FIFO request. so fifo_ready_o is tied to 0 251 1/1 assign msg_valid_o = (en_kmac_datapath) ? kmac_valid : fifo_valid_i; Tests: T1 T2 T3  252 1/1 assign msg_data_o = (en_kmac_datapath) ? kmac_data : fifo_data_i ; Tests: T1 T2 T3  253 1/1 assign msg_strb_o = (en_kmac_datapath) ? kmac_strb : fifo_strb_i ; Tests: T1 T2 T3  254 1/1 assign fifo_ready_o = (en_kmac_datapath) ? 1'b 0 : msg_ready_i ; Tests: T1 T2 T3  255 256 // secret key write request to SHA3 hashing engine is always full width write. 257 // KeyMgr is fixed 256 bit output. So `right_encode(256)` is 0x020100 --> strb 3 258 1/1 assign kmac_strb = (en_key_write ) ? '1 : '0; Tests: T1 T2 T3  259 260 1/1 assign kmac_data = (en_key_write) ? key_sliced : '{default:'0}; Tests: T1 T2 T3  261 262 // Process is controlled by the KMAC core always. 263 // This is mainly to prevent process_i asserted while KMAC core is writing 264 // the secret key to SHA3 hashing engine (the empty message case) 265 1/1 assign process_o = (kmac_en_i) ? kmac_process : process_i ; Tests: T1 T2 T3  266 267 always_ff @(posedge clk_i or negedge rst_ni) begin 268 1/1 if (!rst_ni) begin Tests: T1 T2 T3  269 1/1 process_latched <= 1'b 0; Tests: T1 T2 T3  270 1/1 end else if (process_i && !process_o) begin Tests: T1 T2 T3  271 0/1 ==> process_latched <= 1'b 1; 272 1/1 end else if (process_o || Tests: T1 T2 T3  273 prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin 274 1/1 process_latched <= 1'b 0; Tests: T1 T2 T3  275 end MISSING_ELSE 276 end 277 278 // bytepad(encode_string(K), 168 or 136) ===================================== 279 // 1. Prepare left_encode(w) 280 // 2. Prepare left_encode(len(secret_key)) 281 // 3. Concatenate left_encode(len(secret_key)) || secret_key 282 // 4. Concaatenate left_encode(w) || encode_string(secret_key) 283 // 5. Based on the address, slice out the data into MsgWidth bits 284 285 // left_encode(w): Same as used in sha3pad logic. 286 logic [15:0] encode_bytepad; 287 1/1 assign encode_bytepad = sha3_pkg::encode_bytepad_len(strength_i); Tests: T1 T2 T3  288 289 // left_encode(len(secret_key)) 290 // encoded length is always byte size. Use MaxEncodedKeyLenByte parameter 291 // from kmac_pkg and add one more byte to indicate how many bytes used to 292 // represent len(secret_key) 293 // Note that if the secret_key is 128 bit, only lower 16 bits of 294 // `encode_keylen` are valid. Refer `encoded_key` concatenation logic below. 295 // As the encoded string in the spec big-endian, The endian swap is a must. 296 logic [MaxEncodedKeyLenSize + 8 - 1:0] encode_keylen [Share]; 297 298 always_comb begin 299 // the spec mentioned the key length is encoded in left_encode() 300 // The number is represented in big-endian. For example: 301 // 384 ==> 0x02 0x01 0x80 302 // The first byte is the number of bytes to represent 384 303 // The second byte represents 2**8 number, which is 256 here. 304 // The third byte represents 2**0 number, which is 128. 305 // The data put into MsgFIFO is little-endian and SHA3(Keccak) processes in 306 // little-endian. So, below keylen swaps the byte order 307 1/1 unique case (key_len_i) Tests: T1 T2 T3  308 // endian-swapped key_length num_bytes 309 // Key128: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(128)}}, 8'h 01}; 310 // Key192: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(192)}}, 8'h 01}; 311 // Key256: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(256)}}, 8'h 02}; 312 // Key384: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(384)}}, 8'h 02}; 313 // Key512: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(512)}}, 8'h 02}; 314 315 // Vivado does not support stream swap for non context value. So assign 316 // the value directly. 317 1/1 Key128: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 0080_01); Tests: T1 T2 T3  318 1/1 Key192: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 00C0_01); Tests: T3 T4 T13  319 1/1 Key256: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 0001_02); Tests: T1 T2 T3  320 1/1 Key384: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 8001_02); Tests: T3 T13 T14  321 1/1 Key512: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 0002_02); Tests: T13 T14 T20  322 default: encode_keylen[0] = '0; 323 endcase 324 end 325 326 if (EnMasking) begin: gen_encode_keylen_masked 327 assign encode_keylen[1] = '0; 328 end 329 330 // encode_string(secret_key): Concatenate key 331 // Based on the left_encode(len(secret_key)) size, the concatenation logic 332 // should be changed. If key length is 128 bit, only lower 16 bits of the 333 // encoded length are used so that the upper 8 bits are padded with 0 as 334 // defined in bytepad() function. 335 336 for (genvar i = 0 ; i < Share; i++) begin : gen_encoded_key 337 always_comb begin 338 1/1 unique case (key_len_i) Tests: T1 T2 T3  339 // In Key 128, 192 case, only lower parts of encode_keylen signal is 340 // used. So upper padding requires 8 more bits than MaxKeyLen - keylen 341 1/1 Key128: encoded_key[i] = {(8 + MaxKeyLen - 128)'(0), Tests: T1 T2 T3  342 key_data_i[i][0+:128], 343 encode_keylen[i][0+:MaxEncodedKeyLenSize]}; 344 345 1/1 Key192: encoded_key[i] = {(8 + MaxKeyLen - 192)'(0), Tests: T3 T4 T13  346 key_data_i[i][0+:192], 347 encode_keylen[i][0+:MaxEncodedKeyLenSize]}; 348 349 1/1 Key256: encoded_key[i] = {(MaxKeyLen - 256)'(0), Tests: T1 T2 T3  350 key_data_i[i][0+:256], 351 encode_keylen[i]}; 352 353 1/1 Key384: encoded_key[i] = {(MaxKeyLen - 384)'(0), Tests: T3 T13 T14  354 key_data_i[i][0+:384], 355 encode_keylen[i]}; 356 357 // Assume 512bit is the MaxKeyLen 358 1/1 Key512: encoded_key[i] = {key_data_i[i][0+:512], Tests: T13 T14 T20  359 encode_keylen[i]}; 360 361 default: encoded_key[i] = '0; 362 endcase 363 end 364 end : gen_encoded_key 365 366 // Above logic assumes MaxKeyLen as 512 bits. Revise if it is not. 367 `ASSERT_INIT(MaxKeyLenMatchToKey512_A, kmac_pkg::MaxKeyLen == 512) 368 369 // Combine the bytepad `left_encode(w)` and the `encode_string(secret_key)` 370 logic [MaxEncodedKeyW + 16 -1 :0] encoded_key_block [Share]; 371 372 1/1 assign encoded_key_block[0] = {encoded_key[0], encode_bytepad}; Tests: T1 T2 T3  373 374 if (EnMasking) begin : gen_encoded_key_block_masked 375 assign encoded_key_block[1] = {encoded_key[1], 16'h 0}; 376 end 377 378 // Slicer to slice out 64 bits 379 for (genvar i = 0 ; i < Share ; i++) begin : gen_key_slicer 380 prim_slicer #( 381 .InW (MaxEncodedKeyW+16), 382 .IndexW(KeccakMsgAddrW), 383 .OutW(MsgWidth) 384 ) u_key_slicer ( 385 .sel_i (key_index), 386 .data_i (encoded_key_block[i]), 387 .data_o (key_sliced[i]) 388 ); 389 end 390 391 // `key_index` logic 392 // key_index is used to select MsgWidth data from long `encoded_key_block` 393 // It behaves same as `keccak_addr` or `prefix_index` in sha3pad module. 394 1/1 assign inc_keyidx = kmac_valid & msg_ready_i ; Tests: T1 T2 T3  395 396 // This primitive is used to place a hardened counter 397 // SEC_CM: CTR.REDUN 398 prim_count #( 399 .Width(sha3_pkg::KeccakMsgAddrW) 400 ) u_key_index_count ( 401 .clk_i, 402 .rst_ni, 403 .clr_i(clr_keyidx), 404 .set_i(1'b0), 405 .set_cnt_i('0), 406 .incr_en_i(inc_keyidx), 407 .decr_en_i(1'b0), 408 .step_i(sha3_pkg::KeccakMsgAddrW'(1)), 409 .commit_i(1'b1), 410 .cnt_o(key_index), 411 .cnt_after_commit_o(), 412 .err_o(key_index_error_o) 413 ); 414 415 // Block size based on the address. 416 // This is used for bytepad() and also pad10*1() 417 // assign block_addr_limit = KeccakRate[strength_i]; 418 // but below is easier to understand 419 always_comb begin 420 1/1 unique case (strength_i) Tests: T1 T2 T3  421 1/1 L128: block_addr_limit = KeccakCountW'(KeccakRate[L128]); Tests: T1 T2 T3  422 1/1 L224: block_addr_limit = KeccakCountW'(KeccakRate[L224]); Tests: T14 T22 T79  423 1/1 L256: block_addr_limit = KeccakCountW'(KeccakRate[L256]); Tests: T1 T2 T3  424 1/1 L384: block_addr_limit = KeccakCountW'(KeccakRate[L384]); Tests: T3 T13 T14  425 1/1 L512: block_addr_limit = KeccakCountW'(KeccakRate[L512]); Tests: T80 T81 T27  426 427 default: block_addr_limit = '0; 428 endcase 429 end 430 431 1/1 assign sent_blocksize = (key_index == block_addr_limit); Tests: T1 T2 T3 

Cond Coverage for Module : kmac_core
TotalCoveredPercent
Conditions282692.86
Logical282692.86
Non-Logical00
Event00

 LINE       180
 EXPRESSION (kmac_en_i && start_i)
             ----1----    ---2---
-1--2-StatusTests
01CoveredT4,T13,T14
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       207
 EXPRESSION (process_i || process_latched)
             ----1----    -------2-------
-1--2-StatusTests
00CoveredT1,T2,T3
01Not Covered
10CoveredT1,T2,T3

 LINE       251
 EXPRESSION (en_kmac_datapath ? kmac_valid : fifo_valid_i)
             --------1-------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       252
 EXPRESSION (en_kmac_datapath ? kmac_data : fifo_data_i)
             --------1-------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       253
 EXPRESSION (en_kmac_datapath ? kmac_strb : fifo_strb_i)
             --------1-------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       254
 EXPRESSION (en_kmac_datapath ? 1'b0 : msg_ready_i)
             --------1-------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       258
 EXPRESSION (en_key_write ? '1 : '0)
             ------1-----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       260
 EXPRESSION (en_key_write ? key_sliced : ('{(*adjust*)default:'0}))
             ------1-----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       265
 EXPRESSION (kmac_en_i ? kmac_process : process_i)
             ----1----
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

 LINE       270
 EXPRESSION (process_i && ((!process_o)))
             ----1----    -------2------
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11Not Covered

 LINE       394
 EXPRESSION (kmac_valid & msg_ready_i)
             -----1----   -----2-----
-1--2-StatusTests
01CoveredT1,T2,T3
10CoveredT1,T2,T3
11CoveredT1,T2,T3

 LINE       431
 EXPRESSION (key_index == block_addr_limit)
            ---------------1---------------
-1-StatusTests
0CoveredT1,T2,T3
1CoveredT1,T2,T3

FSM Coverage for Module : kmac_core
Summary for FSM :: st
TotalCoveredPercent
States 5 5 100.00 (Not included in score)
Transitions 8 7 87.50
Sequences 0 0

State, Transition and Sequence Details for FSM :: st
statesLine No.CoveredTests
StKey 181 Covered T1,T2,T3
StKmacFlush 208 Covered T1,T2,T3
StKmacIdle 183 Covered T1,T2,T3
StKmacMsg 194 Covered T1,T2,T3
StTerminalError 241 Covered T4,T5,T6


transitionsLine No.CoveredTests
StKey->StKmacMsg 194 Covered T1,T2,T3
StKey->StTerminalError 241 Covered T42,T82,T63
StKmacFlush->StKmacIdle 218 Covered T1,T2,T3
StKmacFlush->StTerminalError 241 Not Covered
StKmacIdle->StKey 181 Covered T1,T2,T3
StKmacIdle->StTerminalError 241 Covered T4,T5,T6
StKmacMsg->StKmacFlush 208 Covered T1,T2,T3
StKmacMsg->StTerminalError 241 Covered T7,T83,T8



Branch Coverage for Module : kmac_core
Line No.TotalCoveredPercent
Branches 50 46 92.00
TERNARY 251 2 2 100.00
TERNARY 252 2 2 100.00
TERNARY 253 2 2 100.00
TERNARY 254 2 2 100.00
TERNARY 258 2 2 100.00
TERNARY 260 2 2 100.00
TERNARY 265 2 2 100.00
IF 161 2 2 100.00
CASE 178 10 10 100.00
IF 240 2 2 100.00
IF 268 4 3 75.00
CASE 307 6 5 83.33
CASE 420 6 5 83.33
CASE 338 6 5 83.33


251 assign msg_valid_o = (en_kmac_datapath) ? kmac_valid : fifo_valid_i; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


252 assign msg_data_o = (en_kmac_datapath) ? kmac_data : fifo_data_i ; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


253 assign msg_strb_o = (en_kmac_datapath) ? kmac_strb : fifo_strb_i ; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


254 assign fifo_ready_o = (en_kmac_datapath) ? 1'b 0 : msg_ready_i ; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


258 assign kmac_strb = (en_key_write ) ? '1 : '0; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


260 assign kmac_data = (en_key_write) ? key_sliced : '{default:'0}; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


265 assign process_o = (kmac_en_i) ? kmac_process : process_i ; -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


161 `PRIM_FLOP_SPARSE_FSM(u_state_regs, st_d, st, kmac_st_e, StKmacIdle) -1- ==> ==>

Branches:
-1-StatusTests
1 Covered T1,T2,T3
0 Covered T1,T2,T3


178 unique case (st) -1- 179 StKmacIdle: begin 180 if (kmac_en_i && start_i) begin -2- 181 st_d = StKey; ==> 182 end else begin 183 st_d = StKmacIdle; ==> 184 end 185 end 186 187 // If State enters here, regardless of the `process_i`, the state writes 188 // full block size of the key into SHA3 hashing engine. 189 StKey: begin 190 en_kmac_datapath = 1'b 1; 191 en_key_write = 1'b 1; 192 193 if (sent_blocksize) begin -3- 194 st_d = StKmacMsg; ==> 195 196 kmac_valid = 1'b 0; 197 clr_keyidx = 1'b 1; 198 end else begin 199 st_d = StKey; ==> 200 201 kmac_valid = 1'b 1; 202 end 203 end 204 205 StKmacMsg: begin 206 // If process is previously latched, it is sent to SHA3 here. 207 if (process_i || process_latched) begin -4- 208 st_d = StKmacFlush; ==> 209 210 kmac_process = 1'b 1; 211 end else begin 212 st_d = StKmacMsg; ==> 213 end 214 end 215 216 StKmacFlush: begin 217 if (prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin -5- 218 st_d = StKmacIdle; ==> 219 end else begin 220 st_d = StKmacFlush; ==> 221 end 222 end 223 224 StTerminalError: begin 225 // this state is terminal 226 st_d = st; ==> 227 sparse_fsm_error_o = 1'b 1; 228 end 229 230 default: begin 231 // this state is terminal 232 st_d = StTerminalError; ==>

Branches:
-1--2--3--4--5-StatusTests
StKmacIdle 1 - - - Covered T1,T2,T3
StKmacIdle 0 - - - Covered T1,T2,T3
StKey - 1 - - Covered T1,T2,T3
StKey - 0 - - Covered T1,T2,T3
StKmacMsg - - 1 - Covered T1,T2,T3
StKmacMsg - - 0 - Covered T1,T2,T3
StKmacFlush - - - 1 Covered T1,T2,T3
StKmacFlush - - - 0 Covered T1,T2,T3
StTerminalError - - - - Covered T4,T5,T6
default - - - - Covered T9,T10,T11


240 if (lc_ctrl_pkg::lc_tx_test_true_loose(lc_escalate_en_i)) begin -1- 241 st_d = StTerminalError; ==> 242 end MISSING_ELSE ==>

Branches:
-1-StatusTests
1 Covered T4,T5,T6
0 Covered T1,T2,T3


268 if (!rst_ni) begin -1- 269 process_latched <= 1'b 0; ==> 270 end else if (process_i && !process_o) begin -2- 271 process_latched <= 1'b 1; ==> 272 end else if (process_o || -3- 273 prim_mubi_pkg::mubi4_test_true_strict(done_i)) begin 274 process_latched <= 1'b 0; ==> 275 end MISSING_ELSE ==>

Branches:
-1--2--3-StatusTests
1 - - Covered T1,T2,T3
0 1 - Not Covered
0 0 1 Covered T1,T2,T3
0 0 0 Covered T1,T2,T3


307 unique case (key_len_i) -1- 308 // endian-swapped key_length num_bytes 309 // Key128: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(128)}}, 8'h 01}; 310 // Key192: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(192)}}, 8'h 01}; 311 // Key256: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(256)}}, 8'h 02}; 312 // Key384: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(384)}}, 8'h 02}; 313 // Key512: encode_keylen[0] = {{<<8{MaxEncodedKeyLenSize'(512)}}, 8'h 02}; 314 315 // Vivado does not support stream swap for non context value. So assign 316 // the value directly. 317 Key128: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 0080_01); ==> 318 Key192: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 00C0_01); ==> 319 Key256: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 0001_02); ==> 320 Key384: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 8001_02); ==> 321 Key512: encode_keylen[0] = (MaxEncodedKeyLenSize+8)'('h 0002_02); ==> 322 default: encode_keylen[0] = '0; ==>

Branches:
-1-StatusTests
Key128 Covered T1,T2,T3
Key192 Covered T3,T4,T13
Key256 Covered T1,T2,T3
Key384 Covered T3,T13,T14
Key512 Covered T13,T14,T20
default Not Covered


420 unique case (strength_i) -1- 421 L128: block_addr_limit = KeccakCountW'(KeccakRate[L128]); ==> 422 L224: block_addr_limit = KeccakCountW'(KeccakRate[L224]); ==> 423 L256: block_addr_limit = KeccakCountW'(KeccakRate[L256]); ==> 424 L384: block_addr_limit = KeccakCountW'(KeccakRate[L384]); ==> 425 L512: block_addr_limit = KeccakCountW'(KeccakRate[L512]); ==> 426 427 default: block_addr_limit = '0; ==>

Branches:
-1-StatusTests
L128 Covered T1,T2,T3
L224 Covered T14,T22,T79
L256 Covered T1,T2,T3
L384 Covered T3,T13,T14
L512 Covered T80,T81,T27
default Not Covered


338 unique case (key_len_i) -1- 339 // In Key 128, 192 case, only lower parts of encode_keylen signal is 340 // used. So upper padding requires 8 more bits than MaxKeyLen - keylen 341 Key128: encoded_key[i] = {(8 + MaxKeyLen - 128)'(0), ==> 342 key_data_i[i][0+:128], 343 encode_keylen[i][0+:MaxEncodedKeyLenSize]}; 344 345 Key192: encoded_key[i] = {(8 + MaxKeyLen - 192)'(0), ==> 346 key_data_i[i][0+:192], 347 encode_keylen[i][0+:MaxEncodedKeyLenSize]}; 348 349 Key256: encoded_key[i] = {(MaxKeyLen - 256)'(0), ==> 350 key_data_i[i][0+:256], 351 encode_keylen[i]}; 352 353 Key384: encoded_key[i] = {(MaxKeyLen - 384)'(0), ==> 354 key_data_i[i][0+:384], 355 encode_keylen[i]}; 356 357 // Assume 512bit is the MaxKeyLen 358 Key512: encoded_key[i] = {key_data_i[i][0+:512], ==> 359 encode_keylen[i]}; 360 361 default: encoded_key[i] = '0; ==>

Branches:
-1-StatusTests
Key128 Covered T1,T2,T3
Key192 Covered T3,T4,T13
Key256 Covered T1,T2,T3
Key384 Covered T3,T13,T14
Key512 Covered T13,T14,T20
default Not Covered


Assert Coverage for Module : kmac_core
TotalAttemptedPercentSucceeded/MatchedPercent
Assertions 9 9 100.00 8 88.89
Cover properties 0 0 0
Cover sequences 0 0 0
Total 9 9 100.00 8 88.89




Assertion Details

NameAttemptsReal SuccessesFailuresIncomplete
AckOnlyInMessageState_A 567132835 7891189 0 0
KeyDataStableWhenValid_M 567132835 323383890 0 0
KeyLengthStableWhenValid_M 567132835 323383890 0 0
KmacEnStable_M 567132835 22180 0 0
MaxKeyLenMatchToKey512_A 664 664 0 0
ModeStable_M 567132835 33930 0 0
ProcessLatchedCleared_A 567132835 0 0 0
StrengthStable_M 567132835 39873 0 0
u_state_regs_A 567132835 567007961 0 0


AckOnlyInMessageState_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 567132835 7891189 0 0
T1 2517 28 0 0
T2 2527 28 0 0
T3 42818 0 0 0
T4 2559 0 0 0
T5 0 172 0 0
T12 3035 28 0 0
T13 665515 2189 0 0
T14 132067 2042 0 0
T15 6666 28 0 0
T16 0 28 0 0
T17 0 53 0 0
T18 1132 0 0 0
T19 1321 0 0 0
T35 0 1135 0 0

KeyDataStableWhenValid_M
NameAttemptsReal SuccessesFailuresIncomplete
Total 567132835 323383890 0 0
T1 2517 1330 0 0
T2 2527 1150 0 0
T3 42818 0 0 0
T4 2559 0 0 0
T5 0 786 0 0
T12 3035 1437 0 0
T13 665515 315248 0 0
T14 132067 62812 0 0
T15 6666 4530 0 0
T16 0 1417 0 0
T17 0 8511 0 0
T18 1132 0 0 0
T19 1321 0 0 0
T35 0 56953 0 0

KeyLengthStableWhenValid_M
NameAttemptsReal SuccessesFailuresIncomplete
Total 567132835 323383890 0 0
T1 2517 1330 0 0
T2 2527 1150 0 0
T3 42818 0 0 0
T4 2559 0 0 0
T5 0 786 0 0
T12 3035 1437 0 0
T13 665515 315248 0 0
T14 132067 62812 0 0
T15 6666 4530 0 0
T16 0 1417 0 0
T17 0 8511 0 0
T18 1132 0 0 0
T19 1321 0 0 0
T35 0 56953 0 0

KmacEnStable_M
NameAttemptsReal SuccessesFailuresIncomplete
Total 567132835 22180 0 0
T1 2517 1 0 0
T2 2527 1 0 0
T3 42818 11 0 0
T4 2559 0 0 0
T5 0 2 0 0
T12 3035 1 0 0
T13 665515 34 0 0
T14 132067 38 0 0
T15 6666 1 0 0
T16 0 1 0 0
T17 0 1 0 0
T18 1132 0 0 0
T19 1321 0 0 0

MaxKeyLenMatchToKey512_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 664 664 0 0
T1 1 1 0 0
T2 1 1 0 0
T3 1 1 0 0
T4 1 1 0 0
T12 1 1 0 0
T13 1 1 0 0
T14 1 1 0 0
T15 1 1 0 0
T18 1 1 0 0
T19 1 1 0 0

ModeStable_M
NameAttemptsReal SuccessesFailuresIncomplete
Total 567132835 33930 0 0
T1 2517 1 0 0
T2 2527 1 0 0
T3 42818 17 0 0
T4 2559 1 0 0
T12 3035 1 0 0
T13 665515 97 0 0
T14 132067 65 0 0
T15 6666 1 0 0
T16 0 1 0 0
T17 0 1 0 0
T18 1132 0 0 0
T19 1321 0 0 0

ProcessLatchedCleared_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 567132835 0 0 0

StrengthStable_M
NameAttemptsReal SuccessesFailuresIncomplete
Total 567132835 39873 0 0
T1 2517 1 0 0
T2 2527 1 0 0
T3 42818 18 0 0
T4 2559 2 0 0
T12 3035 1 0 0
T13 665515 86 0 0
T14 132067 62 0 0
T15 6666 1 0 0
T18 1132 1 0 0
T19 1321 1 0 0

u_state_regs_A
NameAttemptsReal SuccessesFailuresIncomplete
Total 567132835 567007961 0 0
T1 2517 2441 0 0
T2 2527 2429 0 0
T3 42818 42730 0 0
T4 2559 2405 0 0
T12 3035 2954 0 0
T13 665515 665440 0 0
T14 132067 131972 0 0
T15 6666 6605 0 0
T18 1132 1045 0 0
T19 1321 1236 0 0

0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%