From 6bd6663dc9483d27a94a569c6872f82ef521b802 Mon Sep 17 00:00:00 2001 From: Todd Strader Date: Thu, 7 Aug 2025 11:37:33 -0400 Subject: [PATCH] Fix spurious VPI value change callbacks (#6274) --- include/verilated_vpi.cpp | 2 +- test_regress/t/t_vpi_var.cpp | 18 ++++++++++++++++++ test_regress/t/t_vpi_var.v | 2 ++ test_regress/t/t_vpi_var2.v | 1 + test_regress/t/t_vpi_var3.v | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/verilated_vpi.cpp b/include/verilated_vpi.cpp index a08dea624..a20954308 100644 --- a/include/verilated_vpi.cpp +++ b/include/verilated_vpi.cpp @@ -429,7 +429,7 @@ public: void createPrevDatap() { if (VL_UNLIKELY(!m_prevDatap)) { m_prevDatap = new uint8_t[entSize()]; - std::memcpy(prevDatap(), varp()->datap(), entSize()); + std::memcpy(prevDatap(), m_varDatap, entSize()); } } }; diff --git a/test_regress/t/t_vpi_var.cpp b/test_regress/t/t_vpi_var.cpp index 3a04f6831..428e4298f 100644 --- a/test_regress/t/t_vpi_var.cpp +++ b/test_regress/t/t_vpi_var.cpp @@ -156,6 +156,12 @@ int _value_callback_quad(p_cb_data cb_data) { return 0; } +int _value_callback_never(p_cb_data cb_data) { + printf("%%Error: callback should never be called\n"); + exit(-1); + return 0; +} + int _mon_check_value_callbacks() { s_vpi_value v; v.format = vpiIntVal; @@ -210,6 +216,18 @@ int _mon_check_value_callbacks() { TestVpiHandle callback_h = vpi_register_cb(&cb_data); CHECK_RESULT_NZ(callback_h); } + { + TestVpiHandle vh1 = VPI_HANDLE("some_mem"); + CHECK_RESULT_NZ(vh1); + TestVpiHandle vh2 = vpi_handle_by_index(vh1, 3); + CHECK_RESULT_NZ(vh2); + + cb_data.obj = vh2; + cb_data.cb_rtn = _value_callback_never; + + TestVpiHandle callback_h = vpi_register_cb(&cb_data); + CHECK_RESULT_NZ(callback_h); + } return 0; } diff --git a/test_regress/t/t_vpi_var.v b/test_regress/t/t_vpi_var.v index 240694b86..782143ba1 100644 --- a/test_regress/t/t_vpi_var.v +++ b/test_regress/t/t_vpi_var.v @@ -59,6 +59,8 @@ extern "C" int mon_check(); // keyword collision localparam int nullptr /*verilator public */ = 123; + logic [31:0] some_mem [4] /* verilator public_flat_rd */ = {0, 0, 0, 432}; + sub sub(); // Test loop diff --git a/test_regress/t/t_vpi_var2.v b/test_regress/t/t_vpi_var2.v index 93b720f3d..61df88f63 100644 --- a/test_regress/t/t_vpi_var2.v +++ b/test_regress/t/t_vpi_var2.v @@ -75,6 +75,7 @@ extern "C" int mon_check(); real real1; string str1; localparam int nullptr = 123; + logic [31:0] some_mem [4] = {0, 0, 0, 432}; /*verilator public_off*/ sub sub(); diff --git a/test_regress/t/t_vpi_var3.v b/test_regress/t/t_vpi_var3.v index a6422b8c2..a2f75b88b 100644 --- a/test_regress/t/t_vpi_var3.v +++ b/test_regress/t/t_vpi_var3.v @@ -56,6 +56,7 @@ extern "C" int mon_check(); real real1; string str1; localparam int nullptr = 123; + logic [31:0] some_mem [4] = {0, 0, 0, 432}; sub sub();