[verilator] Change sw_test_status_if is instanced
The `sw_test_status_if` was originally bound to the `sim_sram_if`
directly to probe the signals maintained there.
The SV bind keyword unfortunately does not play nice when tracing is
enabled (results in seg fault).
This fixes #3951 by instantiating `sw_test_status_if` instead and
manually connecting the signals from `sim_sram_if` instance.
Signed-off-by: Srikrishna Iyer <sriyer@google.com>
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv b/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
index 4fe5620..b615580 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
@@ -236,7 +236,6 @@
`define RV_CORE_IBEX top_earlgrey.u_rv_core_ibex
`define SIM_SRAM_IF u_sim_sram.u_sim_sram_if
- `define SW_TEST_STATUS_IF `SIM_SRAM_IF.u_sw_test_status_if
// Detect SW test termination.
sim_sram u_sim_sram (
@@ -252,30 +251,32 @@
assign `RV_CORE_IBEX.tl_d_i_int = u_sim_sram.tl_in_o;
assign `RV_CORE_IBEX.tl_d_o = u_sim_sram.tl_out_o;
- // Bind the SW test status interface directly to the sim SRAM interface.
- bind sim_sram_if sw_test_status_if u_sw_test_status_if (
- .addr (tl_h2d.a_address),
- .data (tl_h2d.a_data[15:0]),
- .*
+ // Instantiate the SW test status interface & connect signals from sim_sram_if instance
+ // instantiated inside sim_sram. Bind would have worked nicely here, but Verilator segfaults
+ // when trace is enabled (#3951).
+ sw_test_status_if u_sw_test_status_if (
+ .clk_i (`SIM_SRAM_IF.clk_i),
+ .wr_valid (`SIM_SRAM_IF.wr_valid),
+ .addr (`SIM_SRAM_IF.tl_h2d.a_address),
+ .data (`SIM_SRAM_IF.tl_h2d.a_data[15:0])
);
// Set the start address of the simulation SRAM.
// Use offset 0 within the sim SRAM for SW test status indication.
initial begin
`SIM_SRAM_IF.start_addr = `VERILATOR_TEST_STATUS_ADDR;
- `SW_TEST_STATUS_IF.sw_test_status_addr = `SIM_SRAM_IF.start_addr;
+ u_sw_test_status_if.sw_test_status_addr = `SIM_SRAM_IF.start_addr;
end
always @(posedge clk_i) begin
- if (`SW_TEST_STATUS_IF.sw_test_done) begin
+ if (u_sw_test_status_if.sw_test_done) begin
$display("Verilator sim termination requested");
- $display("Your simulation wrote to 0x%h", `SW_TEST_STATUS_IF.sw_test_status_addr);
+ $display("Your simulation wrote to 0x%h", u_sw_test_status_if.sw_test_status_addr);
$finish;
end
end
`undef RV_CORE_IBEX
`undef SIM_SRAM_IF
- `undef SW_TEST_STATUS_IF
endmodule