Line Coverage for Module :
prim_lfsr
| Line No. | Total | Covered | Percent |
TOTAL | | 32 | 32 | 100.00 |
CONT_ASSIGN | 296 | 1 | 1 | 100.00 |
CONT_ASSIGN | 299 | 1 | 1 | 100.00 |
CONT_ASSIGN | 345 | 1 | 1 | 100.00 |
CONT_ASSIGN | 465 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
ALWAYS | 487 | 3 | 3 | 100.00 |
ROUTINE | 510 | 10 | 10 | 100.00 |
CONT_ASSIGN | 610 | 1 | 1 | 100.00 |
CONT_ASSIGN | 615 | 1 | 1 | 100.00 |
ALWAYS | 618 | 5 | 5 | 100.00 |
295 // calculate next state using internal XOR feedback and entropy input
296 1/1 assign next_lfsr_state = LfsrDw'(entropy_i) ^ ({LfsrDw{lfsr_q[0]}} & coeffs) ^ (lfsr_q >> 1);
Tests: T1 T2 T3
297
298 // lockup condition is all-zero
299 1/1 assign lockup = ~(|lfsr_q);
Tests: T1 T2 T3
300
301 // check that seed is not all-zero
302 `ASSERT_INIT(DefaultSeedNzCheck_A, |DefaultSeedLocal)
303
304
305 ////////////////////
306 // Fibonacci XNOR //
307 ////////////////////
308 end else if (64'(LfsrType) == "FIB_XNOR") begin : gen_fib_xnor
309
310 // if custom polynomial is provided
311 if (CustomCoeffs > 0) begin : gen_custom
312 assign coeffs = CustomCoeffs[LfsrDw-1:0];
313 end else begin : gen_lut
314 assign coeffs = LFSR_COEFFS[LfsrDw-LUT_OFF][LfsrDw-1:0];
315 // check that the most significant bit of polynomial is 1
316 `ASSERT_INIT(MinLfsrWidth_A, LfsrDw >= $low(LFSR_COEFFS)+LUT_OFF)
317 `ASSERT_INIT(MaxLfsrWidth_A, LfsrDw <= $high(LFSR_COEFFS)+LUT_OFF)
318 end
319
320 // calculate next state using external XNOR feedback and entropy input
321 assign next_lfsr_state = LfsrDw'(entropy_i) ^ {lfsr_q[LfsrDw-2:0], ~(^(lfsr_q & coeffs))};
322
323 // lockup condition is all-ones
324 assign lockup = &lfsr_q;
325
326 // check that seed is not all-ones
327 `ASSERT_INIT(DefaultSeedNzCheck_A, !(&DefaultSeedLocal))
328
329
330 /////////////
331 // Unknown //
332 /////////////
333 end else begin : gen_unknown_type
334 assign coeffs = '0;
335 assign next_lfsr_state = '0;
336 assign lockup = 1'b0;
337 `ASSERT_INIT(UnknownLfsrType_A, 0)
338 end
339
340
341 //////////////////
342 // Shared logic //
343 //////////////////
344
345 1/1 assign lfsr_d = (seed_en_i) ? seed_i :
Tests: T1 T2 T3
346 (lfsr_en_i && lockup) ? DefaultSeedLocal :
347 (lfsr_en_i) ? next_lfsr_state :
348 lfsr_q;
349
350 logic [LfsrDw-1:0] sbox_out;
351 if (NonLinearOut) begin : gen_out_non_linear
352 // The "aligned" permutation ensures that adjacent bits do not go into the same SBox. It is
353 // different from the state permutation that can be specified via the StatePerm parameter. The
354 // permutation taps out 4 SBox input bits at regular stride intervals. E.g., for a 16bit
355 // vector, the input assignment looks as follows:
356 //
357 // SBox0: 0, 4, 8, 12
358 // SBox1: 1, 5, 9, 13
359 // SBox2: 2, 6, 10, 14
360 // SBox3: 3, 7, 11, 15
361 //
362 // Note that this permutation can be produced by filling the input vector into matrix columns
363 // and reading out the SBox inputs as matrix rows.
364 localparam int NumSboxes = LfsrDw / 4;
365 // Fill in the input vector in col-major order.
366 logic [3:0][NumSboxes-1:0][LfsrIdxDw-1:0] matrix_indices;
367 for (genvar j = 0; j < LfsrDw; j++) begin : gen_input_idx_map
368 assign matrix_indices[j / NumSboxes][j % NumSboxes] = j;
369 end
370 // Due to the LFSR shifting pattern, the above permutation has the property that the output of
371 // SBox(n) is going to be equal to SBox(n+1) in the subsequent cycle (unless the LFSR polynomial
372 // modifies some of the associated shifted bits via an XOR tap).
373 // We therefore tweak this permutation by rotating and reversing some of the assignment matrix
374 // columns. The rotation and reversion operations have been chosen such that this
375 // generalizes to all power of two widths supported by the LFSR primitive. For 16bit, this
376 // looks as follows:
377 //
378 // SBox0: 0, 6, 11, 14
379 // SBox1: 1, 7, 10, 13
380 // SBox2: 2, 4, 9, 12
381 // SBox3: 3, 5, 8, 15
382 //
383 // This can be achieved by:
384 // 1) down rotating the second column by NumSboxes/2
385 // 2) reversing the third column
386 // 3) down rotating the fourth column by 1 and reversing it
387 //
388 logic [3:0][NumSboxes-1:0][LfsrIdxDw-1:0] matrix_rotrev_indices;
389 typedef logic [NumSboxes-1:0][LfsrIdxDw-1:0] matrix_col_t;
390
391 // left-rotates a matrix column by the shift amount
392 function automatic matrix_col_t lrotcol(matrix_col_t col, integer shift);
393 matrix_col_t out;
394 for (int k = 0; k < NumSboxes; k++) begin
395 out[(k + shift) % NumSboxes] = col[k];
396 end
397 return out;
398 endfunction : lrotcol
399
400 // reverses a matrix column
401 function automatic matrix_col_t revcol(matrix_col_t col);
402 return {<<LfsrIdxDw{col}};
403 endfunction : revcol
404
405 always_comb begin : p_rotrev
406 matrix_rotrev_indices[0] = matrix_indices[0];
407 matrix_rotrev_indices[1] = lrotcol(matrix_indices[1], NumSboxes/2);
408 matrix_rotrev_indices[2] = revcol(matrix_indices[2]);
409 matrix_rotrev_indices[3] = revcol(lrotcol(matrix_indices[3], 1));
410 end
411
412 // Read out the matrix rows and linearize.
413 logic [LfsrDw-1:0][LfsrIdxDw-1:0] sbox_in_indices;
414 for (genvar k = 0; k < LfsrDw; k++) begin : gen_reverse_upper
415 assign sbox_in_indices[k] = matrix_rotrev_indices[k % 4][k / 4];
416 end
417
418 `ifndef SYNTHESIS
419 // Check that the permutation is indeed a permutation.
420 logic [LfsrDw-1:0] sbox_perm_test;
421 always_comb begin : p_perm_check
422 sbox_perm_test = '0;
423 for (int k = 0; k < LfsrDw; k++) begin
424 sbox_perm_test[sbox_in_indices[k]] = 1'b1;
425 end
426 end
427 // All bit positions must be marked with 1.
428 `ASSERT(SboxPermutationCheck_A, &sbox_perm_test)
429 `endif
430
431 `ifdef FPV_ON
432 // Verify that the permutation indeed breaks linear shifting patterns of 4bit input groups.
433 // The symbolic variables let the FPV tool select all sbox index combinations and linear shift
434 // offsets.
435 int shift;
436 int unsigned sk, sj;
437 `ASSUME(SjSkRange_M, (sj < NumSboxes) && (sk < NumSboxes))
438 `ASSUME(SjSkDifferent_M, sj != sk)
439 `ASSUME(SjSkStable_M, ##1 $stable(sj) && $stable(sk) && $stable(shift))
440 `ASSERT(SboxInputIndexGroupIsUnique_A,
441 !((((sbox_in_indices[sj * 4 + 0] + shift) % LfsrDw) == sbox_in_indices[sk * 4 + 0]) &&
442 (((sbox_in_indices[sj * 4 + 1] + shift) % LfsrDw) == sbox_in_indices[sk * 4 + 1]) &&
443 (((sbox_in_indices[sj * 4 + 2] + shift) % LfsrDw) == sbox_in_indices[sk * 4 + 2]) &&
444 (((sbox_in_indices[sj * 4 + 3] + shift) % LfsrDw) == sbox_in_indices[sk * 4 + 3])))
445
446 // this checks that the permutations does not preserve neighboring bit positions.
447 // i.e. no two neighboring bits are mapped to neighboring bit positions.
448 int y;
449 int unsigned ik;
450 `ASSUME(IkYRange_M, (ik < LfsrDw) && (y == 1 || y == -1))
451 `ASSUME(IkStable_M, ##1 $stable(ik) && $stable(y))
452 `ASSERT(IndicesNotAdjacent_A, (sbox_in_indices[ik] - sbox_in_indices[(ik + y) % LfsrDw]) != 1)
453 `endif
454
455 // Use the permutation indices to create the SBox layer
456 for (genvar k = 0; k < NumSboxes; k++) begin : gen_sboxes
457 logic [3:0] sbox_in;
458 assign sbox_in = {lfsr_q[sbox_in_indices[k*4 + 3]],
459 lfsr_q[sbox_in_indices[k*4 + 2]],
460 lfsr_q[sbox_in_indices[k*4 + 1]],
461 lfsr_q[sbox_in_indices[k*4 + 0]]};
462 assign sbox_out[k*4 +: 4] = prim_cipher_pkg::PRINCE_SBOX4[sbox_in];
463 end
464 end else begin : gen_out_passthru
465 1/1 assign sbox_out = lfsr_q;
Tests: T1 T2 T3
466 end
467
468 // Random output permutation, defined at compile time
469 if (StatePermEn) begin : gen_state_perm
470
471 for (genvar k = 0; k < StateOutDw; k++) begin : gen_perm_loop
472 8/8 assign state_o[k] = sbox_out[StatePerm[k]];
Tests: T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3
473 end
474
475 // if lfsr width is greater than the output, then by definition
476 // not every bit will be picked
477 if (LfsrDw > StateOutDw) begin : gen_tieoff_unused
478 logic unused_sbox_out;
479 assign unused_sbox_out = ^sbox_out;
480 end
481
482 end else begin : gen_no_state_perm
483 assign state_o = StateOutDw'(sbox_out);
484 end
485
486 always_ff @(posedge clk_i or negedge rst_ni) begin : p_reg
487 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
488 1/1 lfsr_q <= DefaultSeedLocal;
Tests: T1 T2 T3
489 end else begin
490 1/1 lfsr_q <= lfsr_d;
Tests: T1 T2 T3
491 end
492 end
493
494
495 ///////////////////////
496 // shared assertions //
497 ///////////////////////
498
499 `ASSERT_KNOWN(DataKnownO_A, state_o)
500
501 // the code below is not meant to be synthesized,
502 // but it is intended to be used in simulation and FPV
503 `ifndef SYNTHESIS
504 function automatic logic [LfsrDw-1:0] compute_next_state(logic [LfsrDw-1:0] lfsrcoeffs,
505 logic [EntropyDw-1:0] entropy,
506 logic [LfsrDw-1:0] current_state);
507 logic state0;
508 logic [LfsrDw-1:0] next_state;
509
510 1/1 next_state = current_state;
Tests: T1 T2 T3
511
512 // Galois XOR
513 1/1 if (64'(LfsrType) == 64'("GAL_XOR")) begin
Tests: T1 T2 T3
514 1/1 if (next_state == 0) begin
Tests: T1 T2 T3
515 1/1 next_state = DefaultSeedLocal;
Tests: T1 T2 T3
516 end else begin
517 1/1 state0 = next_state[0];
Tests: T1 T2 T3
518 1/1 next_state = next_state >> 1;
Tests: T1 T2 T3
519 2/2 if (state0) next_state ^= lfsrcoeffs;
Tests: T1 T2 T3 | T1 T2 T3
MISSING_ELSE
520 1/1 next_state ^= LfsrDw'(entropy);
Tests: T1 T2 T3
521 end
522 // Fibonacci XNOR
523 unreachable end else if (64'(LfsrType) == "FIB_XNOR") begin
524 unreachable if (&next_state) begin
525 unreachable next_state = DefaultSeedLocal;
526 end else begin
527 unreachable state0 = ~(^(next_state & lfsrcoeffs));
528 unreachable next_state = next_state << 1;
529 unreachable next_state[0] = state0;
530 unreachable next_state ^= LfsrDw'(entropy);
531 end
532 end else begin
533 unreachable $error("unknown lfsr type");
534 end
535
536 1/1 return next_state;
Tests: T1 T2 T3
537 endfunction : compute_next_state
538
539 // check whether next state is computed correctly
540 // we shift the assertion by one clock cycle (##1) in order to avoid
541 // erroneous SVA triggers right after reset deassertion in cases where
542 // the precondition is true throughout the reset.
543 // this can happen since the disable_iff evaluates using unsampled values,
544 // meaning that the assertion may already read rst_ni == 1 on an active
545 // clock edge while the flops in the design have not yet changed state.
546 `ASSERT(NextStateCheck_A, ##1 lfsr_en_i && !seed_en_i |=> lfsr_q ==
547 compute_next_state(coeffs, $past(entropy_i), $past(lfsr_q)))
548
549 // Only check this if enabled.
550 if (StatePermEn) begin : gen_perm_check
551 // Check that the supplied permutation is valid.
552 logic [LfsrDw-1:0] lfsr_perm_test;
553 initial begin : p_perm_check
554 lfsr_perm_test = '0;
555 for (int k = 0; k < LfsrDw; k++) begin
556 lfsr_perm_test[StatePerm[k]] = 1'b1;
557 end
558 // All bit positions must be marked with 1.
559 `ASSERT_I(PermutationCheck_A, &lfsr_perm_test)
560 end
561 end
562
563 `endif
564
565 `ASSERT_INIT(InputWidth_A, LfsrDw >= EntropyDw)
566 `ASSERT_INIT(OutputWidth_A, LfsrDw >= StateOutDw)
567
568 // MSB must be one in any case
569 `ASSERT(CoeffCheck_A, coeffs[LfsrDw-1])
570
571 // output check
572 `ASSERT_KNOWN(OutputKnown_A, state_o)
573 if (!StatePermEn && !NonLinearOut) begin : gen_output_sva
574 `ASSERT(OutputCheck_A, state_o == StateOutDw'(lfsr_q))
575 end
576 // if no external input changes the lfsr state, a lockup must not occur (by design)
577 //`ASSERT(NoLockups_A, (!entropy_i) && (!seed_en_i) |=> !lockup, clk_i, !rst_ni)
578 `ASSERT(NoLockups_A, lfsr_en_i && !entropy_i && !seed_en_i |=> !lockup)
579
580 // this can be disabled if unused in order to not distort coverage
581 if (ExtSeedSVA) begin : gen_ext_seed_sva
582 // check that external seed is correctly loaded into the state
583 // rst_ni is used directly as part of the pre-condition since the usage of rst_ni
584 // in disable_iff is unsampled. See #1985 for more details
585 `ASSERT(ExtDefaultSeedInputCheck_A, (seed_en_i && rst_ni) |=> lfsr_q == $past(seed_i))
586 end
587
588 // if the external seed mechanism is not used,
589 // there is theoretically no way we end up in a lockup condition
590 // in order to not distort coverage, this SVA can be disabled in such cases
591 if (LockupSVA) begin : gen_lockup_mechanism_sva
592 // check that a stuck LFSR is correctly reseeded
593 `ASSERT(LfsrLockupCheck_A, lfsr_en_i && lockup && !seed_en_i |=> !lockup)
594 end
595
596 // If non-linear output requested, the LFSR width must be a power of 2 and greater than 16.
597 if(NonLinearOut) begin : gen_nonlinear_align_check_sva
598 `ASSERT_INIT(SboxByteAlign_A, 2**$clog2(LfsrDw) == LfsrDw && LfsrDw >= 16)
599 end
600
601 if (MaxLenSVA) begin : gen_max_len_sva
602 `ifndef SYNTHESIS
603 // the code below is a workaround to enable long sequences to be checked.
604 // some simulators do not support SVA sequences longer than 2**32-1.
605 logic [LfsrDw-1:0] cnt_d, cnt_q;
606 logic perturbed_d, perturbed_q;
607 logic [LfsrDw-1:0] cmp_val;
608
609 assign cmp_val = {{(LfsrDw-1){1'b1}}, 1'b0}; // 2**LfsrDw-2
610 1/1 assign cnt_d = (lfsr_en_i && lockup) ? '0 :
Tests: T1 T2 T3
611 (lfsr_en_i && (cnt_q == cmp_val)) ? '0 :
612 (lfsr_en_i) ? cnt_q + 1'b1 :
613 cnt_q;
614
615 1/1 assign perturbed_d = perturbed_q | (|entropy_i) | seed_en_i;
Tests: T1 T2 T3
616
617 always_ff @(posedge clk_i or negedge rst_ni) begin : p_max_len
618 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
619 1/1 cnt_q <= '0;
Tests: T1 T2 T3
620 1/1 perturbed_q <= 1'b0;
Tests: T1 T2 T3
621 end else begin
622 1/1 cnt_q <= cnt_d;
Tests: T1 T2 T3
623 1/1 perturbed_q <= perturbed_d;
Tests: T1 T2 T3
Cond Coverage for Module :
prim_lfsr
| Total | Covered | Percent |
Conditions | 29 | 28 | 96.55 |
Logical | 29 | 28 | 96.55 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 345
EXPRESSION (seed_en_i ? seed_i : ((lfsr_en_i && lockup) ? DefaultSeedLocal : (lfsr_en_i ? next_lfsr_state : lfsr_q)))
----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 345
SUB-EXPRESSION ((lfsr_en_i && lockup) ? DefaultSeedLocal : (lfsr_en_i ? next_lfsr_state : lfsr_q))
----------1----------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 345
SUB-EXPRESSION (lfsr_en_i && lockup)
----1---- ---2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 345
SUB-EXPRESSION (lfsr_en_i ? next_lfsr_state : lfsr_q)
----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 514
EXPRESSION (next_state == 8'b0)
----------1---------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 610
EXPRESSION
Number Term
1 (lfsr_en_i && lockup) ? '0 : ((lfsr_en_i && (gen_max_len_sva.cnt_q == gen_max_len_sva.cmp_val)) ? '0 : (lfsr_en_i ? ((gen_max_len_sva.cnt_q + 1'b1)) : gen_max_len_sva.cnt_q)))
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION (lfsr_en_i && lockup)
----1---- ---2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION ((lfsr_en_i && (gen_max_len_sva.cnt_q == gen_max_len_sva.cmp_val)) ? '0 : (lfsr_en_i ? ((gen_max_len_sva.cnt_q + 1'b1)) : gen_max_len_sva.cnt_q))
--------------------------------1--------------------------------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION (lfsr_en_i && (gen_max_len_sva.cnt_q == gen_max_len_sva.cmp_val))
----1---- -------------------------2------------------------
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION (gen_max_len_sva.cnt_q == gen_max_len_sva.cmp_val)
-------------------------1------------------------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION (lfsr_en_i ? ((gen_max_len_sva.cnt_q + 1'b1)) : gen_max_len_sva.cnt_q)
----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 615
EXPRESSION (gen_max_len_sva.perturbed_q | ((|entropy_i)) | seed_en_i)
-------------1------------- -------2------ ----3----
-1- | -2- | -3- | Status | Tests |
0 | 0 | 0 | Covered | T1,T2,T3 |
0 | 0 | 1 | Covered | T1,T2,T4 |
0 | 1 | 0 | Covered | T1,T2,T3 |
1 | 0 | 0 | Covered | T1,T2,T3 |
Toggle Coverage for Module :
prim_lfsr
| Total | Covered | Percent |
Totals |
7 |
7 |
100.00 |
Total Bits |
56 |
56 |
100.00 |
Total Bits 0->1 |
28 |
28 |
100.00 |
Total Bits 1->0 |
28 |
28 |
100.00 |
| | | |
Ports |
7 |
7 |
100.00 |
Port Bits |
56 |
56 |
100.00 |
Port Bits 0->1 |
28 |
28 |
100.00 |
Port Bits 1->0 |
28 |
28 |
100.00 |
Port Details
Name | Toggle | Toggle 1->0 | Tests | Toggle 0->1 | Tests | Direction |
clk_i |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
rst_ni |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
seed_en_i |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
seed_i[7:0] |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
lfsr_en_i |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
entropy_i[7:0] |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
state_o[7:0] |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
OUTPUT |
Branch Coverage for Module :
prim_lfsr
| Line No. | Total | Covered | Percent |
Branches |
|
15 |
15 |
100.00 |
TERNARY |
345 |
4 |
4 |
100.00 |
TERNARY |
610 |
4 |
4 |
100.00 |
IF |
487 |
2 |
2 |
100.00 |
IF |
618 |
2 |
2 |
100.00 |
IF |
513 |
3 |
3 |
100.00 |
345 assign lfsr_d = (seed_en_i) ? seed_i :
-1-
==>
346 (lfsr_en_i && lockup) ? DefaultSeedLocal :
-2-
==>
347 (lfsr_en_i) ? next_lfsr_state :
-3-
==>
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T1,T2,T3 |
0 |
0 |
1 |
Covered |
T1,T2,T3 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
610 assign cnt_d = (lfsr_en_i && lockup) ? '0 :
-1-
==>
611 (lfsr_en_i && (cnt_q == cmp_val)) ? '0 :
-2-
==>
612 (lfsr_en_i) ? cnt_q + 1'b1 :
-3-
==>
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T1,T2,T3 |
0 |
0 |
1 |
Covered |
T1,T2,T3 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
487 if (!rst_ni) begin
-1-
488 lfsr_q <= DefaultSeedLocal;
==>
489 end else begin
490 lfsr_q <= lfsr_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
618 if (!rst_ni) begin
-1-
619 cnt_q <= '0;
==>
620 perturbed_q <= 1'b0;
621 end else begin
622 cnt_q <= cnt_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
513 if (64'(LfsrType) == 64'("GAL_XOR")) begin
-1-
514 if (next_state == 0) begin
-2-
515 next_state = DefaultSeedLocal;
==>
516 end else begin
517 state0 = next_state[0];
518 next_state = next_state >> 1;
519 if (state0) next_state ^= lfsrcoeffs;
-3-
==>
MISSING_ELSE
==>
520 next_state ^= LfsrDw'(entropy);
521 end
522 // Fibonacci XNOR
523 end else if (64'(LfsrType) == "FIB_XNOR") begin
-4-
524 if (&next_state) begin
-5-
525 next_state = DefaultSeedLocal;
==> (Unreachable)
526 end else begin
527 state0 = ~(^(next_state & lfsrcoeffs));
==> (Unreachable)
528 next_state = next_state << 1;
529 next_state[0] = state0;
530 next_state ^= LfsrDw'(entropy);
531 end
532 end else begin
533 $error("unknown lfsr type");
==> (Unreachable)
Branches:
-1- | -2- | -3- | -4- | -5- | Status | Tests |
1 |
1 |
- |
- |
- |
Covered |
T1,T2,T3 |
1 |
0 |
1 |
- |
- |
Covered |
T1,T2,T3 |
1 |
0 |
0 |
- |
- |
Covered |
T1,T2,T3 |
0 |
- |
- |
1 |
1 |
Unreachable |
T5,T6,T7 |
0 |
- |
- |
1 |
0 |
Unreachable |
T5,T6,T7 |
0 |
- |
- |
0 |
- |
Unreachable |
|
Assert Coverage for Module :
prim_lfsr
Assertion Details
CoeffCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
1680014748 |
0 |
0 |
T1 |
54708 |
7099 |
0 |
0 |
T2 |
62448 |
7883 |
0 |
0 |
T3 |
65564 |
8273 |
0 |
0 |
T4 |
45924 |
5923 |
0 |
0 |
T8 |
47263 |
6404 |
0 |
0 |
T9 |
45693 |
5840 |
0 |
0 |
T10 |
50146 |
6545 |
0 |
0 |
T11 |
72899 |
9627 |
0 |
0 |
T12 |
51880 |
6829 |
0 |
0 |
T13 |
63507 |
8167 |
0 |
0 |
T14 |
168258 |
167835 |
0 |
0 |
T15 |
168511 |
167871 |
0 |
0 |
T16 |
168523 |
167869 |
0 |
0 |
T17 |
168502 |
167863 |
0 |
0 |
T18 |
168465 |
167860 |
0 |
0 |
T19 |
168474 |
167867 |
0 |
0 |
T20 |
168326 |
167843 |
0 |
0 |
T21 |
168177 |
167824 |
0 |
0 |
T22 |
168280 |
167838 |
0 |
0 |
T23 |
168345 |
167845 |
0 |
0 |
DataKnownO_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
1680014748 |
0 |
0 |
T1 |
54708 |
7099 |
0 |
0 |
T2 |
62448 |
7883 |
0 |
0 |
T3 |
65564 |
8273 |
0 |
0 |
T4 |
45924 |
5923 |
0 |
0 |
T8 |
47263 |
6404 |
0 |
0 |
T9 |
45693 |
5840 |
0 |
0 |
T10 |
50146 |
6545 |
0 |
0 |
T11 |
72899 |
9627 |
0 |
0 |
T12 |
51880 |
6829 |
0 |
0 |
T13 |
63507 |
8167 |
0 |
0 |
T14 |
168258 |
167835 |
0 |
0 |
T15 |
168511 |
167871 |
0 |
0 |
T16 |
168523 |
167869 |
0 |
0 |
T17 |
168502 |
167863 |
0 |
0 |
T18 |
168465 |
167860 |
0 |
0 |
T19 |
168474 |
167867 |
0 |
0 |
T20 |
168326 |
167843 |
0 |
0 |
T21 |
168177 |
167824 |
0 |
0 |
T22 |
168280 |
167838 |
0 |
0 |
T23 |
168345 |
167845 |
0 |
0 |
InputWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
300 |
300 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T14 |
1 |
1 |
0 |
0 |
T15 |
1 |
1 |
0 |
0 |
T16 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
T18 |
1 |
1 |
0 |
0 |
T19 |
1 |
1 |
0 |
0 |
T20 |
1 |
1 |
0 |
0 |
T21 |
1 |
1 |
0 |
0 |
T22 |
1 |
1 |
0 |
0 |
T23 |
1 |
1 |
0 |
0 |
NextStateCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
1678233483 |
0 |
300 |
T1 |
54708 |
1709 |
0 |
1 |
T2 |
62448 |
1831 |
0 |
1 |
T3 |
65564 |
1938 |
0 |
1 |
T4 |
45924 |
1394 |
0 |
1 |
T8 |
47263 |
1530 |
0 |
1 |
T9 |
45693 |
1360 |
0 |
1 |
T10 |
50146 |
1581 |
0 |
1 |
T11 |
72899 |
2197 |
0 |
1 |
T12 |
51880 |
1631 |
0 |
1 |
T13 |
63507 |
1924 |
0 |
1 |
T14 |
168258 |
167785 |
0 |
1 |
T15 |
168511 |
167792 |
0 |
1 |
T16 |
168523 |
167792 |
0 |
1 |
T17 |
168502 |
167791 |
0 |
1 |
T18 |
168465 |
167790 |
0 |
1 |
T19 |
168474 |
167791 |
0 |
1 |
T20 |
168326 |
167786 |
0 |
1 |
T21 |
168177 |
167782 |
0 |
1 |
T22 |
168280 |
167785 |
0 |
1 |
T23 |
168345 |
167787 |
0 |
1 |
NoLockups_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
1677774153 |
0 |
0 |
T1 |
54708 |
263 |
0 |
0 |
T2 |
62448 |
263 |
0 |
0 |
T3 |
65564 |
261 |
0 |
0 |
T4 |
45924 |
260 |
0 |
0 |
T8 |
47263 |
260 |
0 |
0 |
T9 |
45693 |
263 |
0 |
0 |
T10 |
50146 |
262 |
0 |
0 |
T11 |
72899 |
265 |
0 |
0 |
T12 |
51880 |
263 |
0 |
0 |
T13 |
63507 |
260 |
0 |
0 |
T14 |
168258 |
167772 |
0 |
0 |
T15 |
168511 |
167772 |
0 |
0 |
T16 |
168523 |
167772 |
0 |
0 |
T17 |
168502 |
167772 |
0 |
0 |
T18 |
168465 |
167772 |
0 |
0 |
T19 |
168474 |
167772 |
0 |
0 |
T20 |
168326 |
167772 |
0 |
0 |
T21 |
168177 |
167772 |
0 |
0 |
T22 |
168280 |
167772 |
0 |
0 |
T23 |
168345 |
167772 |
0 |
0 |
OutputKnown_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
1680014748 |
0 |
0 |
T1 |
54708 |
7099 |
0 |
0 |
T2 |
62448 |
7883 |
0 |
0 |
T3 |
65564 |
8273 |
0 |
0 |
T4 |
45924 |
5923 |
0 |
0 |
T8 |
47263 |
6404 |
0 |
0 |
T9 |
45693 |
5840 |
0 |
0 |
T10 |
50146 |
6545 |
0 |
0 |
T11 |
72899 |
9627 |
0 |
0 |
T12 |
51880 |
6829 |
0 |
0 |
T13 |
63507 |
8167 |
0 |
0 |
T14 |
168258 |
167835 |
0 |
0 |
T15 |
168511 |
167871 |
0 |
0 |
T16 |
168523 |
167869 |
0 |
0 |
T17 |
168502 |
167863 |
0 |
0 |
T18 |
168465 |
167860 |
0 |
0 |
T19 |
168474 |
167867 |
0 |
0 |
T20 |
168326 |
167843 |
0 |
0 |
T21 |
168177 |
167824 |
0 |
0 |
T22 |
168280 |
167838 |
0 |
0 |
T23 |
168345 |
167845 |
0 |
0 |
OutputWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
300 |
300 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T14 |
1 |
1 |
0 |
0 |
T15 |
1 |
1 |
0 |
0 |
T16 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
T18 |
1 |
1 |
0 |
0 |
T19 |
1 |
1 |
0 |
0 |
T20 |
1 |
1 |
0 |
0 |
T21 |
1 |
1 |
0 |
0 |
T22 |
1 |
1 |
0 |
0 |
T23 |
1 |
1 |
0 |
0 |
gen_ext_seed_sva.ExtDefaultSeedInputCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
1012754 |
0 |
0 |
T1 |
54708 |
3082 |
0 |
0 |
T2 |
62448 |
3361 |
0 |
0 |
T3 |
65564 |
3571 |
0 |
0 |
T4 |
45924 |
2573 |
0 |
0 |
T8 |
47263 |
2787 |
0 |
0 |
T9 |
45693 |
2522 |
0 |
0 |
T10 |
50146 |
2760 |
0 |
0 |
T11 |
72899 |
4278 |
0 |
0 |
T12 |
51880 |
2928 |
0 |
0 |
T13 |
63507 |
3503 |
0 |
0 |
T14 |
168258 |
2861 |
0 |
0 |
T15 |
168511 |
4545 |
0 |
0 |
T16 |
168523 |
4364 |
0 |
0 |
T17 |
168502 |
4107 |
0 |
0 |
T18 |
168465 |
3969 |
0 |
0 |
T19 |
168474 |
4355 |
0 |
0 |
T20 |
168326 |
3250 |
0 |
0 |
T21 |
168177 |
2394 |
0 |
0 |
T22 |
168280 |
3009 |
0 |
0 |
T23 |
168345 |
3334 |
0 |
0 |
gen_fib_xnor.DefaultSeedNzCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
150 |
150 |
0 |
0 |
T5 |
1 |
1 |
0 |
0 |
T6 |
1 |
1 |
0 |
0 |
T7 |
1 |
1 |
0 |
0 |
T24 |
1 |
1 |
0 |
0 |
T25 |
1 |
1 |
0 |
0 |
T26 |
1 |
1 |
0 |
0 |
T27 |
1 |
1 |
0 |
0 |
T28 |
1 |
1 |
0 |
0 |
T29 |
1 |
1 |
0 |
0 |
T30 |
1 |
1 |
0 |
0 |
T31 |
1 |
1 |
0 |
0 |
T32 |
1 |
1 |
0 |
0 |
T33 |
1 |
1 |
0 |
0 |
T34 |
1 |
1 |
0 |
0 |
T35 |
1 |
1 |
0 |
0 |
T36 |
1 |
1 |
0 |
0 |
T37 |
1 |
1 |
0 |
0 |
T38 |
1 |
1 |
0 |
0 |
T39 |
1 |
1 |
0 |
0 |
T40 |
1 |
1 |
0 |
0 |
gen_fib_xnor.gen_lut.MaxLfsrWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
150 |
150 |
0 |
0 |
T5 |
1 |
1 |
0 |
0 |
T6 |
1 |
1 |
0 |
0 |
T7 |
1 |
1 |
0 |
0 |
T24 |
1 |
1 |
0 |
0 |
T25 |
1 |
1 |
0 |
0 |
T26 |
1 |
1 |
0 |
0 |
T27 |
1 |
1 |
0 |
0 |
T28 |
1 |
1 |
0 |
0 |
T29 |
1 |
1 |
0 |
0 |
T30 |
1 |
1 |
0 |
0 |
T31 |
1 |
1 |
0 |
0 |
T32 |
1 |
1 |
0 |
0 |
T33 |
1 |
1 |
0 |
0 |
T34 |
1 |
1 |
0 |
0 |
T35 |
1 |
1 |
0 |
0 |
T36 |
1 |
1 |
0 |
0 |
T37 |
1 |
1 |
0 |
0 |
T38 |
1 |
1 |
0 |
0 |
T39 |
1 |
1 |
0 |
0 |
T40 |
1 |
1 |
0 |
0 |
gen_fib_xnor.gen_lut.MinLfsrWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
150 |
150 |
0 |
0 |
T5 |
1 |
1 |
0 |
0 |
T6 |
1 |
1 |
0 |
0 |
T7 |
1 |
1 |
0 |
0 |
T24 |
1 |
1 |
0 |
0 |
T25 |
1 |
1 |
0 |
0 |
T26 |
1 |
1 |
0 |
0 |
T27 |
1 |
1 |
0 |
0 |
T28 |
1 |
1 |
0 |
0 |
T29 |
1 |
1 |
0 |
0 |
T30 |
1 |
1 |
0 |
0 |
T31 |
1 |
1 |
0 |
0 |
T32 |
1 |
1 |
0 |
0 |
T33 |
1 |
1 |
0 |
0 |
T34 |
1 |
1 |
0 |
0 |
T35 |
1 |
1 |
0 |
0 |
T36 |
1 |
1 |
0 |
0 |
T37 |
1 |
1 |
0 |
0 |
T38 |
1 |
1 |
0 |
0 |
T39 |
1 |
1 |
0 |
0 |
T40 |
1 |
1 |
0 |
0 |
gen_gal_xor.DefaultSeedNzCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
150 |
150 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T14 |
1 |
1 |
0 |
0 |
T15 |
1 |
1 |
0 |
0 |
T16 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
T18 |
1 |
1 |
0 |
0 |
T19 |
1 |
1 |
0 |
0 |
T20 |
1 |
1 |
0 |
0 |
T21 |
1 |
1 |
0 |
0 |
T22 |
1 |
1 |
0 |
0 |
T23 |
1 |
1 |
0 |
0 |
gen_gal_xor.gen_lut.MaxLfsrWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
150 |
150 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T14 |
1 |
1 |
0 |
0 |
T15 |
1 |
1 |
0 |
0 |
T16 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
T18 |
1 |
1 |
0 |
0 |
T19 |
1 |
1 |
0 |
0 |
T20 |
1 |
1 |
0 |
0 |
T21 |
1 |
1 |
0 |
0 |
T22 |
1 |
1 |
0 |
0 |
T23 |
1 |
1 |
0 |
0 |
gen_gal_xor.gen_lut.MinLfsrWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
150 |
150 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T14 |
1 |
1 |
0 |
0 |
T15 |
1 |
1 |
0 |
0 |
T16 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
T18 |
1 |
1 |
0 |
0 |
T19 |
1 |
1 |
0 |
0 |
T20 |
1 |
1 |
0 |
0 |
T21 |
1 |
1 |
0 |
0 |
T22 |
1 |
1 |
0 |
0 |
T23 |
1 |
1 |
0 |
0 |
gen_lockup_mechanism_sva.LfsrLockupCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
1462 |
0 |
0 |
T1 |
54708 |
8 |
0 |
0 |
T2 |
62448 |
6 |
0 |
0 |
T3 |
65564 |
5 |
0 |
0 |
T4 |
45924 |
3 |
0 |
0 |
T8 |
47263 |
4 |
0 |
0 |
T9 |
45693 |
6 |
0 |
0 |
T10 |
50146 |
7 |
0 |
0 |
T11 |
72899 |
9 |
0 |
0 |
T12 |
51880 |
7 |
0 |
0 |
T13 |
63507 |
8 |
0 |
0 |
T14 |
168258 |
1 |
0 |
0 |
T15 |
168511 |
1 |
0 |
0 |
T16 |
168523 |
1 |
0 |
0 |
T17 |
168502 |
1 |
0 |
0 |
T18 |
168465 |
1 |
0 |
0 |
T19 |
168474 |
1 |
0 |
0 |
T20 |
168326 |
1 |
0 |
0 |
T21 |
168177 |
1 |
0 |
0 |
T22 |
168280 |
1 |
0 |
0 |
T23 |
168345 |
1 |
0 |
0 |
gen_max_len_sva.MaximalLengthCheck0_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
6893 |
0 |
0 |
T1 |
54708 |
28 |
0 |
0 |
T2 |
62448 |
32 |
0 |
0 |
T3 |
65564 |
16 |
0 |
0 |
T4 |
45924 |
31 |
0 |
0 |
T8 |
47263 |
26 |
0 |
0 |
T9 |
45693 |
26 |
0 |
0 |
T10 |
50146 |
20 |
0 |
0 |
T11 |
72899 |
22 |
0 |
0 |
T12 |
51880 |
26 |
0 |
0 |
T13 |
63507 |
28 |
0 |
0 |
T14 |
168258 |
28 |
0 |
0 |
T15 |
168511 |
26 |
0 |
0 |
T16 |
168523 |
25 |
0 |
0 |
T17 |
168502 |
16 |
0 |
0 |
T18 |
168465 |
13 |
0 |
0 |
T19 |
168474 |
21 |
0 |
0 |
T20 |
168326 |
25 |
0 |
0 |
T21 |
168177 |
15 |
0 |
0 |
T22 |
168280 |
18 |
0 |
0 |
T23 |
168345 |
24 |
0 |
0 |
gen_max_len_sva.MaximalLengthCheck1_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
1695259358 |
1677772200 |
0 |
0 |
T1 |
54708 |
254 |
0 |
0 |
T2 |
62448 |
254 |
0 |
0 |
T3 |
65564 |
254 |
0 |
0 |
T4 |
45924 |
254 |
0 |
0 |
T8 |
47263 |
254 |
0 |
0 |
T9 |
45693 |
254 |
0 |
0 |
T10 |
50146 |
254 |
0 |
0 |
T11 |
72899 |
254 |
0 |
0 |
T12 |
51880 |
254 |
0 |
0 |
T13 |
63507 |
254 |
0 |
0 |
T14 |
168258 |
167772 |
0 |
0 |
T15 |
168511 |
167772 |
0 |
0 |
T16 |
168523 |
167772 |
0 |
0 |
T17 |
168502 |
167772 |
0 |
0 |
T18 |
168465 |
167772 |
0 |
0 |
T19 |
168474 |
167772 |
0 |
0 |
T20 |
168326 |
167772 |
0 |
0 |
T21 |
168177 |
167772 |
0 |
0 |
T22 |
168280 |
167772 |
0 |
0 |
T23 |
168345 |
167772 |
0 |
0 |
gen_perm_check.p_perm_check.PermutationCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
300 |
300 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T14 |
1 |
1 |
0 |
0 |
T15 |
1 |
1 |
0 |
0 |
T16 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
T18 |
1 |
1 |
0 |
0 |
T19 |
1 |
1 |
0 |
0 |
T20 |
1 |
1 |
0 |
0 |
T21 |
1 |
1 |
0 |
0 |
T22 |
1 |
1 |
0 |
0 |
T23 |
1 |
1 |
0 |
0 |
p_randomize_default_seed.DefaultSeedLocalRandomizeCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
300 |
300 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
T14 |
1 |
1 |
0 |
0 |
T15 |
1 |
1 |
0 |
0 |
T16 |
1 |
1 |
0 |
0 |
T17 |
1 |
1 |
0 |
0 |
T18 |
1 |
1 |
0 |
0 |
T19 |
1 |
1 |
0 |
0 |
T20 |
1 |
1 |
0 |
0 |
T21 |
1 |
1 |
0 |
0 |
T22 |
1 |
1 |
0 |
0 |
T23 |
1 |
1 |
0 |
0 |
Line Coverage for Instance : prim_lfsr_tb.gen_duts[8].i_prim_lfsr
| Line No. | Total | Covered | Percent |
TOTAL | | 32 | 32 | 100.00 |
CONT_ASSIGN | 296 | 1 | 1 | 100.00 |
CONT_ASSIGN | 299 | 1 | 1 | 100.00 |
CONT_ASSIGN | 345 | 1 | 1 | 100.00 |
CONT_ASSIGN | 465 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
CONT_ASSIGN | 472 | 1 | 1 | 100.00 |
ALWAYS | 487 | 3 | 3 | 100.00 |
ROUTINE | 510 | 10 | 10 | 100.00 |
CONT_ASSIGN | 610 | 1 | 1 | 100.00 |
CONT_ASSIGN | 615 | 1 | 1 | 100.00 |
ALWAYS | 618 | 5 | 5 | 100.00 |
295 // calculate next state using internal XOR feedback and entropy input
296 1/1 assign next_lfsr_state = LfsrDw'(entropy_i) ^ ({LfsrDw{lfsr_q[0]}} & coeffs) ^ (lfsr_q >> 1);
Tests: T1 T2 T3
297
298 // lockup condition is all-zero
299 1/1 assign lockup = ~(|lfsr_q);
Tests: T1 T2 T3
300
301 // check that seed is not all-zero
302 `ASSERT_INIT(DefaultSeedNzCheck_A, |DefaultSeedLocal)
303
304
305 ////////////////////
306 // Fibonacci XNOR //
307 ////////////////////
308 end else if (64'(LfsrType) == "FIB_XNOR") begin : gen_fib_xnor
309
310 // if custom polynomial is provided
311 if (CustomCoeffs > 0) begin : gen_custom
312 assign coeffs = CustomCoeffs[LfsrDw-1:0];
313 end else begin : gen_lut
314 assign coeffs = LFSR_COEFFS[LfsrDw-LUT_OFF][LfsrDw-1:0];
315 // check that the most significant bit of polynomial is 1
316 `ASSERT_INIT(MinLfsrWidth_A, LfsrDw >= $low(LFSR_COEFFS)+LUT_OFF)
317 `ASSERT_INIT(MaxLfsrWidth_A, LfsrDw <= $high(LFSR_COEFFS)+LUT_OFF)
318 end
319
320 // calculate next state using external XNOR feedback and entropy input
321 assign next_lfsr_state = LfsrDw'(entropy_i) ^ {lfsr_q[LfsrDw-2:0], ~(^(lfsr_q & coeffs))};
322
323 // lockup condition is all-ones
324 assign lockup = &lfsr_q;
325
326 // check that seed is not all-ones
327 `ASSERT_INIT(DefaultSeedNzCheck_A, !(&DefaultSeedLocal))
328
329
330 /////////////
331 // Unknown //
332 /////////////
333 end else begin : gen_unknown_type
334 assign coeffs = '0;
335 assign next_lfsr_state = '0;
336 assign lockup = 1'b0;
337 `ASSERT_INIT(UnknownLfsrType_A, 0)
338 end
339
340
341 //////////////////
342 // Shared logic //
343 //////////////////
344
345 1/1 assign lfsr_d = (seed_en_i) ? seed_i :
Tests: T1 T2 T3
346 (lfsr_en_i && lockup) ? DefaultSeedLocal :
347 (lfsr_en_i) ? next_lfsr_state :
348 lfsr_q;
349
350 logic [LfsrDw-1:0] sbox_out;
351 if (NonLinearOut) begin : gen_out_non_linear
352 // The "aligned" permutation ensures that adjacent bits do not go into the same SBox. It is
353 // different from the state permutation that can be specified via the StatePerm parameter. The
354 // permutation taps out 4 SBox input bits at regular stride intervals. E.g., for a 16bit
355 // vector, the input assignment looks as follows:
356 //
357 // SBox0: 0, 4, 8, 12
358 // SBox1: 1, 5, 9, 13
359 // SBox2: 2, 6, 10, 14
360 // SBox3: 3, 7, 11, 15
361 //
362 // Note that this permutation can be produced by filling the input vector into matrix columns
363 // and reading out the SBox inputs as matrix rows.
364 localparam int NumSboxes = LfsrDw / 4;
365 // Fill in the input vector in col-major order.
366 logic [3:0][NumSboxes-1:0][LfsrIdxDw-1:0] matrix_indices;
367 for (genvar j = 0; j < LfsrDw; j++) begin : gen_input_idx_map
368 assign matrix_indices[j / NumSboxes][j % NumSboxes] = j;
369 end
370 // Due to the LFSR shifting pattern, the above permutation has the property that the output of
371 // SBox(n) is going to be equal to SBox(n+1) in the subsequent cycle (unless the LFSR polynomial
372 // modifies some of the associated shifted bits via an XOR tap).
373 // We therefore tweak this permutation by rotating and reversing some of the assignment matrix
374 // columns. The rotation and reversion operations have been chosen such that this
375 // generalizes to all power of two widths supported by the LFSR primitive. For 16bit, this
376 // looks as follows:
377 //
378 // SBox0: 0, 6, 11, 14
379 // SBox1: 1, 7, 10, 13
380 // SBox2: 2, 4, 9, 12
381 // SBox3: 3, 5, 8, 15
382 //
383 // This can be achieved by:
384 // 1) down rotating the second column by NumSboxes/2
385 // 2) reversing the third column
386 // 3) down rotating the fourth column by 1 and reversing it
387 //
388 logic [3:0][NumSboxes-1:0][LfsrIdxDw-1:0] matrix_rotrev_indices;
389 typedef logic [NumSboxes-1:0][LfsrIdxDw-1:0] matrix_col_t;
390
391 // left-rotates a matrix column by the shift amount
392 function automatic matrix_col_t lrotcol(matrix_col_t col, integer shift);
393 matrix_col_t out;
394 for (int k = 0; k < NumSboxes; k++) begin
395 out[(k + shift) % NumSboxes] = col[k];
396 end
397 return out;
398 endfunction : lrotcol
399
400 // reverses a matrix column
401 function automatic matrix_col_t revcol(matrix_col_t col);
402 return {<<LfsrIdxDw{col}};
403 endfunction : revcol
404
405 always_comb begin : p_rotrev
406 matrix_rotrev_indices[0] = matrix_indices[0];
407 matrix_rotrev_indices[1] = lrotcol(matrix_indices[1], NumSboxes/2);
408 matrix_rotrev_indices[2] = revcol(matrix_indices[2]);
409 matrix_rotrev_indices[3] = revcol(lrotcol(matrix_indices[3], 1));
410 end
411
412 // Read out the matrix rows and linearize.
413 logic [LfsrDw-1:0][LfsrIdxDw-1:0] sbox_in_indices;
414 for (genvar k = 0; k < LfsrDw; k++) begin : gen_reverse_upper
415 assign sbox_in_indices[k] = matrix_rotrev_indices[k % 4][k / 4];
416 end
417
418 `ifndef SYNTHESIS
419 // Check that the permutation is indeed a permutation.
420 logic [LfsrDw-1:0] sbox_perm_test;
421 always_comb begin : p_perm_check
422 sbox_perm_test = '0;
423 for (int k = 0; k < LfsrDw; k++) begin
424 sbox_perm_test[sbox_in_indices[k]] = 1'b1;
425 end
426 end
427 // All bit positions must be marked with 1.
428 `ASSERT(SboxPermutationCheck_A, &sbox_perm_test)
429 `endif
430
431 `ifdef FPV_ON
432 // Verify that the permutation indeed breaks linear shifting patterns of 4bit input groups.
433 // The symbolic variables let the FPV tool select all sbox index combinations and linear shift
434 // offsets.
435 int shift;
436 int unsigned sk, sj;
437 `ASSUME(SjSkRange_M, (sj < NumSboxes) && (sk < NumSboxes))
438 `ASSUME(SjSkDifferent_M, sj != sk)
439 `ASSUME(SjSkStable_M, ##1 $stable(sj) && $stable(sk) && $stable(shift))
440 `ASSERT(SboxInputIndexGroupIsUnique_A,
441 !((((sbox_in_indices[sj * 4 + 0] + shift) % LfsrDw) == sbox_in_indices[sk * 4 + 0]) &&
442 (((sbox_in_indices[sj * 4 + 1] + shift) % LfsrDw) == sbox_in_indices[sk * 4 + 1]) &&
443 (((sbox_in_indices[sj * 4 + 2] + shift) % LfsrDw) == sbox_in_indices[sk * 4 + 2]) &&
444 (((sbox_in_indices[sj * 4 + 3] + shift) % LfsrDw) == sbox_in_indices[sk * 4 + 3])))
445
446 // this checks that the permutations does not preserve neighboring bit positions.
447 // i.e. no two neighboring bits are mapped to neighboring bit positions.
448 int y;
449 int unsigned ik;
450 `ASSUME(IkYRange_M, (ik < LfsrDw) && (y == 1 || y == -1))
451 `ASSUME(IkStable_M, ##1 $stable(ik) && $stable(y))
452 `ASSERT(IndicesNotAdjacent_A, (sbox_in_indices[ik] - sbox_in_indices[(ik + y) % LfsrDw]) != 1)
453 `endif
454
455 // Use the permutation indices to create the SBox layer
456 for (genvar k = 0; k < NumSboxes; k++) begin : gen_sboxes
457 logic [3:0] sbox_in;
458 assign sbox_in = {lfsr_q[sbox_in_indices[k*4 + 3]],
459 lfsr_q[sbox_in_indices[k*4 + 2]],
460 lfsr_q[sbox_in_indices[k*4 + 1]],
461 lfsr_q[sbox_in_indices[k*4 + 0]]};
462 assign sbox_out[k*4 +: 4] = prim_cipher_pkg::PRINCE_SBOX4[sbox_in];
463 end
464 end else begin : gen_out_passthru
465 1/1 assign sbox_out = lfsr_q;
Tests: T1 T2 T3
466 end
467
468 // Random output permutation, defined at compile time
469 if (StatePermEn) begin : gen_state_perm
470
471 for (genvar k = 0; k < StateOutDw; k++) begin : gen_perm_loop
472 8/8 assign state_o[k] = sbox_out[StatePerm[k]];
Tests: T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3 | T1 T2 T3
473 end
474
475 // if lfsr width is greater than the output, then by definition
476 // not every bit will be picked
477 if (LfsrDw > StateOutDw) begin : gen_tieoff_unused
478 logic unused_sbox_out;
479 assign unused_sbox_out = ^sbox_out;
480 end
481
482 end else begin : gen_no_state_perm
483 assign state_o = StateOutDw'(sbox_out);
484 end
485
486 always_ff @(posedge clk_i or negedge rst_ni) begin : p_reg
487 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
488 1/1 lfsr_q <= DefaultSeedLocal;
Tests: T1 T2 T3
489 end else begin
490 1/1 lfsr_q <= lfsr_d;
Tests: T1 T2 T3
491 end
492 end
493
494
495 ///////////////////////
496 // shared assertions //
497 ///////////////////////
498
499 `ASSERT_KNOWN(DataKnownO_A, state_o)
500
501 // the code below is not meant to be synthesized,
502 // but it is intended to be used in simulation and FPV
503 `ifndef SYNTHESIS
504 function automatic logic [LfsrDw-1:0] compute_next_state(logic [LfsrDw-1:0] lfsrcoeffs,
505 logic [EntropyDw-1:0] entropy,
506 logic [LfsrDw-1:0] current_state);
507 logic state0;
508 logic [LfsrDw-1:0] next_state;
509
510 1/1 next_state = current_state;
Tests: T1 T2 T3
511
512 // Galois XOR
513 1/1 if (64'(LfsrType) == 64'("GAL_XOR")) begin
Tests: T1 T2 T3
514 1/1 if (next_state == 0) begin
Tests: T1 T2 T3
515 1/1 next_state = DefaultSeedLocal;
Tests: T1 T2 T3
516 end else begin
517 1/1 state0 = next_state[0];
Tests: T1 T2 T3
518 1/1 next_state = next_state >> 1;
Tests: T1 T2 T3
519 2/2 if (state0) next_state ^= lfsrcoeffs;
Tests: T1 T2 T3 | T1 T2 T3
MISSING_ELSE
520 1/1 next_state ^= LfsrDw'(entropy);
Tests: T1 T2 T3
521 end
522 // Fibonacci XNOR
523 unreachable end else if (64'(LfsrType) == "FIB_XNOR") begin
524 unreachable if (&next_state) begin
525 unreachable next_state = DefaultSeedLocal;
526 end else begin
527 unreachable state0 = ~(^(next_state & lfsrcoeffs));
528 unreachable next_state = next_state << 1;
529 unreachable next_state[0] = state0;
530 unreachable next_state ^= LfsrDw'(entropy);
531 end
532 end else begin
533 unreachable $error("unknown lfsr type");
534 end
535
536 1/1 return next_state;
Tests: T1 T2 T3
537 endfunction : compute_next_state
538
539 // check whether next state is computed correctly
540 // we shift the assertion by one clock cycle (##1) in order to avoid
541 // erroneous SVA triggers right after reset deassertion in cases where
542 // the precondition is true throughout the reset.
543 // this can happen since the disable_iff evaluates using unsampled values,
544 // meaning that the assertion may already read rst_ni == 1 on an active
545 // clock edge while the flops in the design have not yet changed state.
546 `ASSERT(NextStateCheck_A, ##1 lfsr_en_i && !seed_en_i |=> lfsr_q ==
547 compute_next_state(coeffs, $past(entropy_i), $past(lfsr_q)))
548
549 // Only check this if enabled.
550 if (StatePermEn) begin : gen_perm_check
551 // Check that the supplied permutation is valid.
552 logic [LfsrDw-1:0] lfsr_perm_test;
553 initial begin : p_perm_check
554 lfsr_perm_test = '0;
555 for (int k = 0; k < LfsrDw; k++) begin
556 lfsr_perm_test[StatePerm[k]] = 1'b1;
557 end
558 // All bit positions must be marked with 1.
559 `ASSERT_I(PermutationCheck_A, &lfsr_perm_test)
560 end
561 end
562
563 `endif
564
565 `ASSERT_INIT(InputWidth_A, LfsrDw >= EntropyDw)
566 `ASSERT_INIT(OutputWidth_A, LfsrDw >= StateOutDw)
567
568 // MSB must be one in any case
569 `ASSERT(CoeffCheck_A, coeffs[LfsrDw-1])
570
571 // output check
572 `ASSERT_KNOWN(OutputKnown_A, state_o)
573 if (!StatePermEn && !NonLinearOut) begin : gen_output_sva
574 `ASSERT(OutputCheck_A, state_o == StateOutDw'(lfsr_q))
575 end
576 // if no external input changes the lfsr state, a lockup must not occur (by design)
577 //`ASSERT(NoLockups_A, (!entropy_i) && (!seed_en_i) |=> !lockup, clk_i, !rst_ni)
578 `ASSERT(NoLockups_A, lfsr_en_i && !entropy_i && !seed_en_i |=> !lockup)
579
580 // this can be disabled if unused in order to not distort coverage
581 if (ExtSeedSVA) begin : gen_ext_seed_sva
582 // check that external seed is correctly loaded into the state
583 // rst_ni is used directly as part of the pre-condition since the usage of rst_ni
584 // in disable_iff is unsampled. See #1985 for more details
585 `ASSERT(ExtDefaultSeedInputCheck_A, (seed_en_i && rst_ni) |=> lfsr_q == $past(seed_i))
586 end
587
588 // if the external seed mechanism is not used,
589 // there is theoretically no way we end up in a lockup condition
590 // in order to not distort coverage, this SVA can be disabled in such cases
591 if (LockupSVA) begin : gen_lockup_mechanism_sva
592 // check that a stuck LFSR is correctly reseeded
593 `ASSERT(LfsrLockupCheck_A, lfsr_en_i && lockup && !seed_en_i |=> !lockup)
594 end
595
596 // If non-linear output requested, the LFSR width must be a power of 2 and greater than 16.
597 if(NonLinearOut) begin : gen_nonlinear_align_check_sva
598 `ASSERT_INIT(SboxByteAlign_A, 2**$clog2(LfsrDw) == LfsrDw && LfsrDw >= 16)
599 end
600
601 if (MaxLenSVA) begin : gen_max_len_sva
602 `ifndef SYNTHESIS
603 // the code below is a workaround to enable long sequences to be checked.
604 // some simulators do not support SVA sequences longer than 2**32-1.
605 logic [LfsrDw-1:0] cnt_d, cnt_q;
606 logic perturbed_d, perturbed_q;
607 logic [LfsrDw-1:0] cmp_val;
608
609 assign cmp_val = {{(LfsrDw-1){1'b1}}, 1'b0}; // 2**LfsrDw-2
610 1/1 assign cnt_d = (lfsr_en_i && lockup) ? '0 :
Tests: T1 T2 T3
611 (lfsr_en_i && (cnt_q == cmp_val)) ? '0 :
612 (lfsr_en_i) ? cnt_q + 1'b1 :
613 cnt_q;
614
615 1/1 assign perturbed_d = perturbed_q | (|entropy_i) | seed_en_i;
Tests: T1 T2 T3
616
617 always_ff @(posedge clk_i or negedge rst_ni) begin : p_max_len
618 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
619 1/1 cnt_q <= '0;
Tests: T1 T2 T3
620 1/1 perturbed_q <= 1'b0;
Tests: T1 T2 T3
621 end else begin
622 1/1 cnt_q <= cnt_d;
Tests: T1 T2 T3
623 1/1 perturbed_q <= perturbed_d;
Tests: T1 T2 T3
Cond Coverage for Instance : prim_lfsr_tb.gen_duts[8].i_prim_lfsr
| Total | Covered | Percent |
Conditions | 29 | 28 | 96.55 |
Logical | 29 | 28 | 96.55 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 345
EXPRESSION (seed_en_i ? seed_i : ((lfsr_en_i && lockup) ? DefaultSeedLocal : (lfsr_en_i ? next_lfsr_state : lfsr_q)))
----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 345
SUB-EXPRESSION ((lfsr_en_i && lockup) ? DefaultSeedLocal : (lfsr_en_i ? next_lfsr_state : lfsr_q))
----------1----------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 345
SUB-EXPRESSION (lfsr_en_i && lockup)
----1---- ---2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 345
SUB-EXPRESSION (lfsr_en_i ? next_lfsr_state : lfsr_q)
----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 514
EXPRESSION (next_state == 8'b0)
----------1---------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 610
EXPRESSION
Number Term
1 (lfsr_en_i && lockup) ? '0 : ((lfsr_en_i && (gen_max_len_sva.cnt_q == gen_max_len_sva.cmp_val)) ? '0 : (lfsr_en_i ? ((gen_max_len_sva.cnt_q + 1'b1)) : gen_max_len_sva.cnt_q)))
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION (lfsr_en_i && lockup)
----1---- ---2--
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION ((lfsr_en_i && (gen_max_len_sva.cnt_q == gen_max_len_sva.cmp_val)) ? '0 : (lfsr_en_i ? ((gen_max_len_sva.cnt_q + 1'b1)) : gen_max_len_sva.cnt_q))
--------------------------------1--------------------------------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION (lfsr_en_i && (gen_max_len_sva.cnt_q == gen_max_len_sva.cmp_val))
----1---- -------------------------2------------------------
-1- | -2- | Status | Tests |
0 | 1 | Not Covered | |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION (gen_max_len_sva.cnt_q == gen_max_len_sva.cmp_val)
-------------------------1------------------------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 610
SUB-EXPRESSION (lfsr_en_i ? ((gen_max_len_sva.cnt_q + 1'b1)) : gen_max_len_sva.cnt_q)
----1----
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T1,T2,T3 |
LINE 615
EXPRESSION (gen_max_len_sva.perturbed_q | ((|entropy_i)) | seed_en_i)
-------------1------------- -------2------ ----3----
-1- | -2- | -3- | Status | Tests |
0 | 0 | 0 | Covered | T1,T2,T3 |
0 | 0 | 1 | Covered | T1,T2,T4 |
0 | 1 | 0 | Covered | T1,T2,T3 |
1 | 0 | 0 | Covered | T1,T2,T3 |
Toggle Coverage for Instance : prim_lfsr_tb.gen_duts[8].i_prim_lfsr
| Total | Covered | Percent |
Totals |
7 |
7 |
100.00 |
Total Bits |
56 |
56 |
100.00 |
Total Bits 0->1 |
28 |
28 |
100.00 |
Total Bits 1->0 |
28 |
28 |
100.00 |
| | | |
Ports |
7 |
7 |
100.00 |
Port Bits |
56 |
56 |
100.00 |
Port Bits 0->1 |
28 |
28 |
100.00 |
Port Bits 1->0 |
28 |
28 |
100.00 |
Port Details
Name | Toggle | Toggle 1->0 | Tests | Toggle 0->1 | Tests | Direction |
clk_i |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
rst_ni |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
seed_en_i |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
seed_i[7:0] |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
lfsr_en_i |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
entropy_i[7:0] |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
INPUT |
state_o[7:0] |
Yes |
Yes |
T1,T2,T3 |
Yes |
T1,T2,T3 |
OUTPUT |
Branch Coverage for Instance : prim_lfsr_tb.gen_duts[8].i_prim_lfsr
| Line No. | Total | Covered | Percent |
Branches |
|
15 |
15 |
100.00 |
TERNARY |
345 |
4 |
4 |
100.00 |
TERNARY |
610 |
4 |
4 |
100.00 |
IF |
487 |
2 |
2 |
100.00 |
IF |
618 |
2 |
2 |
100.00 |
IF |
513 |
3 |
3 |
100.00 |
345 assign lfsr_d = (seed_en_i) ? seed_i :
-1-
==>
346 (lfsr_en_i && lockup) ? DefaultSeedLocal :
-2-
==>
347 (lfsr_en_i) ? next_lfsr_state :
-3-
==>
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T1,T2,T3 |
0 |
0 |
1 |
Covered |
T1,T2,T3 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
610 assign cnt_d = (lfsr_en_i && lockup) ? '0 :
-1-
==>
611 (lfsr_en_i && (cnt_q == cmp_val)) ? '0 :
-2-
==>
612 (lfsr_en_i) ? cnt_q + 1'b1 :
-3-
==>
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T1,T2,T3 |
0 |
0 |
1 |
Covered |
T1,T2,T3 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
487 if (!rst_ni) begin
-1-
488 lfsr_q <= DefaultSeedLocal;
==>
489 end else begin
490 lfsr_q <= lfsr_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
618 if (!rst_ni) begin
-1-
619 cnt_q <= '0;
==>
620 perturbed_q <= 1'b0;
621 end else begin
622 cnt_q <= cnt_d;
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
513 if (64'(LfsrType) == 64'("GAL_XOR")) begin
-1-
514 if (next_state == 0) begin
-2-
515 next_state = DefaultSeedLocal;
==>
516 end else begin
517 state0 = next_state[0];
518 next_state = next_state >> 1;
519 if (state0) next_state ^= lfsrcoeffs;
-3-
==>
MISSING_ELSE
==>
520 next_state ^= LfsrDw'(entropy);
521 end
522 // Fibonacci XNOR
523 end else if (64'(LfsrType) == "FIB_XNOR") begin
-4-
524 if (&next_state) begin
-5-
525 next_state = DefaultSeedLocal;
==> (Unreachable)
526 end else begin
527 state0 = ~(^(next_state & lfsrcoeffs));
==> (Unreachable)
528 next_state = next_state << 1;
529 next_state[0] = state0;
530 next_state ^= LfsrDw'(entropy);
531 end
532 end else begin
533 $error("unknown lfsr type");
==> (Unreachable)
Branches:
-1- | -2- | -3- | -4- | -5- | Status | Tests |
1 |
1 |
- |
- |
- |
Covered |
T1,T2,T3 |
1 |
0 |
1 |
- |
- |
Covered |
T1,T2,T3 |
1 |
0 |
0 |
- |
- |
Covered |
T1,T2,T3 |
0 |
- |
- |
1 |
1 |
Unreachable |
T5,T6,T7 |
0 |
- |
- |
1 |
0 |
Unreachable |
T5,T6,T7 |
0 |
- |
- |
0 |
- |
Unreachable |
|
Assert Coverage for Instance : prim_lfsr_tb.gen_duts[8].i_prim_lfsr
Assertion Details
CoeffCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
1556486 |
0 |
0 |
T1 |
54708 |
7099 |
0 |
0 |
T2 |
62448 |
7883 |
0 |
0 |
T3 |
65564 |
8273 |
0 |
0 |
T4 |
45924 |
5923 |
0 |
0 |
T8 |
47263 |
6404 |
0 |
0 |
T9 |
45693 |
5840 |
0 |
0 |
T10 |
50146 |
6545 |
0 |
0 |
T11 |
72899 |
9627 |
0 |
0 |
T12 |
51880 |
6829 |
0 |
0 |
T13 |
63507 |
8167 |
0 |
0 |
DataKnownO_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
1556486 |
0 |
0 |
T1 |
54708 |
7099 |
0 |
0 |
T2 |
62448 |
7883 |
0 |
0 |
T3 |
65564 |
8273 |
0 |
0 |
T4 |
45924 |
5923 |
0 |
0 |
T8 |
47263 |
6404 |
0 |
0 |
T9 |
45693 |
5840 |
0 |
0 |
T10 |
50146 |
6545 |
0 |
0 |
T11 |
72899 |
9627 |
0 |
0 |
T12 |
51880 |
6829 |
0 |
0 |
T13 |
63507 |
8167 |
0 |
0 |
InputWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
200 |
200 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
NextStateCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
360184 |
0 |
200 |
T1 |
54708 |
1709 |
0 |
1 |
T2 |
62448 |
1831 |
0 |
1 |
T3 |
65564 |
1938 |
0 |
1 |
T4 |
45924 |
1394 |
0 |
1 |
T8 |
47263 |
1530 |
0 |
1 |
T9 |
45693 |
1360 |
0 |
1 |
T10 |
50146 |
1581 |
0 |
1 |
T11 |
72899 |
2197 |
0 |
1 |
T12 |
51880 |
1631 |
0 |
1 |
T13 |
63507 |
1924 |
0 |
1 |
NoLockups_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
52553 |
0 |
0 |
T1 |
54708 |
263 |
0 |
0 |
T2 |
62448 |
263 |
0 |
0 |
T3 |
65564 |
261 |
0 |
0 |
T4 |
45924 |
260 |
0 |
0 |
T8 |
47263 |
260 |
0 |
0 |
T9 |
45693 |
263 |
0 |
0 |
T10 |
50146 |
262 |
0 |
0 |
T11 |
72899 |
265 |
0 |
0 |
T12 |
51880 |
263 |
0 |
0 |
T13 |
63507 |
260 |
0 |
0 |
OutputKnown_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
1556486 |
0 |
0 |
T1 |
54708 |
7099 |
0 |
0 |
T2 |
62448 |
7883 |
0 |
0 |
T3 |
65564 |
8273 |
0 |
0 |
T4 |
45924 |
5923 |
0 |
0 |
T8 |
47263 |
6404 |
0 |
0 |
T9 |
45693 |
5840 |
0 |
0 |
T10 |
50146 |
6545 |
0 |
0 |
T11 |
72899 |
9627 |
0 |
0 |
T12 |
51880 |
6829 |
0 |
0 |
T13 |
63507 |
8167 |
0 |
0 |
OutputWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
200 |
200 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
gen_ext_seed_sva.ExtDefaultSeedInputCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
680322 |
0 |
0 |
T1 |
54708 |
3082 |
0 |
0 |
T2 |
62448 |
3361 |
0 |
0 |
T3 |
65564 |
3571 |
0 |
0 |
T4 |
45924 |
2573 |
0 |
0 |
T8 |
47263 |
2787 |
0 |
0 |
T9 |
45693 |
2522 |
0 |
0 |
T10 |
50146 |
2760 |
0 |
0 |
T11 |
72899 |
4278 |
0 |
0 |
T12 |
51880 |
2928 |
0 |
0 |
T13 |
63507 |
3503 |
0 |
0 |
gen_fib_xnor.DefaultSeedNzCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
100 |
100 |
0 |
0 |
T5 |
1 |
1 |
0 |
0 |
T6 |
1 |
1 |
0 |
0 |
T7 |
1 |
1 |
0 |
0 |
T24 |
1 |
1 |
0 |
0 |
T25 |
1 |
1 |
0 |
0 |
T26 |
1 |
1 |
0 |
0 |
T27 |
1 |
1 |
0 |
0 |
T28 |
1 |
1 |
0 |
0 |
T29 |
1 |
1 |
0 |
0 |
T30 |
1 |
1 |
0 |
0 |
gen_fib_xnor.gen_lut.MaxLfsrWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
100 |
100 |
0 |
0 |
T5 |
1 |
1 |
0 |
0 |
T6 |
1 |
1 |
0 |
0 |
T7 |
1 |
1 |
0 |
0 |
T24 |
1 |
1 |
0 |
0 |
T25 |
1 |
1 |
0 |
0 |
T26 |
1 |
1 |
0 |
0 |
T27 |
1 |
1 |
0 |
0 |
T28 |
1 |
1 |
0 |
0 |
T29 |
1 |
1 |
0 |
0 |
T30 |
1 |
1 |
0 |
0 |
gen_fib_xnor.gen_lut.MinLfsrWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
100 |
100 |
0 |
0 |
T5 |
1 |
1 |
0 |
0 |
T6 |
1 |
1 |
0 |
0 |
T7 |
1 |
1 |
0 |
0 |
T24 |
1 |
1 |
0 |
0 |
T25 |
1 |
1 |
0 |
0 |
T26 |
1 |
1 |
0 |
0 |
T27 |
1 |
1 |
0 |
0 |
T28 |
1 |
1 |
0 |
0 |
T29 |
1 |
1 |
0 |
0 |
T30 |
1 |
1 |
0 |
0 |
gen_gal_xor.DefaultSeedNzCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
100 |
100 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
gen_gal_xor.gen_lut.MaxLfsrWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
100 |
100 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
gen_gal_xor.gen_lut.MinLfsrWidth_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
100 |
100 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
gen_lockup_mechanism_sva.LfsrLockupCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
1362 |
0 |
0 |
T1 |
54708 |
8 |
0 |
0 |
T2 |
62448 |
6 |
0 |
0 |
T3 |
65564 |
5 |
0 |
0 |
T4 |
45924 |
3 |
0 |
0 |
T8 |
47263 |
4 |
0 |
0 |
T9 |
45693 |
6 |
0 |
0 |
T10 |
50146 |
7 |
0 |
0 |
T11 |
72899 |
9 |
0 |
0 |
T12 |
51880 |
7 |
0 |
0 |
T13 |
63507 |
8 |
0 |
0 |
gen_max_len_sva.MaximalLengthCheck0_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
4746 |
0 |
0 |
T1 |
54708 |
28 |
0 |
0 |
T2 |
62448 |
32 |
0 |
0 |
T3 |
65564 |
16 |
0 |
0 |
T4 |
45924 |
31 |
0 |
0 |
T8 |
47263 |
26 |
0 |
0 |
T9 |
45693 |
26 |
0 |
0 |
T10 |
50146 |
20 |
0 |
0 |
T11 |
72899 |
22 |
0 |
0 |
T12 |
51880 |
26 |
0 |
0 |
T13 |
63507 |
28 |
0 |
0 |
gen_max_len_sva.MaximalLengthCheck1_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
11817020 |
50800 |
0 |
0 |
T1 |
54708 |
254 |
0 |
0 |
T2 |
62448 |
254 |
0 |
0 |
T3 |
65564 |
254 |
0 |
0 |
T4 |
45924 |
254 |
0 |
0 |
T8 |
47263 |
254 |
0 |
0 |
T9 |
45693 |
254 |
0 |
0 |
T10 |
50146 |
254 |
0 |
0 |
T11 |
72899 |
254 |
0 |
0 |
T12 |
51880 |
254 |
0 |
0 |
T13 |
63507 |
254 |
0 |
0 |
gen_perm_check.p_perm_check.PermutationCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
200 |
200 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |
p_randomize_default_seed.DefaultSeedLocalRandomizeCheck_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
200 |
200 |
0 |
0 |
T1 |
1 |
1 |
0 |
0 |
T2 |
1 |
1 |
0 |
0 |
T3 |
1 |
1 |
0 |
0 |
T4 |
1 |
1 |
0 |
0 |
T8 |
1 |
1 |
0 |
0 |
T9 |
1 |
1 |
0 |
0 |
T10 |
1 |
1 |
0 |
0 |
T11 |
1 |
1 |
0 |
0 |
T12 |
1 |
1 |
0 |
0 |
T13 |
1 |
1 |
0 |
0 |