Fix emitting timing debug info with `--protect-ids` (#3689) (#3701)

This commit is contained in:
Krzysztof Bieganski 2022-10-21 20:56:44 +00:00 committed by GitHub
parent 2e4f5c863f
commit 785c51dd0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 147 additions and 95 deletions

View File

@ -53,6 +53,9 @@
#endif #endif
// clang-format on // clang-format on
// Placeholder for compiling with --protect-ids
#define VL_UNKNOWN "<unknown>"
//============================================================================= //=============================================================================
// VlFileLineDebug stores a SystemVerilog source code location. Used in VlCoroutineHandle for // VlFileLineDebug stores a SystemVerilog source code location. Used in VlCoroutineHandle for
// debugging purposes. // debugging purposes.
@ -170,7 +173,7 @@ public:
void dump() const; void dump() const;
#endif #endif
// Used by coroutines for co_awaiting a certain simulation time // Used by coroutines for co_awaiting a certain simulation time
auto delay(uint64_t delay, const char* filename, int lineno) { auto delay(uint64_t delay, const char* filename = VL_UNKNOWN, int lineno = 0) {
struct Awaitable { struct Awaitable {
VlDelayedCoroutineQueue& queue; VlDelayedCoroutineQueue& queue;
uint64_t delay; uint64_t delay;
@ -208,16 +211,17 @@ class VlTriggerScheduler final {
public: public:
// METHODS // METHODS
// Resumes all coroutines from the 'ready' stage // Resumes all coroutines from the 'ready' stage
void resume(const char* eventDescription); void resume(const char* eventDescription = VL_UNKNOWN);
// Moves all coroutines from m_uncommitted to m_ready // Moves all coroutines from m_uncommitted to m_ready
void commit(const char* eventDescription); void commit(const char* eventDescription = VL_UNKNOWN);
// Are there no coroutines awaiting? // Are there no coroutines awaiting?
bool empty() const { return m_ready.empty() && m_uncommitted.empty(); } bool empty() const { return m_ready.empty() && m_uncommitted.empty(); }
#ifdef VL_DEBUG #ifdef VL_DEBUG
void dump(const char* eventDescription) const; void dump(const char* eventDescription) const;
#endif #endif
// Used by coroutines for co_awaiting a certain trigger // Used by coroutines for co_awaiting a certain trigger
auto trigger(const char* eventDescription, const char* filename, int lineno) { auto trigger(const char* eventDescription = VL_UNKNOWN, const char* filename = VL_UNKNOWN,
int lineno = 0) {
VL_DEBUG_IF(VL_DBG_MSGF(" Suspending process waiting for %s at %s:%d\n", VL_DEBUG_IF(VL_DBG_MSGF(" Suspending process waiting for %s at %s:%d\n",
eventDescription, filename, lineno);); eventDescription, filename, lineno););
struct Awaitable { struct Awaitable {
@ -273,9 +277,9 @@ public:
void init(size_t count) { m_join.reset(new VlJoin{count, {}}); } void init(size_t count) { m_join.reset(new VlJoin{count, {}}); }
// Called whenever any of the forked processes finishes. If the join counter reaches 0, the // Called whenever any of the forked processes finishes. If the join counter reaches 0, the
// main process gets resumed // main process gets resumed
void done(const char* filename, int lineno); void done(const char* filename = VL_UNKNOWN, int lineno = 0);
// Used by coroutines for co_awaiting a join // Used by coroutines for co_awaiting a join
auto join(const char* filename, int lineno) { auto join(const char* filename = VL_UNKNOWN, int lineno = 0) {
assert(m_join); assert(m_join);
VL_DEBUG_IF( VL_DEBUG_IF(
VL_DBG_MSGF(" Awaiting join of fork at: %s:%d\n", filename, lineno);); VL_DBG_MSGF(" Awaiting join of fork at: %s:%d\n", filename, lineno););

View File

@ -115,7 +115,7 @@ AstCCall* TimingKit::createCommit(AstNetlist* const netlistp) {
// Create the commit call and put it in the commit function // Create the commit call and put it in the commit function
auto* const commitp = new AstCMethodHard{ auto* const commitp = new AstCMethodHard{
flp, new AstVarRef{flp, schedulerp, VAccess::READWRITE}, "commit"}; flp, new AstVarRef{flp, schedulerp, VAccess::READWRITE}, "commit"};
commitp->addPinsp(resumep->pinsp()->cloneTree(false)); if (resumep->pinsp()) commitp->addPinsp(resumep->pinsp()->cloneTree(false));
commitp->statement(true); commitp->statement(true);
commitp->dtypeSetVoid(); commitp->dtypeSetVoid();
newactp->addStmtsp(commitp); newactp->addStmtsp(commitp);
@ -159,7 +159,7 @@ TimingKit prepareTiming(AstNetlist* const netlistp) {
// Create a resume() call on the timing scheduler // Create a resume() call on the timing scheduler
auto* const resumep = new AstCMethodHard{ auto* const resumep = new AstCMethodHard{
flp, new AstVarRef{flp, schedulerp, VAccess::READWRITE}, "resume"}; flp, new AstVarRef{flp, schedulerp, VAccess::READWRITE}, "resume"};
if (schedulerp->dtypep()->basicp()->isTriggerScheduler()) { if (schedulerp->dtypep()->basicp()->isTriggerScheduler() && methodp->pinsp()) {
resumep->addPinsp(methodp->pinsp()->cloneTree(false)); resumep->addPinsp(methodp->pinsp()->cloneTree(false));
} }
resumep->statement(true); resumep->statement(true);

View File

@ -256,6 +256,19 @@ private:
} }
return VN_AS(sensesp->user2p(), Text)->cloneTree(false); return VN_AS(sensesp->user2p(), Text)->cloneTree(false);
} }
// Adds debug info to a hardcoded method call
void addDebugInfo(AstCMethodHard* const methodp) const {
if (v3Global.opt.protectIds()) return;
FileLine* const flp = methodp->fileline();
methodp->addPinsp(new AstText{flp, '"' + flp->filename() + '"'});
methodp->addPinsp(new AstText{flp, cvtToStr(flp->lineno())});
}
// Adds debug info to a trigSched.trigger() call
void addEventDebugInfo(AstCMethodHard* const methodp, AstSenTree* const sensesp) const {
if (v3Global.opt.protectIds()) return;
methodp->addPinsp(createEventDescription(sensesp));
addDebugInfo(methodp);
}
// Creates the fork handle type and returns it // Creates the fork handle type and returns it
AstBasicDType* getCreateForkSyncDTypep() { AstBasicDType* getCreateForkSyncDTypep() {
if (m_forkDtp) return m_forkDtp; if (m_forkDtp) return m_forkDtp;
@ -287,9 +300,7 @@ private:
beginp->fileline(), new AstVarRef{flp, forkVscp, VAccess::WRITE}, "done"}; beginp->fileline(), new AstVarRef{flp, forkVscp, VAccess::WRITE}, "done"};
donep->dtypeSetVoid(); donep->dtypeSetVoid();
donep->statement(true); donep->statement(true);
// Add debug info addDebugInfo(donep);
donep->addPinsp(new AstText{flp, '"' + flp->filename() + '"'});
donep->addPinsp(new AstText{flp, cvtToStr(flp->lineno())});
beginp->addStmtsp(donep); beginp->addStmtsp(donep);
} }
// Handle the 'join' part of a fork..join // Handle the 'join' part of a fork..join
@ -317,9 +328,7 @@ private:
auto* const joinp auto* const joinp
= new AstCMethodHard{flp, new AstVarRef{flp, forkVscp, VAccess::WRITE}, "join"}; = new AstCMethodHard{flp, new AstVarRef{flp, forkVscp, VAccess::WRITE}, "join"};
joinp->dtypeSetVoid(); joinp->dtypeSetVoid();
// Add debug info addDebugInfo(joinp);
joinp->addPinsp(new AstText{flp, '"' + flp->filename() + '"'});
joinp->addPinsp(new AstText{flp, cvtToStr(flp->lineno())});
auto* const awaitp = new AstCAwait{flp, joinp}; auto* const awaitp = new AstCAwait{flp, joinp};
awaitp->statement(true); awaitp->statement(true);
forkp->addNextHere(awaitp); forkp->addNextHere(awaitp);
@ -462,9 +471,7 @@ private:
auto* const delayMethodp = new AstCMethodHard{ auto* const delayMethodp = new AstCMethodHard{
flp, new AstVarRef{flp, getCreateDelayScheduler(), VAccess::WRITE}, "delay", valuep}; flp, new AstVarRef{flp, getCreateDelayScheduler(), VAccess::WRITE}, "delay", valuep};
delayMethodp->dtypeSetVoid(); delayMethodp->dtypeSetVoid();
// Add debug info addDebugInfo(delayMethodp);
delayMethodp->addPinsp(new AstText{flp, '"' + flp->filename() + '"'});
delayMethodp->addPinsp(new AstText{flp, cvtToStr(flp->lineno())});
// Create the co_await // Create the co_await
auto* const awaitp = new AstCAwait{flp, delayMethodp, getCreateDelaySenTree()}; auto* const awaitp = new AstCAwait{flp, delayMethodp, getCreateDelaySenTree()};
awaitp->statement(true); awaitp->statement(true);
@ -487,9 +494,7 @@ private:
"trigger"}; "trigger"};
triggerMethodp->dtypeSetVoid(); triggerMethodp->dtypeSetVoid();
// Add debug info // Add debug info
triggerMethodp->addPinsp(createEventDescription(sensesp)); addEventDebugInfo(triggerMethodp, sensesp);
triggerMethodp->addPinsp(new AstText{flp, '"' + flp->filename() + '"'});
triggerMethodp->addPinsp(new AstText{flp, cvtToStr(flp->lineno())});
// Create the co_await // Create the co_await
auto* const awaitp = new AstCAwait{flp, triggerMethodp, sensesp}; auto* const awaitp = new AstCAwait{flp, triggerMethodp, sensesp};
awaitp->statement(true); awaitp->statement(true);

View File

@ -240,7 +240,7 @@
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:30 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:30
[64] main process [64] main process
-V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__0 -V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__0
-V{t#,#} Suspending process waiting for @([event] t.e1) at t/t_timing_fork_join.v:33 -V{t#,#} Suspending process waiting for @([event] t.event1) at t/t_timing_fork_join.v:33
fork..join_any process 2 fork..join_any process 2
-V{t#,#} Process forked at t/t_timing_fork_join.v:37 finished -V{t#,#} Process forked at t/t_timing_fork_join.v:37 finished
-V{t#,#} Awaiting join of fork at: t/t_timing_fork_join.v:31 -V{t#,#} Awaiting join of fork at: t/t_timing_fork_join.v:31
@ -250,7 +250,7 @@ back in main process
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} No triggers active -V{t#,#} No triggers active
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#} Committing processes waiting for @([event] t.e1): -V{t#,#} Committing processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:33 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:33
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba -V{t#,#}+ Vt_timing_debug2___024root___eval_nba
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
@ -274,23 +274,23 @@ back in main process
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 1 is active: @([event] t.e1) -V{t#,#} 'act' region trigger index 1 is active: @([event] t.event1)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e1): -V{t#,#} Ready processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:33 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:33
-V{t#,#} Resuming processes waiting for @([event] t.e1) -V{t#,#} Resuming processes waiting for @([event] t.event1)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:33 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:33
fork..join_any process 1 fork..join_any process 1
-V{t#,#} Process forked at t/t_timing_fork_join.v:32 finished -V{t#,#} Process forked at t/t_timing_fork_join.v:32 finished
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 1 is active: @([event] t.e1) -V{t#,#} 'act' region trigger index 1 is active: @([event] t.event1)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} No ready processes waiting for @([event] t.e1) -V{t#,#} No ready processes waiting for @([event] t.event1)
-V{t#,#} Resuming processes waiting for @([event] t.e1) -V{t#,#} Resuming processes waiting for @([event] t.event1)
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
@ -317,14 +317,14 @@ fork..join_any process 1
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:41 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:41
-V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__0 -V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__0
-V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__1 -V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__1
-V{t#,#} Suspending process waiting for @([event] t.e1) at t/t_timing_fork_join.v:44 -V{t#,#} Suspending process waiting for @([event] t.event1) at t/t_timing_fork_join.v:44
-V{t#,#} Awaiting join of fork at: t/t_timing_fork_join.v:41 -V{t#,#} Awaiting join of fork at: t/t_timing_fork_join.v:41
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} No triggers active -V{t#,#} No triggers active
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#} Committing processes waiting for @([event] t.e1): -V{t#,#} Committing processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:44 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:44
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba -V{t#,#}+ Vt_timing_debug2___024root___eval_nba
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
@ -373,50 +373,50 @@ back in main process
-V{t#,#} Awaiting time 100: Process waiting at t/t_timing_fork_join.v:50 -V{t#,#} Awaiting time 100: Process waiting at t/t_timing_fork_join.v:50
-V{t#,#} Resuming delayed processes -V{t#,#} Resuming delayed processes
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:50 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:50
-V{t#,#} Suspending process waiting for @([event] t.e1) at t/t_timing_fork_join.v:51 -V{t#,#} Suspending process waiting for @([event] t.event1) at t/t_timing_fork_join.v:51
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 1 is active: @([event] t.e1) -V{t#,#} 'act' region trigger index 1 is active: @([event] t.event1)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e1): -V{t#,#} Ready processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:44 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:44
-V{t#,#} Uncommitted processes waiting for @([event] t.e1): -V{t#,#} Uncommitted processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:51 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:51
-V{t#,#} Resuming processes waiting for @([event] t.e1) -V{t#,#} Resuming processes waiting for @([event] t.event1)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:44 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:44
fork..join_any process 2 fork..join_any process 2
-V{t#,#} Process forked at t/t_timing_fork_join.v:43 finished -V{t#,#} Process forked at t/t_timing_fork_join.v:43 finished
-V{t#,#} Committing processes waiting for @([event] t.e1): -V{t#,#} Committing processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:51 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:51
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 1 is active: @([event] t.e1) -V{t#,#} 'act' region trigger index 1 is active: @([event] t.event1)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e1): -V{t#,#} Ready processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:51 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:51
-V{t#,#} Resuming processes waiting for @([event] t.e1) -V{t#,#} Resuming processes waiting for @([event] t.event1)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:51 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:51
-V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__0 -V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__0
-V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__1 -V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__1
-V{t#,#} Suspending process waiting for @([event] t.e2) at t/t_timing_fork_join.v:62 -V{t#,#} Suspending process waiting for @([event] t.event2) at t/t_timing_fork_join.v:62
-V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__2 -V{t#,#}+ Vt_timing_debug2___024root____Vfork_h########__0__2
-V{t#,#} Suspending process waiting for @([event] t.e3) at t/t_timing_fork_join.v:68 -V{t#,#} Suspending process waiting for @([event] t.event3) at t/t_timing_fork_join.v:68
in main process in main process
-V{t#,#} Suspending process waiting for @([event] t.e1) at t/t_timing_fork_join.v:75 -V{t#,#} Suspending process waiting for @([event] t.event1) at t/t_timing_fork_join.v:75
-V{t#,#} Committing processes waiting for @([event] t.e1): -V{t#,#} Committing processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:75 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:75
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} No triggers active -V{t#,#} No triggers active
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#} Committing processes waiting for @([event] t.e2): -V{t#,#} Committing processes waiting for @([event] t.event2):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:62 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:62
-V{t#,#} Committing processes waiting for @([event] t.e3): -V{t#,#} Committing processes waiting for @([event] t.event3):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:68 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:68
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba -V{t#,#}+ Vt_timing_debug2___024root___eval_nba
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
@ -438,21 +438,21 @@ in main process
-V{t#,#} Resuming delayed processes -V{t#,#} Resuming delayed processes
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:56 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:56
fork..join_none process 1 fork..join_none process 1
-V{t#,#} Suspending process waiting for @([event] t.e2) at t/t_timing_fork_join.v:58 -V{t#,#} Suspending process waiting for @([event] t.event2) at t/t_timing_fork_join.v:58
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 2 is active: @([event] t.e2) -V{t#,#} 'act' region trigger index 2 is active: @([event] t.event2)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e2): -V{t#,#} Ready processes waiting for @([event] t.event2):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:62 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:62
-V{t#,#} Uncommitted processes waiting for @([event] t.e2): -V{t#,#} Uncommitted processes waiting for @([event] t.event2):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:58 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:58
-V{t#,#} Resuming processes waiting for @([event] t.e2) -V{t#,#} Resuming processes waiting for @([event] t.event2)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:62 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:62
fork..join_none process 2 fork..join_none process 2
-V{t#,#} Committing processes waiting for @([event] t.e2): -V{t#,#} Committing processes waiting for @([event] t.event2):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:58 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:58
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
@ -478,21 +478,21 @@ fork..join_none process 2
-V{t#,#} Awaiting time 100: Process waiting at t/t_timing_fork_join.v:63 -V{t#,#} Awaiting time 100: Process waiting at t/t_timing_fork_join.v:63
-V{t#,#} Resuming delayed processes -V{t#,#} Resuming delayed processes
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:63 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:63
-V{t#,#} Suspending process waiting for @([event] t.e3) at t/t_timing_fork_join.v:64 -V{t#,#} Suspending process waiting for @([event] t.event3) at t/t_timing_fork_join.v:64
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 3 is active: @([event] t.e3) -V{t#,#} 'act' region trigger index 3 is active: @([event] t.event3)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e3): -V{t#,#} Ready processes waiting for @([event] t.event3):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:68 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:68
-V{t#,#} Uncommitted processes waiting for @([event] t.e3): -V{t#,#} Uncommitted processes waiting for @([event] t.event3):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:64 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:64
-V{t#,#} Resuming processes waiting for @([event] t.e3) -V{t#,#} Resuming processes waiting for @([event] t.event3)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:68 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:68
fork..join_none process 3 fork..join_none process 3
-V{t#,#} Committing processes waiting for @([event] t.e3): -V{t#,#} Committing processes waiting for @([event] t.event3):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:64 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:64
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
@ -518,21 +518,21 @@ fork..join_none process 3
-V{t#,#} Awaiting time 100: Process waiting at t/t_timing_fork_join.v:69 -V{t#,#} Awaiting time 100: Process waiting at t/t_timing_fork_join.v:69
-V{t#,#} Resuming delayed processes -V{t#,#} Resuming delayed processes
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:69 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:69
-V{t#,#} Suspending process waiting for @([event] t.e3) at t/t_timing_fork_join.v:70 -V{t#,#} Suspending process waiting for @([event] t.event3) at t/t_timing_fork_join.v:70
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 3 is active: @([event] t.e3) -V{t#,#} 'act' region trigger index 3 is active: @([event] t.event3)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e3): -V{t#,#} Ready processes waiting for @([event] t.event3):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:64 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:64
-V{t#,#} Uncommitted processes waiting for @([event] t.e3): -V{t#,#} Uncommitted processes waiting for @([event] t.event3):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:70 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:70
-V{t#,#} Resuming processes waiting for @([event] t.e3) -V{t#,#} Resuming processes waiting for @([event] t.event3)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:64 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:64
fork..join_none process 2 again fork..join_none process 2 again
-V{t#,#} Committing processes waiting for @([event] t.e3): -V{t#,#} Committing processes waiting for @([event] t.event3):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:70 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:70
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
@ -561,12 +561,12 @@ fork..join_none process 2 again
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 2 is active: @([event] t.e2) -V{t#,#} 'act' region trigger index 2 is active: @([event] t.event2)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e2): -V{t#,#} Ready processes waiting for @([event] t.event2):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:58 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:58
-V{t#,#} Resuming processes waiting for @([event] t.e2) -V{t#,#} Resuming processes waiting for @([event] t.event2)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:58 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:58
fork..join_none process 1 again fork..join_none process 1 again
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
@ -596,23 +596,23 @@ fork..join_none process 1 again
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 3 is active: @([event] t.e3) -V{t#,#} 'act' region trigger index 3 is active: @([event] t.event3)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e3): -V{t#,#} Ready processes waiting for @([event] t.event3):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:70 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:70
-V{t#,#} Resuming processes waiting for @([event] t.e3) -V{t#,#} Resuming processes waiting for @([event] t.event3)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:70 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:70
fork..join_none process 3 again fork..join_none process 3 again
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act -V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
-V{t#,#} 'act' region trigger index 1 is active: @([event] t.e1) -V{t#,#} 'act' region trigger index 1 is active: @([event] t.event1)
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit -V{t#,#}+ Vt_timing_debug2___024root___timing_commit
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume -V{t#,#}+ Vt_timing_debug2___024root___timing_resume
-V{t#,#} Ready processes waiting for @([event] t.e1): -V{t#,#} Ready processes waiting for @([event] t.event1):
-V{t#,#} - Process waiting at t/t_timing_fork_join.v:75 -V{t#,#} - Process waiting at t/t_timing_fork_join.v:75
-V{t#,#} Resuming processes waiting for @([event] t.e1) -V{t#,#} Resuming processes waiting for @([event] t.event1)
-V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:75 -V{t#,#} Resuming: Process waiting at t/t_timing_fork_join.v:75
*-* All Finished *-* *-* All Finished *-*
-V{t#,#}+ Vt_timing_debug2___024root___eval_act -V{t#,#}+ Vt_timing_debug2___024root___eval_act

View File

@ -5,9 +5,9 @@
// SPDX-License-Identifier: CC0-1.0 // SPDX-License-Identifier: CC0-1.0
module t; module t;
event e1; event event1;
event e2; event event2;
event e3; event event3;
initial begin initial begin
fork fork
@ -30,49 +30,49 @@ module t;
#32 $write("[%0t] main process\n", $time); #32 $write("[%0t] main process\n", $time);
fork fork
begin begin
@e1; @event1;
$write("fork..join_any process 1\n"); $write("fork..join_any process 1\n");
->e1; ->event1;
end end
$write("fork..join_any process 2\n"); $write("fork..join_any process 2\n");
join_any join_any
$write("back in main process\n"); $write("back in main process\n");
#1 ->e1; #1 ->event1;
#1 fork #1 fork
#2 $write("fork..join_any process 1\n"); #2 $write("fork..join_any process 1\n");
begin begin
@e1; @event1;
$write("fork..join_any process 2\n"); $write("fork..join_any process 2\n");
->e1; ->event1;
end end
join_any join_any
$write("back in main process\n"); $write("back in main process\n");
#1 ->e1; #1 ->event1;
@e1; @event1;
// Order of triggering: // Order of triggering:
// p1->e2 ==> p2->e3 ==> p3->e3 ==> p2->e2 ==> p1->e3 ==> p3->e1 // p1->event2 ==> p2->event3 ==> p3->event3 ==> p2->event2 ==> p1->event3 ==> p3->event1
fork fork
begin begin
#1 $write("fork..join_none process 1\n"); #1 $write("fork..join_none process 1\n");
->e2; ->event2;
@e2 $write("fork..join_none process 1 again\n"); @event2 $write("fork..join_none process 1 again\n");
#1 ->e3; #1 ->event3;
end end
begin begin
@e2 $write("fork..join_none process 2\n"); @event2 $write("fork..join_none process 2\n");
#1 ->e3; #1 ->event3;
@e3 $write("fork..join_none process 2 again\n"); @event3 $write("fork..join_none process 2 again\n");
#1 ->e2; #1 ->event2;
end end
begin begin
@e3 $write("fork..join_none process 3\n"); @event3 $write("fork..join_none process 3\n");
#1 ->e3; #1 ->event3;
@e3 $write("fork..join_none process 3 again\n"); @event3 $write("fork..join_none process 3 again\n");
->e1; ->event1;
end end
join_none join_none
$write("in main process\n"); $write("in main process\n");
@e1; @event1;
$write("*-* All Finished *-*\n"); $write("*-* All Finished *-*\n");
$finish; $finish;
end end

View File

@ -0,0 +1,43 @@
#!/usr/bin/env perl
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2022 by Antmicro Ltd. This program is free software; you
# can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
scenarios(vlt => 1);
if (!$Self->have_coroutines) {
skip("No coroutine support");
}
else {
top_filename("t/t_timing_fork_join.v"); # Contains all relevant constructs
compile(
verilator_flags2 => ["--exe --main --timing --protect-ids"],
make_main => 0,
);
execute(
check_finished => 1,
);
if ($Self->{vlt_all}) {
# Check for secret in any outputs
my $any;
foreach my $filename (glob $Self->{obj_dir} . "/*.[ch]*") {
file_grep_not($filename, qr/event[123]/i);
file_grep_not($filename, qr/t_timing_fork_join/i);
$any = 1;
}
$any or $Self->error("No outputs found");
}
}
ok(1);
1;