[dv gpio] Updates related to coverage, gpio weak pull, warnings' cleanup
1. cip_base_env_cov.sv: covergroup for the case in which interrupt state is
cleared and then set again due to active interrupt event
2. pins_if.sv: Modified the way weak pull up/down is implemented to avoid
overriding 'x' with 0/1, when there are multiple conflicting drivers
3. */tb.tb.sv: Connect wire devmode to connect to devmode_if pins port
4. gpio_env_cov.sv: cross coverage involving *out* and *oe* registers along
with data_in registers
5. gpio_scoreboard.sv: Sampling for new covergroups
6. mem_model.sv: Fix compile warning
diff --git a/hw/dv/sv/cip_lib/cip_base_env_cov.sv b/hw/dv/sv/cip_lib/cip_base_env_cov.sv
index ca02b55..20e75e3 100644
--- a/hw/dv/sv/cip_lib/cip_base_env_cov.sv
+++ b/hw/dv/sv/cip_lib/cip_base_env_cov.sv
@@ -5,9 +5,9 @@
// put these covergoups outside the class in order to create them anywhere after get cfg object
// if more than one interrupt/alert registers, these can be reused
// in extended cov class, better to have the covergroup inside the class and create in new function
-covergroup intr_covergroup (uint num_interrupts) with function sample(uint intr,
- bit intr_en,
- bit intr_state);
+covergroup intr_cg (uint num_interrupts) with function sample(uint intr,
+ bit intr_en,
+ bit intr_state);
cp_intr: coverpoint intr {
bins all_values[] = {[0:num_interrupts-1]};
}
@@ -16,10 +16,10 @@
cross cp_intr, cp_intr_en, cp_intr_state;
endgroup
-covergroup intr_test_covergroup (uint num_interrupts) with function sample(uint intr,
- bit intr_test,
- bit intr_en,
- bit intr_state);
+covergroup intr_test_cg (uint num_interrupts) with function sample(uint intr,
+ bit intr_test,
+ bit intr_en,
+ bit intr_state);
cp_intr: coverpoint intr {
bins all_values[] = {[0:num_interrupts-1]};
}
@@ -34,7 +34,7 @@
}
endgroup
-covergroup intr_pins_covergroup (uint num_interrupts) with function sample(uint intr_pin, bit intr_pin_value);
+covergroup intr_pins_cg (uint num_interrupts) with function sample(uint intr_pin, bit intr_pin_value);
cp_intr_pin: coverpoint intr_pin {
bins all_pins[] = {[0:num_interrupts-1]};
}
@@ -45,7 +45,7 @@
cp_intr_pins_all_values: cross cp_intr_pin, cp_intr_pin_value;
endgroup
-covergroup alert_covergroup (uint num_alerts) with function sample(uint alert);
+covergroup alert_cg (uint num_alerts) with function sample(uint alert);
cp_alert: coverpoint alert {
bins all_values[] = {[0:num_alerts-1]};
}
@@ -54,10 +54,14 @@
class cip_base_env_cov #(type CFG_T = cip_base_env_cfg) extends dv_base_env_cov #(CFG_T);
`uvm_component_param_utils(cip_base_env_cov #(CFG_T))
- intr_covergroup intr_cg;
- intr_test_covergroup intr_test_cg;
- intr_pins_covergroup intr_pins_cg;
- alert_covergroup alert_cg;
+ intr_cg intr_cg;
+ intr_test_cg intr_test_cg;
+ intr_pins_cg intr_pins_cg;
+ alert_cg alert_cg;
+ // Coverage for sticky interrupt functionality described in CIP specification
+ // As some interrupts are non-sticky, this covergroup should be populated on "as and when needed" basis
+ // in extended <ip>_env_cov class for interrupt types that are sticky
+ dv_base_generic_cov_obj sticky_intr_cov[string];
`uvm_component_new
diff --git a/hw/dv/sv/common_ifs/pins_if.sv b/hw/dv/sv/common_ifs/pins_if.sv
index 414cf8b..2907926 100644
--- a/hw/dv/sv/common_ifs/pins_if.sv
+++ b/hw/dv/sv/common_ifs/pins_if.sv
@@ -75,7 +75,14 @@
for (genvar i = 0; i < Width; i++) begin : each_pin
assign pins_int[i] = pins_pd[i] ? 1'b0 :
pins_pu[i] ? 1'b1 : 1'bz;
- assign (pull0, pull1) pins[i] = pins_oe[i] ? pins_o[i] : pins_int[i];
+ // If output enable is 1, strong driver assigns pin to 'value to be driven out';
+ // the external strong driver can still affect pin, if exists.
+ // Else if output enable is 0, weak pullup or pulldown is applied to pin.
+ // By doing this, we make sure that weak pullup or pulldown does not override
+ // any 'x' value on pin, that may result due to conflicting values
+ // between 'value to be driven out' and the external driver's value.
+ assign pins[i] = pins_oe[i] ? pins_o[i] : 1'bz;
+ assign (pull0, pull1) pins[i] = ~pins_oe[i] ? pins_int[i] : 1'bz;
end
endgenerate
diff --git a/hw/dv/sv/dv_lib/dv_base_env_cov.sv b/hw/dv/sv/dv_lib/dv_base_env_cov.sv
index bdcfd5e..d593462 100644
--- a/hw/dv/sv/dv_lib/dv_base_env_cov.sv
+++ b/hw/dv/sv/dv_lib/dv_base_env_cov.sv
@@ -5,25 +5,24 @@
// TODO - We are enclosing generic covergroups inside class so that we can
// take avoid tool limitation of not allowing arrays of covergroup
// Refer to Issue#375 for more details
-class dv_base_generic_cov_obj extends uvm_object;
- `uvm_object_utils(dv_base_generic_cov_obj)
+class dv_base_generic_cov_obj;
// Covergroup: bit_toggle_cg
// Generic covergroup definition
- covergroup bit_toggle_cg(string name) with function sample(bit value);
+ covergroup bit_toggle_cg(string name, bit toggle_cov_en = 1) with function sample(bit value);
option.per_instance = 1;
option.name = name;
cp_value: coverpoint value;
cp_transitions: coverpoint value {
+ option.weight = toggle_cov_en;
bins rising = (0 => 1);
bins falling = (1 => 0);
}
endgroup : bit_toggle_cg
// Function: new
- function new(string name="dv_base_generic_cov_obj");
- super.new(name);
- bit_toggle_cg = new(name);
+ function new(string name = "dv_base_generic_cov_obj", bit toggle_cov_en = 1);
+ bit_toggle_cg = new(name, toggle_cov_en);
endfunction : new
// Function: sample
diff --git a/hw/dv/sv/dv_utils/dv_macros.svh b/hw/dv/sv/dv_utils/dv_macros.svh
index 0000a30..d2e5b47 100644
--- a/hw/dv/sv/dv_utils/dv_macros.svh
+++ b/hw/dv/sv/dv_utils/dv_macros.svh
@@ -184,7 +184,7 @@
// Shorthand for common std::randomize(foo) with { } + fatal check
`ifndef DV_CHECK_STD_RANDOMIZE_WITH_FATAL
- `define DV_CHECK_STD_RANDOMIZE_WITH_FATAL(VAR_, WITH_C_,MSG_="Randomization failed!",ID_=`gfn) \
+ `define DV_CHECK_STD_RANDOMIZE_WITH_FATAL(VAR_, WITH_C_, MSG_="Randomization failed!",ID_=`gfn) \
`DV_CHECK_FATAL(std::randomize(VAR_) with {WITH_C_}, MSG_, ID_)
`endif
diff --git a/hw/dv/sv/mem_model/mem_model.sv b/hw/dv/sv/mem_model/mem_model.sv
index 8f4c4cd..18005b1 100644
--- a/hw/dv/sv/mem_model/mem_model.sv
+++ b/hw/dv/sv/mem_model/mem_model.sv
@@ -24,7 +24,7 @@
$sformatf("Read Mem : Addr[0x%0h], Data[0x%0h]", addr, data), UVM_HIGH)
end
else begin
- std::randomize(data);
+ `DV_CHECK_STD_RANDOMIZE_FATAL(data)
`uvm_error(get_full_name(), $sformatf("read to uninitialzed addr 0x%0h", addr))
end
return data;
diff --git a/hw/ip/gpio/dv/env/gpio_env_cov.sv b/hw/ip/gpio/dv/env/gpio_env_cov.sv
index f26cc99..a77b1cc 100644
--- a/hw/ip/gpio/dv/env/gpio_env_cov.sv
+++ b/hw/ip/gpio/dv/env/gpio_env_cov.sv
@@ -29,12 +29,12 @@
endfunction : new
endclass : gpio_intr_type_cov_obj
-class gpio_two_vars_generic_cov_obj extends uvm_object;
- `uvm_object_utils(gpio_two_vars_generic_cov_obj)
+class gpio_out_oe_cov_obj extends uvm_object;
+ `uvm_object_utils(gpio_out_oe_cov_obj)
// Covergroup: var1_var2_cg
- // Generic covergroup that samples two bit variables and
- // looks for their individual coverage as well as cross coverage.
+ // Covergroup invovling two variables of bit type and are meant to
+ // be used for cross coverage related to *out* and *oe* registers
covergroup var1_var2_cg(string name) with function sample(bit var1, bit var2);
option.per_instance = 1;
option.name = name;
@@ -44,11 +44,11 @@
endgroup : var1_var2_cg
// Function: new
- function new(string name="gpio_two_vars_generic_cov_obj");
+ function new(string name="gpio_out_oe_cov_obj");
super.new(name);
var1_var2_cg = new(name);
endfunction : new
-endclass : gpio_two_vars_generic_cov_obj
+endclass : gpio_out_oe_cov_obj
class gpio_env_cov extends cip_base_env_cov #(.CFG_T(gpio_env_cfg));
`uvm_component_utils(gpio_env_cov)
@@ -59,17 +59,38 @@
dv_base_generic_cov_obj intr_state_cov_obj[NUM_GPIOS];
// Interrupt Control Enable registers' values
dv_base_generic_cov_obj intr_ctrl_en_cov_objs[NUM_GPIOS][string];
- // Different gpio interrupt types' occurrences
- gpio_intr_type_cov_obj intr_event_type_cov_objs[NUM_GPIOS][string];
- // Per bit coverage on *out* and *oe* registers
- dv_base_generic_cov_obj out_oe_cov_objs[NUM_GPIOS][string];
-
- // Coverage on data and mask fields of masked* registers
- gpio_two_vars_generic_cov_obj out_oe_mask_data_cov_objs[NUM_GPIOS/2][string];
- // Coverage on effective values of DATA_OUT and DATA_OE
- gpio_two_vars_generic_cov_obj data_out_data_oe_cov_obj[NUM_GPIOS];
// data_in register per bit value coverage
dv_base_generic_cov_obj data_in_cov_obj[NUM_GPIOS];
+ // Per bit coverage on *out* and *oe* registers
+ dv_base_generic_cov_obj out_oe_cov_objs[NUM_GPIOS][string];
+ // Different gpio interrupt types' occurrences
+ gpio_intr_type_cov_obj intr_event_type_cov_objs[NUM_GPIOS][string];
+ // Coverage on data and mask fields of masked* registers
+ gpio_out_oe_cov_obj out_oe_mask_data_cov_objs[NUM_GPIOS/2][string];
+ // Coverage on effective values of DATA_OUT and DATA_OE
+ gpio_out_oe_cov_obj data_out_data_oe_cov_obj[NUM_GPIOS];
+ // Cross Coverage between per pin values of data_out value, data_oe value
+ // and data_in value
+ covergroup data_out_data_oe_data_in_cross_cg(string name) with function sample(uint pin,
+ bit data_out,
+ bit data_oe,
+ bit data_in);
+ option.name = name;
+ 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;
+ 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,
+ bit gpio_value,
+ bit data_in);
+ option.name = name;
+ cp_pin: coverpoint pin {
+ bins bins_for_gpio_bits[] = {[0:NUM_GPIOS-1]};
+ }
+ cp_cross_pins_data_in: cross cp_pin, gpio_value, data_in;
+ endgroup : gpio_pins_data_in_cross_cg
function new(string name, uvm_component parent);
super.new(name, parent);
@@ -104,6 +125,10 @@
data_out_data_oe_cov_obj[each_pin] = new($sformatf("data_out_data_oe_cov_obj_pin%0d",
each_pin));
data_in_cov_obj[each_pin] = new($sformatf("data_in_cov_obj_pin%0d", each_pin));
+ // Create sticky interrupt coverage per pin
+ // No toggle coverage is required in this case, so specify toggle_cov_en = 0
+ sticky_intr_cov[{"gpio_sticky_intr_pin", $sformatf("%0d", each_pin)}] =
+ new(.name({"gpio_sticky_intr_pin", $sformatf("%0d", each_pin)}), .toggle_cov_en(0));
end
// Per pin coverage and cross coverage for mask and data
// fields within masked_* registers
@@ -115,6 +140,8 @@
end
end
end
+ data_out_data_oe_data_in_cross_cg = new("data_out_data_oe_data_in_cross_cg");
+ gpio_pins_data_in_cross_cg = new("gpio_pins_data_in_cross_cg");
end
endfunction : new
diff --git a/hw/ip/gpio/dv/env/gpio_scoreboard.sv b/hw/ip/gpio/dv/env/gpio_scoreboard.sv
index da1f1f7..f296478 100644
--- a/hw/ip/gpio/dv/env/gpio_scoreboard.sv
+++ b/hw/ip/gpio/dv/env/gpio_scoreboard.sv
@@ -27,6 +27,10 @@
bit [TL_DW-1:0] last_intr_update_except_clearing;
// Value seen in last Interrupt Test write
bit [TL_DW-1:0] last_intr_test_event;
+ // Flag to:
+ // (i) indicate that write to INTR_STATE register just happened, and
+ // (ii) store information of which all interupt bits were cleared
+ bit [TL_DW-1:0] cleared_intr_bits;
`uvm_component_utils(gpio_scoreboard)
@@ -110,6 +114,7 @@
`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)
// Update time
intr_state_write_to_clear_update.eval_time = $time;
for (uint each_bit = 0; each_bit < TL_DW; each_bit++) begin
@@ -117,6 +122,7 @@
intr_state_write_to_clear_update.reg_value[each_bit] == 1'b1 &&
item.a_data[each_bit] == 1'b1) begin
intr_state_write_to_clear_update.reg_value[each_bit] = 1'b0;
+ cleared_intr_bits[each_bit] = 1'b1;
// Coverage Sampling: gpio interrupt cleared
if (cfg.en_cov) begin
cov.intr_state_cov_obj[each_bit].sample(1'b0);
@@ -132,6 +138,23 @@
intr_state_write_to_clear_update.reg_value |= last_intr_update_except_clearing;
// Delete last entry with same time stamp
intr_state_update_queue.delete(intr_state_update_queue.size()-1);
+ // Coverage Sampling: cover a scenario wherein cleared interrupt state bit
+ // is re-asserted due to still active interrupt event
+ // Note: In this case, both interrupt clearing event and INTR_STATE reg write
+ // have occurred at the same time.
+ if (cfg.en_cov) begin
+ foreach (cleared_intr_bits[each_bit]) begin
+ if (cleared_intr_bits[each_bit]) begin
+ if (last_intr_update_except_clearing[each_bit]) begin
+ cov.sticky_intr_cov[{"gpio_sticky_intr_pin",
+ $sformatf("%0d", each_bit)}].sample(1'b1);
+ end else begin
+ cov.sticky_intr_cov[{"gpio_sticky_intr_pin",
+ $sformatf("%0d", each_bit)}].sample(1'b0);
+ end
+ end
+ end
+ end
end
// Push new interrupt state update entry into queue
intr_state_update_queue.push_back(intr_state_write_to_clear_update);
@@ -460,14 +483,11 @@
for (uint pin_num = 0; pin_num < NUM_GPIOS; pin_num++) begin
if (data_out_effect_on_gpio_i[pin_num] === 1'bz) begin
pred_val_gpio_pins[pin_num] = gpio_i_driven[pin_num];
- end
- else if (gpio_i_driven[pin_num] === 1'bz) begin
+ end else if (gpio_i_driven[pin_num] === 1'bz) begin
pred_val_gpio_pins[pin_num] = data_out_effect_on_gpio_i[pin_num];
- end
- else if (data_out_effect_on_gpio_i[pin_num] === gpio_i_driven[pin_num]) begin
+ end else if (data_out_effect_on_gpio_i[pin_num] === gpio_i_driven[pin_num]) begin
pred_val_gpio_pins[pin_num] = data_out_effect_on_gpio_i[pin_num];
- end
- else begin
+ end else begin
pred_val_gpio_pins[pin_num] = 1'bx;
end
if (pred_val_gpio_pins[pin_num] === 1'bz) begin
@@ -492,9 +512,15 @@
current_data_in_update.eval_time = $time;
data_in_update_queue.push_back(current_data_in_update);
// Coverage Sampling: data_in register coverage
+ // Coverage Sampling: Cross coverage between data_out, data_oe and data_in
+ // values per bit
if (cfg.en_cov) begin
for (uint each_bit = 0; each_bit < NUM_GPIOS; each_bit++) begin
cov.data_in_cov_obj[each_bit].sample(pred_val_gpio_pins[each_bit]);
+ cov.data_out_data_oe_data_in_cross_cg.sample(each_bit, data_out[each_bit],
+ data_oe[each_bit], pred_val_gpio_pins[each_bit]);
+ cov.gpio_pins_data_in_cross_cg.sample(each_bit, cfg.gpio_vif.pins[each_bit],
+ pred_val_gpio_pins[each_bit]);
end
end
end
@@ -518,7 +544,7 @@
// This function computes expected value of gpio intr_status based on
// changes of gpio_i data or interrupt control registers
virtual function void gpio_interrupt_predict(
- input gpio_transition_t [NUM_GPIOS-1:0] gpio_i_transition = {NUM_GPIOS{2'b00}});
+ input gpio_transition_t [NUM_GPIOS-1:0] gpio_i_transition = {NUM_GPIOS{2'b00}});
string msg_id = {`gfn, $sformatf(" gpio_interrupt_predict: ")};
bit [TL_DW-1:0] intr_enable = ral.intr_enable.get_mirrored_value();
@@ -632,12 +658,24 @@
end
// 3. Apply effect of "Interrupt Test"
exp_intr_status |= last_intr_test_event;
+ `uvm_info(`gfn, $sformatf("updated intr_state is %0h", exp_intr_status), UVM_HIGH)
// Coverage Sampling: Coverage on Interrupt Index, Interrupt Enable,
// Interrupt Status and their cross coverage
if (cfg.en_cov) begin
foreach (exp_intr_status[each_bit]) begin
cov.intr_cg.sample(each_bit, intr_enable[each_bit], exp_intr_status[each_bit]);
cov.intr_state_cov_obj[each_bit].sample(last_intr_update_except_clearing[each_bit]);
+ // Coverage Sampling: cover a scenario wherein cleared interrupt state bit
+ // is re-asserted due to still active interrupt event
+ if (cleared_intr_bits[each_bit]) begin
+ if (exp_intr_status[each_bit]) begin
+ cov.sticky_intr_cov[{"gpio_sticky_intr_pin", $sformatf("%0d", each_bit)}].sample(1'b1);
+ end else begin
+ cov.sticky_intr_cov[{"gpio_sticky_intr_pin", $sformatf("%0d", each_bit)}].sample(1'b0);
+ end
+ // Clear the flag
+ cleared_intr_bits[each_bit] = 1'b0;
+ end
end
end
// Clear last_intr_test_event
diff --git a/hw/ip/gpio/dv/env/seq_lib/gpio_intr_with_filter_rand_intr_event_vseq.sv b/hw/ip/gpio/dv/env/seq_lib/gpio_intr_with_filter_rand_intr_event_vseq.sv
index a672c13..cb57b75 100644
--- a/hw/ip/gpio/dv/env/seq_lib/gpio_intr_with_filter_rand_intr_event_vseq.sv
+++ b/hw/ip/gpio/dv/env/seq_lib/gpio_intr_with_filter_rand_intr_event_vseq.sv
@@ -155,7 +155,7 @@
1: csr_rd_check(.ptr(ral.data_in), .compare_value(expected_value_data_in));
endcase
end
- while(num_cycles_elapsed < (FILTER_CYCLES -2));
+ while (num_cycles_elapsed < (FILTER_CYCLES -2));
end // csr_rd_and_check
join // end fork..join
end // csr_read_and_check
diff --git a/hw/ip/gpio/dv/tb/tb.sv b/hw/ip/gpio/dv/tb/tb.sv
index 8c69319..d23aab3 100644
--- a/hw/ip/gpio/dv/tb/tb.sv
+++ b/hw/ip/gpio/dv/tb/tb.sv
@@ -16,6 +16,7 @@
`include "dv_macros.svh"
wire clk, rst_n;
+ wire devmode;
wire [NUM_GPIOS-1:0] gpio_pins;
wire [NUM_GPIOS-1:0] gpio_i;
wire [NUM_GPIOS-1:0] gpio_o;
@@ -28,7 +29,7 @@
clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
pins_if #(NUM_MAX_INTERRUPTS) intr_if(.pins(interrupts));
pins_if #(NUM_MAX_ALERTS) alerts_if(.pins(alerts));
- pins_if #(1) devmode_if();
+ pins_if #(1) devmode_if(.pins(devmode));
tl_if tl_if(.clk(clk), .rst_n(rst_n));
pins_if #(NUM_GPIOS) gpio_if(.pins(gpio_pins));
diff --git a/hw/ip/hmac/dv/tb/tb.sv b/hw/ip/hmac/dv/tb/tb.sv
index f2ec6ef..d7aff19 100644
--- a/hw/ip/hmac/dv/tb/tb.sv
+++ b/hw/ip/hmac/dv/tb/tb.sv
@@ -15,6 +15,7 @@
`include "dv_macros.svh"
wire clk, rst_n;
+ wire devmode;
wire [NUM_MAX_INTERRUPTS-1:0] interrupts;
wire [NUM_MAX_ALERTS-1:0] alerts;
@@ -25,7 +26,7 @@
clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
pins_if #(NUM_MAX_INTERRUPTS) intr_if(.pins(interrupts));
pins_if #(NUM_MAX_ALERTS) alerts_if(.pins(alerts));
- pins_if #(1) devmode_if();
+ pins_if #(1) devmode_if(devmode);
tl_if tl_if(.clk(clk), .rst_n(rst_n));
// dut
diff --git a/hw/ip/i2c/dv/tb/tb.sv b/hw/ip/i2c/dv/tb/tb.sv
index ad8490e..6e651a3 100644
--- a/hw/ip/i2c/dv/tb/tb.sv
+++ b/hw/ip/i2c/dv/tb/tb.sv
@@ -14,6 +14,7 @@
`include "dv_macros.svh"
wire clk, rst_n;
+ wire devmode;
wire intr_fmt_watermark;
wire intr_rx_watermark;
wire intr_fmt_overflow;
@@ -30,7 +31,7 @@
clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
pins_if #(NUM_MAX_INTERRUPTS) intr_if(interrupts);
pins_if #(NUM_MAX_ALERTS) alerts_if(alerts);
- pins_if #(1) devmode_if();
+ pins_if #(1) devmode_if(devmode);
tl_if tl_if(.clk(clk), .rst_n(rst_n));
i2c_if i2c_if();
diff --git a/hw/ip/rv_timer/dv/tb/tb.sv b/hw/ip/rv_timer/dv/tb/tb.sv
index 88f22d3..004154d 100644
--- a/hw/ip/rv_timer/dv/tb/tb.sv
+++ b/hw/ip/rv_timer/dv/tb/tb.sv
@@ -15,6 +15,7 @@
`include "dv_macros.svh"
wire clk, rst_n;
+ wire devmode;
wire [NUM_HARTS-1:0][NUM_TIMERS-1:0] intr_timer_expired;
wire [NUM_MAX_INTERRUPTS-1:0] interrupts;
wire [NUM_MAX_ALERTS-1:0] alerts;
@@ -23,7 +24,7 @@
clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
pins_if #(NUM_MAX_INTERRUPTS) intr_if(.pins(interrupts));
pins_if #(NUM_MAX_ALERTS) alerts_if(.pins(alerts));
- pins_if #(1) devmode_if();
+ pins_if #(1) devmode_if(devmode);
tl_if tl_if(.clk(clk), .rst_n(rst_n));
// dut
diff --git a/hw/ip/spi_device/dv/tb/tb.sv b/hw/ip/spi_device/dv/tb/tb.sv
index 978b3f3..6514605 100644
--- a/hw/ip/spi_device/dv/tb/tb.sv
+++ b/hw/ip/spi_device/dv/tb/tb.sv
@@ -15,6 +15,7 @@
`include "dv_macros.svh"
wire clk, rst_n;
+ wire devmode;
wire [NUM_MAX_INTERRUPTS-1:0] interrupts;
wire [NUM_MAX_ALERTS-1:0] alerts;
@@ -33,7 +34,7 @@
clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
pins_if #(NUM_MAX_INTERRUPTS) intr_if(.pins(interrupts));
pins_if #(NUM_MAX_ALERTS) alerts_if(.pins(alerts));
- pins_if #(1) devmode_if();
+ pins_if #(1) devmode_if(devmode);
tl_if tl_if(.clk(clk), .rst_n(rst_n));
spi_if spi_if(.rst_n(rst_n));
diff --git a/hw/ip/uart/dv/tb/tb.sv b/hw/ip/uart/dv/tb/tb.sv
index 11d05aa..0831894 100644
--- a/hw/ip/uart/dv/tb/tb.sv
+++ b/hw/ip/uart/dv/tb/tb.sv
@@ -15,6 +15,7 @@
`include "dv_macros.svh"
wire clk, rst_n;
+ wire devmode;
wire intr_tx_watermark;
wire intr_rx_watermark;
wire intr_tx_overflow;
@@ -30,7 +31,7 @@
clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
pins_if #(NUM_MAX_INTERRUPTS) intr_if(interrupts);
pins_if #(NUM_MAX_ALERTS) alerts_if(alerts);
- pins_if #(1) devmode_if();
+ pins_if #(1) devmode_if(devmode);
tl_if tl_if(.clk(clk), .rst_n(rst_n));
uart_if uart_if();