[gpio/dv] Functional coverage updates
- Identified uncovered bins for cross of data_out, data_oe and data_in
as illegal bins
- Modified the way intr_test related coverage was being sampled
diff --git a/hw/ip/gpio/dv/env/gpio_env_cov.sv b/hw/ip/gpio/dv/env/gpio_env_cov.sv
index 04a3b1f..2b8ffc3 100644
--- a/hw/ip/gpio/dv/env/gpio_env_cov.sv
+++ b/hw/ip/gpio/dv/env/gpio_env_cov.sv
@@ -79,7 +79,15 @@
cp_pin: coverpoint pin {
bins bins_for_gpio_bits[] = {[0:NUM_GPIOS-1]};
}
- cp_cross_all: cross cp_pin, data_out, data_oe, data_in;
+ cp_cross_all: cross cp_pin, data_out, data_oe, data_in {
+ // If data_oe is true, data_in cannot be different from data_out value
+ illegal_bins data_oe_1_data_out_0_data_in_1 = binsof(data_out) intersect {0} &&
+ binsof(data_oe) intersect {1} &&
+ binsof(data_in) intersect {1};
+ illegal_bins data_oe_1_data_out_1_data_in_0 = binsof(data_out) intersect {1} &&
+ binsof(data_oe) intersect {1} &&
+ binsof(data_in) intersect {0};
+ }
endgroup : data_out_data_oe_data_in_cross_cg
// Cross coverage between gpio pin value and effective data_in value
covergroup gpio_pins_data_in_cross_cg(string name) with function sample(uint pin,
diff --git a/hw/ip/gpio/dv/env/gpio_scoreboard.sv b/hw/ip/gpio/dv/env/gpio_scoreboard.sv
index 03e0826..d3c6e37 100644
--- a/hw/ip/gpio/dv/env/gpio_scoreboard.sv
+++ b/hw/ip/gpio/dv/env/gpio_scoreboard.sv
@@ -114,7 +114,8 @@
`uvm_info(`gfn, $sformatf("Write on intr_state: write data = %0h", item.a_data), UVM_HIGH)
if (intr_state_update_queue.size() > 0) begin
gpio_reg_update_due_t intr_state_write_to_clear_update = intr_state_update_queue[$];
- `uvm_info(`gfn, $sformatf("Entry taken out for clearing is %0p", intr_state_write_to_clear_update), UVM_HIGH)
+ `uvm_info(`gfn, $sformatf("Entry taken out for clearing is %0p",
+ intr_state_write_to_clear_update), UVM_HIGH)
// Update time
intr_state_write_to_clear_update.eval_time = $time;
for (uint each_bit = 0; each_bit < TL_DW; each_bit++) begin
@@ -576,11 +577,6 @@
intr_ctrl_en_lvlhigh[each_bit]);
cov.intr_ctrl_en_cov_objs[each_bit]["intr_ctrl_en_lvllow"].sample(
intr_ctrl_en_lvllow[each_bit]);
- // Interrupt Test coverage
- cov.intr_test_cg.sample(each_bit,
- last_intr_test_event[each_bit],
- intr_enable[each_bit],
- last_intr_test_event[each_bit]);
end
end
// 1. Look for edge triggerred interrupts
@@ -675,6 +671,11 @@
// Clear the flag
cleared_intr_bits[each_bit] = 1'b0;
end
+ // Interrupt Test coverage
+ cov.intr_test_cg.sample(each_bit,
+ last_intr_test_event[each_bit],
+ intr_enable[each_bit],
+ exp_intr_status[each_bit]);
end
end
// Clear last_intr_test_event