Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}- Verilated::debug is on. Message prefix indicates {<thread>,<sequence_number>}.
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___ctor_var_reset
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit___ctor_var_reset
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aAssignDelayClass__Vclpkg___ctor_var_reset
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass__Vclpkg___ctor_var_reset
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay10__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay20__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay40__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkClass__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkDelayClass__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aLocalWaitClass__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aNoDelay__Vclpkg___ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aWaitClass__Vclpkg___ctor_var_reset
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Initial
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_static
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_static__TOP__t
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::_ctor_var_reset
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass::_ctor_var_reset
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::_ctor_var_reset
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aWaitClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aWaitClass::_ctor_var_reset
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::_ctor_var_reset
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aLocalWaitClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aLocalWaitClass::_ctor_var_reset
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::_ctor_var_reset
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_initial
|
2023-11-21 03:02:10 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__0
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Suspending process waiting for @([event] t.ec.e) at t/t_timing_class.v:111
|
2023-11-21 03:02:10 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__1
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__2
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__3
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__4
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_count_5
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:97
|
2023-11-21 03:02:10 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__5
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__6
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay10::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay10::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay20::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay20::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay40::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay40::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aNoDelay::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aNoDelay::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aAssignDelayClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aAssignDelayClass::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay10::__VnoInFunc_do_delay
|
2023-11-21 03:02:10 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__7
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkClass::_ctor_var_reset
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkClass::__VnoInFunc_do_fork
|
2023-08-30 23:59:25 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkClass::__VnoInFunc_do_fork____Vfork_1__0
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkClass::__VnoInFunc_do_fork____Vfork_1__1
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkClass::__VnoInFunc_do_fork____Vfork_1__1____Vfork_2__0
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkClass::__VnoInFunc_do_fork____Vfork_1__1____Vfork_2__1
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting join of fork at: t/t_timing_class.v:250
|
|
|
|
|
-V{t#,#} Awaiting join of fork at: t/t_timing_class.v:245
|
2023-11-21 03:02:10 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__8
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__9
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_settle
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:97
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Committing processes waiting for @([event] t.ec.e):
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:111
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 5: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#} Awaiting time 10: Process waiting at t/t_timing_class.v:173
|
|
|
|
|
-V{t#,#} Awaiting time 10: Process waiting at t/t_timing_class.v:247
|
|
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:119
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:252
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:257
|
|
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:120
|
|
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
|
|
|
|
-V{t#,#} Resuming delayed processes
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#} Process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:97 awaiting resumption
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 2 is active: @([true] __VdynSched.evaluate())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Resuming processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:97
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:98
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:98
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 10: Process waiting at t/t_timing_class.v:173
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 10: Process waiting at t/t_timing_class.v:247
|
|
|
|
|
-V{t#,#} Awaiting time 10: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:119
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:252
|
|
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:257
|
|
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:120
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:173
|
2025-11-02 22:11:02 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay10::__VnoInFunc_do_sth_else
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay20::__VnoInFunc_do_delay
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:247
|
|
|
|
|
-V{t#,#} Process forked at t/t_timing_class.v:246 finished
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:98
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:98
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-05 12:36:10 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 15: Process waiting at t/t_timing_class.v:131
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:119
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:252
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:257
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:174
|
|
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:120
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:98 awaiting resumption
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 2 is active: @([true] __VdynSched.evaluate())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Resuming processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:98
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:119
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:252
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 20: Process waiting at t/t_timing_class.v:131
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:257
|
|
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:174
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:120
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:119
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass::__VnoInFunc_wake
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:252
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkDelayClass::new
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkDelayClass::_ctor_var_reset
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Process forked at t/t_timing_class.v:251 finished
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 0 is active: @([event] t.ec.e)
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Ready processes waiting for @([event] t.ec.e):
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:111
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Resuming processes waiting for @([event] t.ec.e)
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:111
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass::__VnoInFunc_sleep
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___nba_sequent__TOP__t__0
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass::__VnoInFunc_inc_trig_count
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#} Doing post updates for processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 25: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:257
|
|
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:174
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:120
|
|
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:99 awaiting resumption
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 2 is active: @([true] __VdynSched.evaluate())
|
|
|
|
|
-V{t#,#} Doing post updates for processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Resuming processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:99
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:100
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:100
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:100
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#} Doing post updates for processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:257
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:174
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 30: Process waiting at t/t_timing_class.v:131
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:120
|
|
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:257
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aForkDelayClass::__VnoInFunc_do_delay
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:174
|
2025-11-02 22:11:02 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay20::__VnoInFunc_do_sth_else
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay40::__VnoInFunc_do_delay
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:100
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:100
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:100
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#} Doing post updates for processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 35: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:120
|
|
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:238
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:175
|
|
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
|
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:100 awaiting resumption
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 2 is active: @([true] __VdynSched.evaluate())
|
|
|
|
|
-V{t#,#} Doing post updates for processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Resuming processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:100
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#} Doing post updates for processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:120
|
|
|
|
|
-V{t#,#} Awaiting time 40: Process waiting at t/t_timing_class.v:131
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
|
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:238
|
|
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:175
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:120
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting the post update step
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 0 is active: @([event] t.ec.e)
|
2023-10-16 17:06:41 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 2 is active: @([true] __VdynSched.evaluate())
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Doing post updates for processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Process waiting for @([event] t::EventClass.e) at t/t_timing_class.v:37 awaiting resumption
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No ready processes waiting for @([event] t.ec.e)
|
|
|
|
|
-V{t#,#} Resuming processes waiting for @([event] t.ec.e)
|
|
|
|
|
-V{t#,#} Resuming processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:37
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:37
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass::__VnoInFunc_inc_trig_count
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aWaitClass::__VnoInFunc_await
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___nba_sequent__TOP__t__0
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass::__VnoInFunc_inc_trig_count
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspending process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 45: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:238
|
|
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:175
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Process waiting for @(posedge t::ClkClass.clk) at t/t_timing_class.v:101 awaiting resumption
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 2 is active: @([true] __VdynSched.evaluate())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Resuming processes:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:101
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:101
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:122
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 50: Process waiting at t/t_timing_class.v:131
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:238
|
|
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:175
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:122
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 55: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#} Awaiting time 60: Process waiting at t/t_timing_class.v:123
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:238
|
|
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:175
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 60: Process waiting at t/t_timing_class.v:123
|
|
|
|
|
-V{t#,#} Awaiting time 60: Process waiting at t/t_timing_class.v:131
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:238
|
|
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:175
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:123
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Process waiting for @([true] ((32'sh4 == t::WaitClass.a) & (32'sh10 < t::WaitClass.b))) at t/t_timing_class.v:58 awaiting resumption
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 2 is active: @([true] __VdynSched.evaluate())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Resuming processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:58
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:58
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aLocalWaitClass::__VnoInFunc_await
|
2023-08-30 23:59:25 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aLocalWaitClass::__VnoInFunc_await____Vfork_1__0
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh2a == t::LocalWaitClass.a) | (32'sh64 != t::LocalWaitClass.b))) at t/t_timing_class.v:75
|
2023-08-30 23:59:25 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aLocalWaitClass::__VnoInFunc_await____Vfork_1__1
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} Awaiting join of fork at: t/t_timing_class.v:74
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh2a == t::LocalWaitClass.a) | (32'sh64 != t::LocalWaitClass.b))) at t/t_timing_class.v:75
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh2a == t::LocalWaitClass.a) | (32'sh64 != t::LocalWaitClass.b))) at t/t_timing_class.v:75
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh2a == t::LocalWaitClass.a) | (32'sh64 != t::LocalWaitClass.b))) at t/t_timing_class.v:75
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 65: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:238
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:175
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:76
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh2a == t::LocalWaitClass.a) | (32'sh64 != t::LocalWaitClass.b))) at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh2a == t::LocalWaitClass.a) | (32'sh64 != t::LocalWaitClass.b))) at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
|
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Suspending process waiting for @([true] ((32'sh2a == t::LocalWaitClass.a) | (32'sh64 != t::LocalWaitClass.b))) at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:238
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:175
|
|
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:76
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 70: Process waiting at t/t_timing_class.v:131
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
|
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:238
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Process forked at t/t_timing_class.v:256 finished
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:250
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Process forked at t/t_timing_class.v:250 finished
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:245
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:175
|
2025-11-02 22:11:02 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay40::__VnoInFunc_do_sth_else
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aNoDelay::__VnoInFunc_do_delay
|
2025-11-02 22:11:02 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aNoDelay::__VnoInFunc_do_sth_else
|
2023-11-21 03:02:10 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__6____Vfork_1__0
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aAssignDelayClass::__VnoInFunc_do_assign
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:76
|
|
|
|
|
-V{t#,#} Process forked at t/t_timing_class.v:76 finished
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Suspended processes waiting for dynamic trigger evaluation:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Process waiting for @([true] ((32'sh2a == t::LocalWaitClass.a) | (32'sh64 != t::LocalWaitClass.b))) at t/t_timing_class.v:75 awaiting resumption
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 2 is active: @([true] __VdynSched.evaluate())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} Resuming processes:
|
2023-05-04 15:27:45 +02:00
|
|
|
-V{t#,#} - Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:75
|
|
|
|
|
-V{t#,#} Process forked at t/t_timing_class.v:75 finished
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:74
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 75: Process waiting at t/t_timing_class.v:224
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 75: Process waiting at t/t_timing_class.v:131
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:190
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:224
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:136
|
|
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:190
|
|
|
|
|
-V{t#,#} Awaiting time 80: Process waiting at t/t_timing_class.v:131
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:136
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:190
|
2023-11-21 03:02:10 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t___eval_initial__TOP__t__Vtiming__6____Vfork_2__0
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aAssignDelayClass::__VnoInFunc_do_assign
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 85: Process waiting at t/t_timing_class.v:230
|
|
|
|
|
-V{t#,#} Awaiting time 85: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 90: Process waiting at t/t_timing_class.v:190
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:230
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 90: Process waiting at t/t_timing_class.v:190
|
|
|
|
|
-V{t#,#} Awaiting time 90: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#} Awaiting time 100: Process waiting at t/t_timing_class.v:231
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:190
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 95: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#} Awaiting time 100: Process waiting at t/t_timing_class.v:231
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
|
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
|
|
|
|
-V{t#,#}+++++TOP Evaluate Vt_timing_debug2::eval_step
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_debug_assertions
|
|
|
|
|
-V{t#,#}+ Eval
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
|
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} 'act' region trigger index 1 is active: @([true] __VdlySched.awaitingCurrentTime())
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_resume
|
|
|
|
|
-V{t#,#} Delayed processes:
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Awaiting time 100: Process waiting at t/t_timing_class.v:231
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#} Awaiting time 100: Process waiting at t/t_timing_class.v:131
|
2023-11-11 16:04:10 +01:00
|
|
|
-V{t#,#} Awaiting time 101: Process waiting at t/t_timing_class.v:274
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#} Resuming delayed processes
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:231
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
*-* All Finished *-*
|
2023-08-21 16:22:09 +02:00
|
|
|
-V{t#,#} Resuming: Process waiting at t/t_timing_class.v:131
|
2023-07-07 14:19:49 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aClkClass::__VnoInFunc_flip
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_clear__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__act
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_triggers__act
|
2022-10-22 16:05:39 +02:00
|
|
|
-V{t#,#} No suspended processes waiting for dynamic trigger evaluation
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___dump_triggers__act
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
|
|
|
|
-V{t#,#} No 'act' region triggers active
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___timing_commit
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_orInto__act
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2023-10-28 09:14:38 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_phase__nba
|
2025-10-31 19:29:11 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___trigger_anySet__act
|
2022-11-05 13:47:34 +01:00
|
|
|
-V{t#,#}End-of-eval cleanup
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
-V{t#,#}+ Vt_timing_debug2___024root___eval_final
|
2025-11-02 22:11:02 +01:00
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay40::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay20::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelay10::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aNoDelay::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aDelayClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aLocalWaitClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aWaitClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2_t__03a__03aEventClass::~
|
|
|
|
|
-V{t#,#}+ Vt_timing_debug2___024unit__03a__03aBaseClass::~
|