mirror of
https://github.com/verilator/verilator.git
synced 2026-09-06 08:57:23 +02:00
Fix dynamic triggers for named events (#4571)
This commit is contained in:
@@ -153,11 +153,12 @@ void VlTriggerScheduler::dump(const char* eventDescription) const {
|
||||
// VlDynamicTriggerScheduler:: Methods
|
||||
|
||||
bool VlDynamicTriggerScheduler::evaluate() {
|
||||
m_anyTriggered = false;
|
||||
VL_DEBUG_IF(dump(););
|
||||
std::swap(m_suspended, m_evaluated);
|
||||
for (auto& coro : m_evaluated) coro.resume();
|
||||
m_evaluated.clear();
|
||||
return !m_triggered.empty();
|
||||
return m_anyTriggered;
|
||||
}
|
||||
|
||||
void VlDynamicTriggerScheduler::doPostUpdates() {
|
||||
|
||||
@@ -275,6 +275,7 @@ public:
|
||||
// co_await __VdynSched.evaluation();
|
||||
// <pre updates>;
|
||||
// __Vtrigger = <trigger eval>;
|
||||
// __VdynShed.anyTriggered(__Vtrigger);
|
||||
// [optionally] co_await __VdynSched.postUpdate();
|
||||
// <post updates>;
|
||||
// }
|
||||
@@ -288,6 +289,7 @@ class VlDynamicTriggerScheduler final {
|
||||
using VlCoroutineVec = std::vector<VlCoroutineHandle>;
|
||||
|
||||
// MEMBERS
|
||||
bool m_anyTriggered = false; // If true, at least one trigger was set
|
||||
VlCoroutineVec m_suspended; // Suspended coroutines awaiting trigger evaluation
|
||||
VlCoroutineVec m_evaluated; // Coroutines currently being evaluated (for evaluate())
|
||||
VlCoroutineVec m_triggered; // Coroutines whose triggers were set, and are awaiting resumption
|
||||
@@ -313,6 +315,8 @@ class VlDynamicTriggerScheduler final {
|
||||
public:
|
||||
// Evaluates all dynamic triggers (resumed coroutines that co_await evaluation())
|
||||
bool evaluate();
|
||||
// Called by coroutines that evaluate triggers to notify the scheduler if any triggers were set
|
||||
void anyTriggered(bool triggered) { m_anyTriggered = m_anyTriggered || triggered; }
|
||||
// Runs post updates for all dynamic triggers (resumes coroutines that co_await postUpdate())
|
||||
void doPostUpdates();
|
||||
// Resumes all coroutines whose triggers are set (those that co_await resumption())
|
||||
|
||||
Reference in New Issue
Block a user