Line Coverage for Module :
tlul_lc_gate
| Line No. | Total | Covered | Percent |
TOTAL | | 51 | 45 | 88.24 |
CONT_ASSIGN | 84 | 1 | 1 | 100.00 |
CONT_ASSIGN | 85 | 1 | 1 | 100.00 |
ALWAYS | 144 | 3 | 3 | 100.00 |
CONT_ASSIGN | 149 | 1 | 1 | 100.00 |
CONT_ASSIGN | 150 | 1 | 1 | 100.00 |
ALWAYS | 153 | 6 | 6 | 100.00 |
ALWAYS | 164 | 28 | 22 | 78.57 |
ALWAYS | 230 | 10 | 10 | 100.00 |
83 // Assign signals on the device side.
84 1/1 assign tl_h2d_o = tl_h2d_int[NumGatesPerDirection];
Tests: T1 T2 T3
85 1/1 assign tl_d2h_int[NumGatesPerDirection] = tl_d2h_i;
Tests: T1 T2 T3
86
87 ///////////////////////////
88 // Host Side Interposing //
89 ///////////////////////////
90
91 // Encoding generated with:
92 // $ ./util/design/sparse-fsm-encode.py -d 5 -m 4 -n 8 \
93 // -s 3379253306 --language=sv
94 //
95 // Hamming distance histogram:
96 //
97 // 0: --
98 // 1: --
99 // 2: --
100 // 3: --
101 // 4: --
102 // 5: |||||||||||||||||||| (66.67%)
103 // 6: |||||||||| (33.33%)
104 // 7: --
105 // 8: --
106 //
107 // Minimum Hamming distance: 5
108 // Maximum Hamming distance: 6
109 // Minimum Hamming weight: 3
110 // Maximum Hamming weight: 5
111 //
112 // Encoding generated with:
113 // $ ./util/design/sparse-fsm-encode.py -d 5 -m 5 -n 9 \
114 // -s 686407169 --language=sv
115 //
116 // Hamming distance histogram:
117 //
118 // 0: --
119 // 1: --
120 // 2: --
121 // 3: --
122 // 4: --
123 // 5: |||||||||||||||||||| (60.00%)
124 // 6: ||||||||||||| (40.00%)
125 // 7: --
126 // 8: --
127 // 9: --
128 //
129 // Minimum Hamming distance: 5
130 // Maximum Hamming distance: 6
131 // Minimum Hamming weight: 3
132 // Maximum Hamming weight: 6
133 //
134 localparam int StateWidth = 9;
135 typedef enum logic [StateWidth-1:0] {
136 StActive = 9'b100100001,
137 StOutstanding = 9'b011100111,
138 StFlush = 9'b001001100,
139 StError = 9'b010111010,
140 StErrorOutstanding = 9'b100010110
141 } state_e;
142
143 state_e state_d, state_q;
144 3/3 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StError)
Tests: T1 T2 T3 | T1 T2 T3 | T1 T2 T3
PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StError):
144.1 `ifdef SIMULATION
144.2 prim_sparse_fsm_flop #(
144.3 .StateEnumT(state_e),
144.4 .Width($bits(state_e)),
144.5 .ResetValue($bits(state_e)'(StError)),
144.6 .EnableAlertTriggerSVA(1),
144.7 .CustomForceName("state_q")
144.8 ) u_state_regs (
144.9 .clk_i ( clk_i ),
144.10 .rst_ni ( rst_ni ),
144.11 .state_i ( state_d ),
144.12 .state_o ( )
144.13 );
144.14 always_ff @(posedge clk_i or negedge rst_ni) begin
144.15 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
144.16 1/1 state_q <= StError;
Tests: T1 T2 T3
144.17 end else begin
144.18 1/1 state_q <= state_d;
Tests: T1 T2 T3
144.19 end
144.20 end
144.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o))
144.22 else begin
144.23 `ifdef UVM
144.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE,
144.25 "../src/lowrisc_tlul_lc_gate_0.1/rtl/tlul_lc_gate.sv", 144, "", 1);
144.26 `else
144.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__,
144.28 `PRIM_STRINGIFY(u_state_regs_A));
144.29 `endif
144.30 end
144.31 `else
144.32 prim_sparse_fsm_flop #(
144.33 .StateEnumT(state_e),
144.34 .Width($bits(state_e)),
144.35 .ResetValue($bits(state_e)'(StError)),
144.36 .EnableAlertTriggerSVA(1)
144.37 ) u_state_regs (
144.38 .clk_i ( `PRIM_FLOP_CLK ),
144.39 .rst_ni ( `PRIM_FLOP_RST ),
144.40 .state_i ( state_d ),
144.41 .state_o ( state_q )
144.42 );
144.43 `endif145
146 logic [1:0] outstanding_txn;
147 logic a_ack;
148 logic d_ack;
149 1/1 assign a_ack = tl_h2d_i.a_valid & tl_d2h_o.a_ready;
Tests: T1 T2 T3
150 1/1 assign d_ack = tl_h2d_i.d_ready & tl_d2h_o.d_valid;
Tests: T1 T2 T3
151
152 always_ff @(posedge clk_i or negedge rst_ni) begin
153 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
154 1/1 outstanding_txn <= '0;
Tests: T1 T2 T3
155 1/1 end else if (a_ack && !d_ack) begin
Tests: T1 T2 T3
156 1/1 outstanding_txn <= outstanding_txn + 1'b1;
Tests: T2 T3 T4
157 1/1 end else if (d_ack && !a_ack) begin
Tests: T1 T2 T3
158 1/1 outstanding_txn <= outstanding_txn - 1'b1;
Tests: T2 T3 T4
159 end
MISSING_ELSE
160 end
161
162 logic block_cmd;
163 always_comb begin
164 1/1 block_cmd = '0;
Tests: T1 T2 T3
165 1/1 state_d = state_q;
Tests: T1 T2 T3
166 1/1 err_en = Off;
Tests: T1 T2 T3
167 1/1 err_o = '0;
Tests: T1 T2 T3
168 1/1 flush_ack_o = '0;
Tests: T1 T2 T3
169 1/1 resp_pending_o = 1'b0;
Tests: T1 T2 T3
170
171 1/1 unique case (state_q)
Tests: T1 T2 T3
172 StActive: begin
173 1/1 if (lc_tx_test_false_loose(lc_en_i) || flush_req_i) begin
Tests: T1 T2 T3
174 1/1 state_d = StOutstanding;
Tests: T3 T5 T6
175 end
MISSING_ELSE
176 1/1 if (outstanding_txn != '0) begin
Tests: T1 T2 T3
177 1/1 resp_pending_o = 1'b1;
Tests: T2 T3 T4
178 end
MISSING_ELSE
179 end
180
181 StOutstanding: begin
182 1/1 block_cmd = 1'b1;
Tests: T3 T5 T6
183 1/1 if (outstanding_txn == '0) begin
Tests: T3 T5 T6
184 1/1 state_d = lc_tx_test_false_loose(lc_en_i) ? StError : StFlush;
Tests: T3 T5 T6
185 end else begin
186 1/1 resp_pending_o = 1'b1;
Tests: T3 T6 T7
187 end
188 end
189
190 StFlush: begin
191 0/1 ==> block_cmd = 1'b1;
192 0/1 ==> flush_ack_o = 1'b1;
193 0/1 ==> if (lc_tx_test_false_loose(lc_en_i)) begin
194 0/1 ==> state_d = StError;
195 0/1 ==> end else if (!flush_req_i) begin
196 0/1 ==> state_d = StActive;
197 end
==> MISSING_ELSE
198 end
199
200 StError: begin
201 1/1 err_en = On;
Tests: T1 T2 T3
202 1/1 if (lc_tx_test_true_strict(lc_en_i)) begin
Tests: T1 T2 T3
203 1/1 state_d = StErrorOutstanding;
Tests: T1 T2 T3
204 end
MISSING_ELSE
205 end
206
207 StErrorOutstanding: begin
208 1/1 err_en = On;
Tests: T1 T2 T3
209 1/1 block_cmd = 1'b1;
Tests: T1 T2 T3
210 1/1 if (outstanding_txn == '0) begin
Tests: T1 T2 T3
211 1/1 state_d = StActive;
Tests: T1 T2 T3
212 end
==> MISSING_ELSE
213 end
214
215 default: begin
216 err_o = 1'b1;
217 err_en = On;
218 end
219
220 endcase // unique case (state_q)
221 end
222
223
224 // At the host side, we interpose the ready / valid signals so that we can return a bus error
225 // in case the lc signal is not set to ON. Note that this logic does not have to be duplicated
226 // since erroring back is considered a convenience feature so that the bus does not lock up.
227 tl_h2d_t tl_h2d_error;
228 tl_d2h_t tl_d2h_error;
229 always_comb begin
230 1/1 tl_h2d_int[0] = tl_h2d_i;
Tests: T1 T2 T3
231 1/1 tl_d2h_o = tl_d2h_int[0];
Tests: T1 T2 T3
232 1/1 tl_h2d_error = '0;
Tests: T1 T2 T3
233
234 1/1 if (lc_tx_test_true_loose(err_en)) begin
Tests: T1 T2 T3
235 1/1 tl_h2d_error = tl_h2d_i;
Tests: T1 T2 T3
236 1/1 tl_d2h_o = tl_d2h_error;
Tests: T1 T2 T3
237 end
MISSING_ELSE
238
239 1/1 if (block_cmd) begin
Tests: T1 T2 T3
240 1/1 tl_d2h_o.a_ready = 1'b0;
Tests: T1 T2 T3
241 1/1 tl_h2d_int[0].a_valid = 1'b0;
Tests: T1 T2 T3
242 1/1 tl_h2d_error.a_valid = 1'b0;
Tests: T1 T2 T3
243 end
MISSING_ELSE
Cond Coverage for Module :
tlul_lc_gate
| Total | Covered | Percent |
Conditions | 18 | 17 | 94.44 |
Logical | 18 | 17 | 94.44 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 149
EXPRESSION (tl_h2d_i.a_valid & tl_d2h_o.a_ready)
--------1------- --------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T3,T4 |
1 | 1 | Covered | T2,T3,T4 |
LINE 150
EXPRESSION (tl_h2d_i.d_ready & tl_d2h_o.d_valid)
--------1------- --------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T3,T5,T8 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T2,T3,T4 |
LINE 155
EXPRESSION (a_ack && ((!d_ack)))
--1-- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T3,T9 |
1 | 1 | Covered | T2,T3,T4 |
LINE 157
EXPRESSION (d_ack && ((!a_ack)))
--1-- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T3,T9 |
1 | 1 | Covered | T2,T3,T4 |
LINE 176
EXPRESSION (outstanding_txn != '0)
-----------1-----------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T3,T4 |
LINE 183
EXPRESSION (outstanding_txn == '0)
-----------1-----------
-1- | Status | Tests |
0 | Covered | T3,T6,T7 |
1 | Covered | T3,T5,T6 |
LINE 210
EXPRESSION (outstanding_txn == '0)
-----------1-----------
-1- | Status | Tests |
0 | Not Covered | |
1 | Covered | T1,T2,T3 |
FSM Coverage for Module :
tlul_lc_gate
Summary for FSM :: state_q
| Total | Covered | Percent | |
States |
5 |
4 |
80.00 |
(Not included in score) |
Transitions |
7 |
4 |
57.14 |
|
Sequences |
0 |
0 |
|
|
State, Transition and Sequence Details for FSM :: state_q
states | Line No. | Covered | Tests |
StActive |
196 |
Covered |
T1,T2,T3 |
StError |
184 |
Covered |
T1,T2,T3 |
StErrorOutstanding |
203 |
Covered |
T1,T2,T3 |
StFlush |
184 |
Not Covered |
|
StOutstanding |
174 |
Covered |
T3,T5,T6 |
transitions | Line No. | Covered | Tests |
StActive->StOutstanding |
174 |
Covered |
T3,T5,T6 |
StError->StErrorOutstanding |
203 |
Covered |
T1,T2,T3 |
StErrorOutstanding->StActive |
211 |
Covered |
T1,T2,T3 |
StFlush->StActive |
196 |
Not Covered |
|
StFlush->StError |
194 |
Not Covered |
|
StOutstanding->StError |
184 |
Covered |
T3,T5,T6 |
StOutstanding->StFlush |
184 |
Not Covered |
|
Branch Coverage for Module :
tlul_lc_gate
| Line No. | Total | Covered | Percent |
Branches |
|
24 |
19 |
79.17 |
IF |
144 |
2 |
2 |
100.00 |
IF |
153 |
4 |
4 |
100.00 |
CASE |
171 |
14 |
9 |
64.29 |
IF |
234 |
2 |
2 |
100.00 |
IF |
239 |
2 |
2 |
100.00 |
144 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StError)
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
153 if (!rst_ni) begin
-1-
154 outstanding_txn <= '0;
==>
155 end else if (a_ack && !d_ack) begin
-2-
156 outstanding_txn <= outstanding_txn + 1'b1;
==>
157 end else if (d_ack && !a_ack) begin
-3-
158 outstanding_txn <= outstanding_txn - 1'b1;
==>
159 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T2,T3,T4 |
0 |
0 |
1 |
Covered |
T2,T3,T4 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
171 unique case (state_q)
-1-
172 StActive: begin
173 if (lc_tx_test_false_loose(lc_en_i) || flush_req_i) begin
-2-
174 state_d = StOutstanding;
==>
175 end
MISSING_ELSE
==>
176 if (outstanding_txn != '0) begin
-3-
177 resp_pending_o = 1'b1;
==>
178 end
MISSING_ELSE
==>
179 end
180
181 StOutstanding: begin
182 block_cmd = 1'b1;
183 if (outstanding_txn == '0) begin
-4-
184 state_d = lc_tx_test_false_loose(lc_en_i) ? StError : StFlush;
==>
185 end else begin
186 resp_pending_o = 1'b1;
==>
187 end
188 end
189
190 StFlush: begin
191 block_cmd = 1'b1;
192 flush_ack_o = 1'b1;
193 if (lc_tx_test_false_loose(lc_en_i)) begin
-5-
194 state_d = StError;
==>
195 end else if (!flush_req_i) begin
-6-
196 state_d = StActive;
==>
197 end
MISSING_ELSE
==>
198 end
199
200 StError: begin
201 err_en = On;
202 if (lc_tx_test_true_strict(lc_en_i)) begin
-7-
203 state_d = StErrorOutstanding;
==>
204 end
MISSING_ELSE
==>
205 end
206
207 StErrorOutstanding: begin
208 err_en = On;
209 block_cmd = 1'b1;
210 if (outstanding_txn == '0) begin
-8-
211 state_d = StActive;
==>
212 end
MISSING_ELSE
==>
213 end
214
215 default: begin
216 err_o = 1'b1;
==>
Branches:
-1- | -2- | -3- | -4- | -5- | -6- | -7- | -8- | Status | Tests |
StActive |
1 |
- |
- |
- |
- |
- |
- |
Covered |
T3,T5,T6 |
StActive |
0 |
- |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
StActive |
- |
1 |
- |
- |
- |
- |
- |
Covered |
T2,T3,T4 |
StActive |
- |
0 |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
StOutstanding |
- |
- |
1 |
- |
- |
- |
- |
Covered |
T3,T5,T6 |
StOutstanding |
- |
- |
0 |
- |
- |
- |
- |
Covered |
T3,T6,T7 |
StFlush |
- |
- |
- |
1 |
- |
- |
- |
Not Covered |
|
StFlush |
- |
- |
- |
0 |
1 |
- |
- |
Not Covered |
|
StFlush |
- |
- |
- |
0 |
0 |
- |
- |
Not Covered |
|
StError |
- |
- |
- |
- |
- |
1 |
- |
Covered |
T1,T2,T3 |
StError |
- |
- |
- |
- |
- |
0 |
- |
Covered |
T3,T5,T6 |
StErrorOutstanding |
- |
- |
- |
- |
- |
- |
1 |
Covered |
T1,T2,T3 |
StErrorOutstanding |
- |
- |
- |
- |
- |
- |
0 |
Not Covered |
|
default |
- |
- |
- |
- |
- |
- |
- |
Not Covered |
|
234 if (lc_tx_test_true_loose(err_en)) begin
-1-
235 tl_h2d_error = tl_h2d_i;
==>
236 tl_d2h_o = tl_d2h_error;
237 end
MISSING_ELSE
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
239 if (block_cmd) begin
-1-
240 tl_d2h_o.a_ready = 1'b0;
==>
241 tl_h2d_int[0].a_valid = 1'b0;
242 tl_h2d_error.a_valid = 1'b0;
243 end
MISSING_ELSE
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
Assert Coverage for Module :
tlul_lc_gate
Assertion Details
OutStandingOvfl_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
300519288 |
0 |
0 |
0 |
u_state_regs_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
300519288 |
300410729 |
0 |
0 |
T1 |
1803 |
1741 |
0 |
0 |
T2 |
6026 |
5964 |
0 |
0 |
T3 |
11544 |
11419 |
0 |
0 |
T4 |
5695 |
5640 |
0 |
0 |
T5 |
16001 |
10504 |
0 |
0 |
T8 |
28898 |
28846 |
0 |
0 |
T9 |
3560 |
3509 |
0 |
0 |
T10 |
864 |
785 |
0 |
0 |
T11 |
821 |
771 |
0 |
0 |
T12 |
2413 |
2359 |
0 |
0 |
Line Coverage for Instance : tb.dut.u_tlul_lc_gate
| Line No. | Total | Covered | Percent |
TOTAL | | 45 | 45 | 100.00 |
CONT_ASSIGN | 84 | 1 | 1 | 100.00 |
CONT_ASSIGN | 85 | 1 | 1 | 100.00 |
ALWAYS | 144 | 3 | 3 | 100.00 |
CONT_ASSIGN | 149 | 1 | 1 | 100.00 |
CONT_ASSIGN | 150 | 1 | 1 | 100.00 |
ALWAYS | 153 | 6 | 6 | 100.00 |
ALWAYS | 164 | 22 | 22 | 100.00 |
ALWAYS | 230 | 10 | 10 | 100.00 |
83 // Assign signals on the device side.
84 1/1 assign tl_h2d_o = tl_h2d_int[NumGatesPerDirection];
Tests: T1 T2 T3
85 1/1 assign tl_d2h_int[NumGatesPerDirection] = tl_d2h_i;
Tests: T1 T2 T3
86
87 ///////////////////////////
88 // Host Side Interposing //
89 ///////////////////////////
90
91 // Encoding generated with:
92 // $ ./util/design/sparse-fsm-encode.py -d 5 -m 4 -n 8 \
93 // -s 3379253306 --language=sv
94 //
95 // Hamming distance histogram:
96 //
97 // 0: --
98 // 1: --
99 // 2: --
100 // 3: --
101 // 4: --
102 // 5: |||||||||||||||||||| (66.67%)
103 // 6: |||||||||| (33.33%)
104 // 7: --
105 // 8: --
106 //
107 // Minimum Hamming distance: 5
108 // Maximum Hamming distance: 6
109 // Minimum Hamming weight: 3
110 // Maximum Hamming weight: 5
111 //
112 // Encoding generated with:
113 // $ ./util/design/sparse-fsm-encode.py -d 5 -m 5 -n 9 \
114 // -s 686407169 --language=sv
115 //
116 // Hamming distance histogram:
117 //
118 // 0: --
119 // 1: --
120 // 2: --
121 // 3: --
122 // 4: --
123 // 5: |||||||||||||||||||| (60.00%)
124 // 6: ||||||||||||| (40.00%)
125 // 7: --
126 // 8: --
127 // 9: --
128 //
129 // Minimum Hamming distance: 5
130 // Maximum Hamming distance: 6
131 // Minimum Hamming weight: 3
132 // Maximum Hamming weight: 6
133 //
134 localparam int StateWidth = 9;
135 typedef enum logic [StateWidth-1:0] {
136 StActive = 9'b100100001,
137 StOutstanding = 9'b011100111,
138 StFlush = 9'b001001100,
139 StError = 9'b010111010,
140 StErrorOutstanding = 9'b100010110
141 } state_e;
142
143 state_e state_d, state_q;
144 3/3 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StError)
Tests: T1 T2 T3 | T1 T2 T3 | T1 T2 T3
PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StError):
144.1 `ifdef SIMULATION
144.2 prim_sparse_fsm_flop #(
144.3 .StateEnumT(state_e),
144.4 .Width($bits(state_e)),
144.5 .ResetValue($bits(state_e)'(StError)),
144.6 .EnableAlertTriggerSVA(1),
144.7 .CustomForceName("state_q")
144.8 ) u_state_regs (
144.9 .clk_i ( clk_i ),
144.10 .rst_ni ( rst_ni ),
144.11 .state_i ( state_d ),
144.12 .state_o ( )
144.13 );
144.14 always_ff @(posedge clk_i or negedge rst_ni) begin
144.15 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
144.16 1/1 state_q <= StError;
Tests: T1 T2 T3
144.17 end else begin
144.18 1/1 state_q <= state_d;
Tests: T1 T2 T3
144.19 end
144.20 end
144.21 u_state_regs_A: assert property (@(posedge clk_i) disable iff ((!rst_ni) !== '0) (state_q === u_state_regs.state_o))
144.22 else begin
144.23 `ifdef UVM
144.24 uvm_pkg::uvm_report_error("ASSERT FAILED", "u_state_regs_A", uvm_pkg::UVM_NONE,
144.25 "../src/lowrisc_tlul_lc_gate_0.1/rtl/tlul_lc_gate.sv", 144, "", 1);
144.26 `else
144.27 $error("%0t: (%0s:%0d) [%m] [ASSERT FAILED] %0s", $time, `__FILE__, `__LINE__,
144.28 `PRIM_STRINGIFY(u_state_regs_A));
144.29 `endif
144.30 end
144.31 `else
144.32 prim_sparse_fsm_flop #(
144.33 .StateEnumT(state_e),
144.34 .Width($bits(state_e)),
144.35 .ResetValue($bits(state_e)'(StError)),
144.36 .EnableAlertTriggerSVA(1)
144.37 ) u_state_regs (
144.38 .clk_i ( `PRIM_FLOP_CLK ),
144.39 .rst_ni ( `PRIM_FLOP_RST ),
144.40 .state_i ( state_d ),
144.41 .state_o ( state_q )
144.42 );
144.43 `endif145
146 logic [1:0] outstanding_txn;
147 logic a_ack;
148 logic d_ack;
149 1/1 assign a_ack = tl_h2d_i.a_valid & tl_d2h_o.a_ready;
Tests: T1 T2 T3
150 1/1 assign d_ack = tl_h2d_i.d_ready & tl_d2h_o.d_valid;
Tests: T1 T2 T3
151
152 always_ff @(posedge clk_i or negedge rst_ni) begin
153 1/1 if (!rst_ni) begin
Tests: T1 T2 T3
154 1/1 outstanding_txn <= '0;
Tests: T1 T2 T3
155 1/1 end else if (a_ack && !d_ack) begin
Tests: T1 T2 T3
156 1/1 outstanding_txn <= outstanding_txn + 1'b1;
Tests: T2 T3 T4
157 1/1 end else if (d_ack && !a_ack) begin
Tests: T1 T2 T3
158 1/1 outstanding_txn <= outstanding_txn - 1'b1;
Tests: T2 T3 T4
159 end
MISSING_ELSE
160 end
161
162 logic block_cmd;
163 always_comb begin
164 1/1 block_cmd = '0;
Tests: T1 T2 T3
165 1/1 state_d = state_q;
Tests: T1 T2 T3
166 1/1 err_en = Off;
Tests: T1 T2 T3
167 1/1 err_o = '0;
Tests: T1 T2 T3
168 1/1 flush_ack_o = '0;
Tests: T1 T2 T3
169 1/1 resp_pending_o = 1'b0;
Tests: T1 T2 T3
170
171 1/1 unique case (state_q)
Tests: T1 T2 T3
172 StActive: begin
173 1/1 if (lc_tx_test_false_loose(lc_en_i) || flush_req_i) begin
Tests: T1 T2 T3
174 1/1 state_d = StOutstanding;
Tests: T3 T5 T6
175 end
MISSING_ELSE
176 1/1 if (outstanding_txn != '0) begin
Tests: T1 T2 T3
177 1/1 resp_pending_o = 1'b1;
Tests: T2 T3 T4
178 end
MISSING_ELSE
179 end
180
181 StOutstanding: begin
182 1/1 block_cmd = 1'b1;
Tests: T3 T5 T6
183 1/1 if (outstanding_txn == '0) begin
Tests: T3 T5 T6
184 1/1 state_d = lc_tx_test_false_loose(lc_en_i) ? StError : StFlush;
Tests: T3 T5 T6
185 end else begin
186 1/1 resp_pending_o = 1'b1;
Tests: T3 T6 T7
187 end
188 end
189
190 StFlush: begin
191 excluded block_cmd = 1'b1;
Exclude Annotation: VC_COV_UNR
192 excluded flush_ack_o = 1'b1;
Exclude Annotation: VC_COV_UNR
193 excluded if (lc_tx_test_false_loose(lc_en_i)) begin
Exclude Annotation: VC_COV_UNR
194 excluded state_d = StError;
Exclude Annotation: VC_COV_UNR
195 excluded end else if (!flush_req_i) begin
Exclude Annotation: VC_COV_UNR
196 excluded state_d = StActive;
Exclude Annotation: VC_COV_UNR
197 end
==> MISSING_ELSE
198 end
199
200 StError: begin
201 1/1 err_en = On;
Tests: T1 T2 T3
202 1/1 if (lc_tx_test_true_strict(lc_en_i)) begin
Tests: T1 T2 T3
203 1/1 state_d = StErrorOutstanding;
Tests: T1 T2 T3
204 end
MISSING_ELSE
205 end
206
207 StErrorOutstanding: begin
208 1/1 err_en = On;
Tests: T1 T2 T3
209 1/1 block_cmd = 1'b1;
Tests: T1 T2 T3
210 1/1 if (outstanding_txn == '0) begin
Tests: T1 T2 T3
211 1/1 state_d = StActive;
Tests: T1 T2 T3
212 end
==> MISSING_ELSE
213 end
214
215 default: begin
216 err_o = 1'b1;
Exclude Annotation: VC_COV_UNR
217 err_en = On;
Exclude Annotation: VC_COV_UNR
218 end
219
220 endcase // unique case (state_q)
221 end
222
223
224 // At the host side, we interpose the ready / valid signals so that we can return a bus error
225 // in case the lc signal is not set to ON. Note that this logic does not have to be duplicated
226 // since erroring back is considered a convenience feature so that the bus does not lock up.
227 tl_h2d_t tl_h2d_error;
228 tl_d2h_t tl_d2h_error;
229 always_comb begin
230 1/1 tl_h2d_int[0] = tl_h2d_i;
Tests: T1 T2 T3
231 1/1 tl_d2h_o = tl_d2h_int[0];
Tests: T1 T2 T3
232 1/1 tl_h2d_error = '0;
Tests: T1 T2 T3
233
234 1/1 if (lc_tx_test_true_loose(err_en)) begin
Tests: T1 T2 T3
235 1/1 tl_h2d_error = tl_h2d_i;
Tests: T1 T2 T3
236 1/1 tl_d2h_o = tl_d2h_error;
Tests: T1 T2 T3
237 end
MISSING_ELSE
238
239 1/1 if (block_cmd) begin
Tests: T1 T2 T3
240 1/1 tl_d2h_o.a_ready = 1'b0;
Tests: T1 T2 T3
241 1/1 tl_h2d_int[0].a_valid = 1'b0;
Tests: T1 T2 T3
242 1/1 tl_h2d_error.a_valid = 1'b0;
Tests: T1 T2 T3
243 end
MISSING_ELSE
Cond Coverage for Instance : tb.dut.u_tlul_lc_gate
| Total | Covered | Percent |
Conditions | 16 | 16 | 100.00 |
Logical | 16 | 16 | 100.00 |
Non-Logical | 0 | 0 | |
Event | 0 | 0 | |
LINE 149
EXPRESSION (tl_h2d_i.a_valid & tl_d2h_o.a_ready)
--------1------- --------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T3,T4 |
1 | 1 | Covered | T2,T3,T4 |
LINE 150
EXPRESSION (tl_h2d_i.d_ready & tl_d2h_o.d_valid)
--------1------- --------2-------
-1- | -2- | Status | Tests |
0 | 1 | Covered | T3,T5,T8 |
1 | 0 | Covered | T1,T2,T3 |
1 | 1 | Covered | T2,T3,T4 |
LINE 155
EXPRESSION (a_ack && ((!d_ack)))
--1-- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T3,T9 |
1 | 1 | Covered | T2,T3,T4 |
LINE 157
EXPRESSION (d_ack && ((!a_ack)))
--1-- -----2----
-1- | -2- | Status | Tests |
0 | 1 | Covered | T1,T2,T3 |
1 | 0 | Covered | T2,T3,T9 |
1 | 1 | Covered | T2,T3,T4 |
LINE 176
EXPRESSION (outstanding_txn != '0)
-----------1-----------
-1- | Status | Tests |
0 | Covered | T1,T2,T3 |
1 | Covered | T2,T3,T4 |
LINE 183
EXPRESSION (outstanding_txn == '0)
-----------1-----------
-1- | Status | Tests |
0 | Covered | T3,T6,T7 |
1 | Covered | T3,T5,T6 |
LINE 210
EXPRESSION (outstanding_txn == '0)
-----------1-----------
Exclude Annotation: [LOWRISK] This happens in the 1st cycle after exiting reset. In order to cover it, need to drive TL items during reset, which isn't supported in the agent.
-1- | Status | Tests |
0 | Excluded | |
1 | Excluded | T1,T2,T3 |
FSM Coverage for Instance : tb.dut.u_tlul_lc_gate
Summary for FSM :: state_q
| Total | Covered | Percent | |
States |
4 |
4 |
100.00 |
(Not included in score) |
Transitions |
4 |
4 |
100.00 |
|
Sequences |
0 |
0 |
|
|
State, Transition and Sequence Details for FSM :: state_q
states | Line No. | Covered | Tests | Exclude Annotation |
StActive |
196 |
Covered |
T1,T2,T3 |
|
StError |
184 |
Covered |
T1,T2,T3 |
|
StErrorOutstanding |
203 |
Covered |
T1,T2,T3 |
|
StFlush |
184 |
Excluded |
|
VC_COV_UNR |
StOutstanding |
174 |
Covered |
T3,T5,T6 |
|
transitions | Line No. | Covered | Tests |
StActive->StOutstanding |
174 |
Covered |
T3,T5,T6 |
StError->StErrorOutstanding |
203 |
Covered |
T1,T2,T3 |
StErrorOutstanding->StActive |
211 |
Covered |
T1,T2,T3 |
StFlush->StActive |
196 |
Excluded |
|
StFlush->StError |
194 |
Excluded |
|
StOutstanding->StError |
184 |
Covered |
T3,T5,T6 |
StOutstanding->StFlush |
184 |
Excluded |
|
Branch Coverage for Instance : tb.dut.u_tlul_lc_gate
| Line No. | Total | Covered | Percent |
Branches |
|
20 |
19 |
95.00 |
IF |
144 |
2 |
2 |
100.00 |
IF |
153 |
4 |
4 |
100.00 |
CASE |
171 |
10 |
9 |
90.00 |
IF |
234 |
2 |
2 |
100.00 |
IF |
239 |
2 |
2 |
100.00 |
144 `PRIM_FLOP_SPARSE_FSM(u_state_regs, state_d, state_q, state_e, StError)
-1-
==>
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
153 if (!rst_ni) begin
-1-
154 outstanding_txn <= '0;
==>
155 end else if (a_ack && !d_ack) begin
-2-
156 outstanding_txn <= outstanding_txn + 1'b1;
==>
157 end else if (d_ack && !a_ack) begin
-3-
158 outstanding_txn <= outstanding_txn - 1'b1;
==>
159 end
MISSING_ELSE
==>
Branches:
-1- | -2- | -3- | Status | Tests |
1 |
- |
- |
Covered |
T1,T2,T3 |
0 |
1 |
- |
Covered |
T2,T3,T4 |
0 |
0 |
1 |
Covered |
T2,T3,T4 |
0 |
0 |
0 |
Covered |
T1,T2,T3 |
171 unique case (state_q)
-1-
172 StActive: begin
173 if (lc_tx_test_false_loose(lc_en_i) || flush_req_i) begin
-2-
174 state_d = StOutstanding;
==>
175 end
MISSING_ELSE
==>
176 if (outstanding_txn != '0) begin
-3-
177 resp_pending_o = 1'b1;
==>
178 end
MISSING_ELSE
==>
179 end
180
181 StOutstanding: begin
182 block_cmd = 1'b1;
183 if (outstanding_txn == '0) begin
-4-
184 state_d = lc_tx_test_false_loose(lc_en_i) ? StError : StFlush;
==>
185 end else begin
186 resp_pending_o = 1'b1;
==>
187 end
188 end
189
190 StFlush: begin
191 block_cmd = 1'b1;
192 flush_ack_o = 1'b1;
193 if (lc_tx_test_false_loose(lc_en_i)) begin
-5-
194 state_d = StError;
==> (Excluded)
Exclude Annotation: VC_COV_UNR
195 end else if (!flush_req_i) begin
-6-
196 state_d = StActive;
==> (Excluded)
Exclude Annotation: VC_COV_UNR
197 end
MISSING_ELSE
==> (Excluded)
Exclude Annotation: VC_COV_UNR
198 end
199
200 StError: begin
201 err_en = On;
202 if (lc_tx_test_true_strict(lc_en_i)) begin
-7-
203 state_d = StErrorOutstanding;
==>
204 end
MISSING_ELSE
==>
205 end
206
207 StErrorOutstanding: begin
208 err_en = On;
209 block_cmd = 1'b1;
210 if (outstanding_txn == '0) begin
-8-
211 state_d = StActive;
==>
212 end
MISSING_ELSE
==>
213 end
214
215 default: begin
216 err_o = 1'b1;
==> (Excluded)
Exclude Annotation: VC_COV_UNR
Branches:
-1- | -2- | -3- | -4- | -5- | -6- | -7- | -8- | Status | Tests | Exclude Annotation |
StActive |
1 |
- |
- |
- |
- |
- |
- |
Covered |
T3,T5,T6 |
|
StActive |
0 |
- |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
|
StActive |
- |
1 |
- |
- |
- |
- |
- |
Covered |
T2,T3,T4 |
|
StActive |
- |
0 |
- |
- |
- |
- |
- |
Covered |
T1,T2,T3 |
|
StOutstanding |
- |
- |
1 |
- |
- |
- |
- |
Covered |
T3,T5,T6 |
|
StOutstanding |
- |
- |
0 |
- |
- |
- |
- |
Covered |
T3,T6,T7 |
|
StFlush |
- |
- |
- |
1 |
- |
- |
- |
Excluded |
|
VC_COV_UNR |
StFlush |
- |
- |
- |
0 |
1 |
- |
- |
Excluded |
|
VC_COV_UNR |
StFlush |
- |
- |
- |
0 |
0 |
- |
- |
Excluded |
|
VC_COV_UNR |
StError |
- |
- |
- |
- |
- |
1 |
- |
Covered |
T1,T2,T3 |
|
StError |
- |
- |
- |
- |
- |
0 |
- |
Covered |
T3,T5,T6 |
|
StErrorOutstanding |
- |
- |
- |
- |
- |
- |
1 |
Covered |
T1,T2,T3 |
|
StErrorOutstanding |
- |
- |
- |
- |
- |
- |
0 |
Not Covered |
|
|
default |
- |
- |
- |
- |
- |
- |
- |
Excluded |
|
VC_COV_UNR |
234 if (lc_tx_test_true_loose(err_en)) begin
-1-
235 tl_h2d_error = tl_h2d_i;
==>
236 tl_d2h_o = tl_d2h_error;
237 end
MISSING_ELSE
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
239 if (block_cmd) begin
-1-
240 tl_d2h_o.a_ready = 1'b0;
==>
241 tl_h2d_int[0].a_valid = 1'b0;
242 tl_h2d_error.a_valid = 1'b0;
243 end
MISSING_ELSE
==>
Branches:
-1- | Status | Tests |
1 |
Covered |
T1,T2,T3 |
0 |
Covered |
T1,T2,T3 |
Assert Coverage for Instance : tb.dut.u_tlul_lc_gate
Assertion Details
OutStandingOvfl_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
300519288 |
0 |
0 |
0 |
u_state_regs_A
Name | Attempts | Real Successes | Failures | Incomplete |
Total |
300519288 |
300410729 |
0 |
0 |
T1 |
1803 |
1741 |
0 |
0 |
T2 |
6026 |
5964 |
0 |
0 |
T3 |
11544 |
11419 |
0 |
0 |
T4 |
5695 |
5640 |
0 |
0 |
T5 |
16001 |
10504 |
0 |
0 |
T8 |
28898 |
28846 |
0 |
0 |
T9 |
3560 |
3509 |
0 |
0 |
T10 |
864 |
785 |
0 |
0 |
T11 |
821 |
771 |
0 |
0 |
T12 |
2413 |
2359 |
0 |
0 |