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

This commit is contained in:
Kamil Rakoczy
2023-09-19 17:32:42 -04:00
committed by GitHub
parent b9ea249f81
commit a16ea94836
4 changed files with 11 additions and 13 deletions
+6 -4
View File
@@ -516,9 +516,11 @@ private:
VL_RESTORER(m_capturedVarsp);
VL_RESTORER(m_capturedVarRefsp);
VL_RESTORER(m_newProcess);
VL_RESTORER(m_forkLocalsp);
m_capturedVarsp = nullptr;
m_capturedVarRefsp = nullptr;
m_newProcess = false;
m_forkLocalsp.clear();
iterateChildren(nodep);
@@ -566,7 +568,6 @@ private:
if (!nodep->joinType().join()) {
++m_forkDepth;
m_newProcess = true;
m_forkLocalsp.clear();
// Nested forks get moved into separate tasks
if (nested) {
visitTaskifiable(nodep);
@@ -604,9 +605,10 @@ private:
UASSERT_OBJ(
!nodep->varp()->lifetime().isNone(), nodep,
"Variable's lifetime is unknown. Can't determine if a capture is necessary.");
AstVar* const varp = captureRef(nodep);
nodep->varp(varp);
if (m_forkLocalsp.count(nodep->varp()) == 0) {
AstVar* const varp = captureRef(nodep);
nodep->varp(varp);
}
}
}
void visit(AstAssign* nodep) override {
+3 -5
View File
@@ -13,13 +13,11 @@ scenarios(simulator => 1);
compile(
verilator_flags2 => ["--exe --main --timing"],
make_main => 0,
fails => $Self->{vlt_all}, # issue #4493
);
# issue #4493
#execute(
# check_finished => 1,
# );
execute(
check_finished => 1,
);
ok(1);
1;
+1 -1
View File
@@ -22,7 +22,7 @@ module t(/*AUTOARG*/);
fork
automatic int k = i;
begin
// issue #4493
// see issue #4493
$display("[%0t] start %0d", $time, k);
// UVM's arb_sequence_q[is_relevant_entries[k]].wait_for_relevant();
m_mask[k] = 1;
+1 -3
View File
@@ -19192,9 +19192,7 @@ task uvm_sequencer_base::m_wait_for_available_sequence();
fork
automatic int k = i;
begin
//TODO issue #4493 - Fix UVM fork..join_none local variable can't locate varref scope
//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();
arb_sequence_q[is_relevant_entries[k]].sequence_ptr.wait_for_relevant();
if ($realtime != m_last_wait_relevant_time) begin
m_last_wait_relevant_time = $realtime ;
m_wait_relevant_count = 0 ;