SystemC中,内核回调函数(callback)主要有以下四个:
| 回调函数 | 调用阶段 | 主要用途 |
|---|---|---|
| before_end_of_elaboration() | 所有构造函数完成后,端口绑定之前 | 在端口连接前进行早期设置或检查。 |
| end_of_elaboration() | 所有 before_end_of_elaboration 回调之后,端口绑定完成,仿真开始之前 | 验证结构完整性(如端口是否绑定),进行系统级最终配置。 |
| start_of_simulation() | 首次调用 sc_start() 时,初始化阶段之前 | 初始化与仿真运行相关的状态,如开启波形轨迹(VCD)记录。 |
| end_of_simulation() | 仿真因 sc_stop() 或自然结束而停止时 | 执行清理工作,如关闭文件、打印最终统计结果。 |
1、before_end_of_elaboration()
时机:在所有模块的构造函数执行完毕后,端口(port)和导出(export)进行实际绑定之前被调用。
用途:这是一个早期的钩子,可以在连接关系最终确定前执行一些准备工作。
2、end_of_elaboration()
时机:在“Elaboration阶段的最后时刻被调用。
用途:此时整个模型层次结构和连接关系都已最终确定,是进行结构完整性检查(如使用 is_bound() 检查端口是否连接)和最终配置的理想位置。
3、start_of_simulation()
时机:在首次调用 sc_start() 时、end_of_elaboration 回调之后、仿真内核进行初始化之前被调用。
用途:用于初始化那些依赖于仿真运行状态的代码。例如,在此处开启 VCD 波形转储是安全的,因为此时仿真内核已准备就绪。
4、end_of_simulation()
时机:当仿真因调用 sc_stop() 或达到最大仿真时间而结束时被调用。
用途:与 start_of_simulation 对应,用于执行清理工作,如关闭文件句柄、报告最终覆盖率数据等。
注意:即使多次调用 sc_stop(),此回调也只执行一次。
5、调用顺序总结
整个调用链的完整顺序如下,这清晰地展示了它们在仿真生命周期中的位置:
- 构造函数 (Constructors)
- before_end_of_elaboration()
- 端口(port)和导出(export)进行实际绑定
- end_of_elaboration()
- start_of_simulation()
- (仿真运行…)
- end_of_simulation()
- 析构函数 (Destructors)