SystemC:内核回调函数

📅 2026/7/8 2:30:00 👁️ 阅读次数 📝 编程学习
SystemC:内核回调函数

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)