Fix vpiInertialDelay for memories (#5113)

This commit is contained in:
Todd Strader 2024-05-10 18:49:43 -04:00 committed by GitHub
parent d99c8f5d44
commit 19cccd170e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 18 additions and 8 deletions

View File

@ -631,16 +631,14 @@ public:
}; };
class VerilatedVpiPutHolder final { class VerilatedVpiPutHolder final {
const VerilatedVar* m_varp; VerilatedVpioVar m_var;
const VerilatedScope* m_scopep;
s_vpi_value m_value; s_vpi_value m_value;
std::string m_str; std::string m_str;
std::vector<s_vpi_vecval> m_vector; std::vector<s_vpi_vecval> m_vector;
public: public:
VerilatedVpiPutHolder(const VerilatedVpioVar* vop, p_vpi_value valuep) VerilatedVpiPutHolder(const VerilatedVpioVar* vop, p_vpi_value valuep)
: m_varp(vop->varp()) : m_var(vop) {
, m_scopep(vop->scopep()) {
m_value.format = valuep->format; m_value.format = valuep->format;
switch (valuep->format) { switch (valuep->format) {
case vpiBinStrVal: case vpiBinStrVal:
@ -691,8 +689,7 @@ public:
} }
} }
const VerilatedVar* varp() { return m_varp; } VerilatedVpioVar* varp() { return &m_var; }
const VerilatedScope* scopep() { return m_scopep; }
p_vpi_value valuep() { return &m_value; } p_vpi_value valuep() { return &m_value; }
static bool canInertialDelay(p_vpi_value valuep) { static bool canInertialDelay(p_vpi_value valuep) {
@ -912,8 +909,7 @@ public:
} }
static void doInertialPuts() { static void doInertialPuts() {
for (auto it : s().m_inertialPuts) { for (auto it : s().m_inertialPuts) {
VerilatedVpioVar vo(it.varp(), it.scopep()); vpi_put_value(it.varp()->castVpiHandle(), it.valuep(), nullptr, vpiNoDelay);
vpi_put_value(vo.castVpiHandle(), it.valuep(), nullptr, vpiNoDelay);
} }
s().m_inertialPuts.clear(); s().m_inertialPuts.clear();
} }

View File

@ -700,6 +700,14 @@ int _mon_check_delayed() {
vpi_get_value(vh, &v); vpi_get_value(vh, &v);
CHECK_RESULT(v.value.integer, 0); CHECK_RESULT(v.value.integer, 0);
TestVpiHandle vhMem = VPI_HANDLE("delayed_mem");
CHECK_RESULT_NZ(vhMem);
TestVpiHandle vhMemWord = vpi_handle_by_index(vhMem, 7);
CHECK_RESULT_NZ(vhMemWord);
v.value.integer = 456;
vpi_put_value(vhMemWord, &v, &t, vpiInertialDelay);
CHECK_RESULT_Z(vpi_chk_error(nullptr));
// test unsupported vpiInertialDelay cases // test unsupported vpiInertialDelay cases
v.format = vpiStringVal; v.format = vpiStringVal;
v.value.str = nullptr; v.value.str = nullptr;

View File

@ -42,6 +42,7 @@ extern "C" int mon_check();
reg [31:0] count /*verilator public_flat_rd */; reg [31:0] count /*verilator public_flat_rd */;
reg [31:0] half_count /*verilator public_flat_rd */; reg [31:0] half_count /*verilator public_flat_rd */;
reg [31:0] delayed /*verilator public_flat_rw */; reg [31:0] delayed /*verilator public_flat_rw */;
reg [31:0] delayed_mem [16] /*verilator public_flat_rw */;
reg [7:0] text_byte /*verilator public_flat_rw @(posedge clk) */; reg [7:0] text_byte /*verilator public_flat_rw @(posedge clk) */;
reg [15:0] text_half /*verilator public_flat_rw @(posedge clk) */; reg [15:0] text_half /*verilator public_flat_rw @(posedge clk) */;
@ -104,6 +105,7 @@ extern "C" int mon_check();
if (count == 1000) begin if (count == 1000) begin
if (delayed != 123) $stop; if (delayed != 123) $stop;
if (delayed_mem[7] != 456) $stop;
$write("*-* All Finished *-*\n"); $write("*-* All Finished *-*\n");
$finish; $finish;
end end

View File

@ -57,6 +57,7 @@ extern "C" int mon_check();
/*verilator public_off*/ /*verilator public_off*/
/*verilator public_flat_rw_on*/ /*verilator public_flat_rw_on*/
reg [31:0] delayed; reg [31:0] delayed;
reg [31:0] delayed_mem [16];
/*verilator public_off*/ /*verilator public_off*/
reg invisible2; reg invisible2;
@ -124,6 +125,7 @@ extern "C" int mon_check();
if (count == 1000) begin if (count == 1000) begin
if (delayed != 123) $stop; if (delayed != 123) $stop;
if (delayed_mem[7] != 456) $stop;
$write("*-* All Finished *-*\n"); $write("*-* All Finished *-*\n");
$finish; $finish;
end end

View File

@ -42,6 +42,7 @@ extern "C" int mon_check();
reg [31:0] count; reg [31:0] count;
reg [31:0] half_count; reg [31:0] half_count;
reg [31:0] delayed; reg [31:0] delayed;
reg [31:0] delayed_mem [16];
reg [7:0] text_byte; reg [7:0] text_byte;
reg [15:0] text_half; reg [15:0] text_half;
@ -104,6 +105,7 @@ extern "C" int mon_check();
if (count == 1000) begin if (count == 1000) begin
if (delayed != 123) $stop; if (delayed != 123) $stop;
if (delayed_mem[7] != 456) $stop;
$write("*-* All Finished *-*\n"); $write("*-* All Finished *-*\n");
$finish; $finish;
end end