Fix detecting local vars in nested forks (#4493) (#4506)

This commit is contained in:
Kamil Rakoczy 2023-09-19 23:32:42 +02:00 committed by GitHub
parent b9ea249f81
commit a16ea94836
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 11 additions and 13 deletions

View File

@ -516,9 +516,11 @@ private:
VL_RESTORER(m_capturedVarsp); VL_RESTORER(m_capturedVarsp);
VL_RESTORER(m_capturedVarRefsp); VL_RESTORER(m_capturedVarRefsp);
VL_RESTORER(m_newProcess); VL_RESTORER(m_newProcess);
VL_RESTORER(m_forkLocalsp);
m_capturedVarsp = nullptr; m_capturedVarsp = nullptr;
m_capturedVarRefsp = nullptr; m_capturedVarRefsp = nullptr;
m_newProcess = false; m_newProcess = false;
m_forkLocalsp.clear();
iterateChildren(nodep); iterateChildren(nodep);
@ -566,7 +568,6 @@ private:
if (!nodep->joinType().join()) { if (!nodep->joinType().join()) {
++m_forkDepth; ++m_forkDepth;
m_newProcess = true; m_newProcess = true;
m_forkLocalsp.clear();
// Nested forks get moved into separate tasks // Nested forks get moved into separate tasks
if (nested) { if (nested) {
visitTaskifiable(nodep); visitTaskifiable(nodep);
@ -604,9 +605,10 @@ private:
UASSERT_OBJ( UASSERT_OBJ(
!nodep->varp()->lifetime().isNone(), nodep, !nodep->varp()->lifetime().isNone(), nodep,
"Variable's lifetime is unknown. Can't determine if a capture is necessary."); "Variable's lifetime is unknown. Can't determine if a capture is necessary.");
if (m_forkLocalsp.count(nodep->varp()) == 0) {
AstVar* const varp = captureRef(nodep); AstVar* const varp = captureRef(nodep);
nodep->varp(varp); nodep->varp(varp);
}
} }
} }
void visit(AstAssign* nodep) override { void visit(AstAssign* nodep) override {

View File

@ -13,13 +13,11 @@ scenarios(simulator => 1);
compile( compile(
verilator_flags2 => ["--exe --main --timing"], verilator_flags2 => ["--exe --main --timing"],
make_main => 0, make_main => 0,
fails => $Self->{vlt_all}, # issue #4493
); );
# issue #4493 execute(
#execute( check_finished => 1,
# check_finished => 1, );
# );
ok(1); ok(1);
1; 1;

View File

@ -22,7 +22,7 @@ module t(/*AUTOARG*/);
fork fork
automatic int k = i; automatic int k = i;
begin begin
// issue #4493 // see issue #4493
$display("[%0t] start %0d", $time, k); $display("[%0t] start %0d", $time, k);
// UVM's arb_sequence_q[is_relevant_entries[k]].wait_for_relevant(); // UVM's arb_sequence_q[is_relevant_entries[k]].wait_for_relevant();
m_mask[k] = 1; m_mask[k] = 1;

View File

@ -19192,9 +19192,7 @@ task uvm_sequencer_base::m_wait_for_available_sequence();
fork fork
automatic int k = i; automatic int k = i;
begin begin
//TODO issue #4493 - Fix UVM fork..join_none local variable can't locate varref scope arb_sequence_q[is_relevant_entries[k]].sequence_ptr.wait_for_relevant();
//TODO %Error: Internal Error: t/t_uvm_pkg_todo.vh:19203:56: ../V3Scope.cpp:80: Can't locate varref scope
//TODO arb_sequence_q[is_relevant_entries[k]].sequence_ptr.wait_for_relevant();
if ($realtime != m_last_wait_relevant_time) begin if ($realtime != m_last_wait_relevant_time) begin
m_last_wait_relevant_time = $realtime ; m_last_wait_relevant_time = $realtime ;
m_wait_relevant_count = 0 ; m_wait_relevant_count = 0 ;