SystemC 仿真中的时间建模,详细介绍仿真时间的表示、分辨率配置、时间控制方法,以及进程延时的实现,为后续并发、时序相关建模奠定基础。
一、三类时间测量维度
SystemC 仿真涉及三种不同时间概念,需明确区分:
- 壁钟时间(Wall-Clock Time):从仿真启动到结束的实际流逝时间(含系统其他进程占用时间)。
- 处理器时间(Processor Time):CPU 实际用于执行仿真的时间,通常小于壁钟时间。
- 仿真时间(Simulated Time):模型所模拟的系统时间,可短于或长于壁钟时间(如用 2 秒壁钟时间模拟 15 毫秒系统时间)。
二、时间的核心表示:sc_time 类
-
作用:SystemC 中表示时间的核心数据类型,用于存储仿真时间、指定延时和超时时间。
-
语法格式 :
cpp
sc_time name; // 无初始化 sc_time name(double value, sc_time_unit unit); // 带值和单位初始化 sc_time name(const sc_time& other); // 拷贝构造,用已经创建的对象再创建另一个 -
支持的时间单位 (由
sc_time_unit枚举定义):- 从飞秒(SC_FS,10⁻¹⁵秒)到秒(SC_SEC,10⁰秒),覆盖硬件建模的细粒度到系统级的粗粒度时间需求。
-
核心操作 :
- 算术运算:支持
+、-、*、/(如t1 + t2、t * 2)。 - 比较运算:支持
==、!=、<、>等(如t1 > t2判断时间长短)。 - 转换方法:
to_double()(转换为数值)、to_seconds()(转换为秒数),支持流输出(cout << t)。
- 算术运算:支持
三、时间分辨率配置
-
定义:仿真时间的最小精度单位,默认值为 1 皮秒(SC_PS)。
-
配置方法 :通过
sc_set_time_resolution(double value, sc_time_unit unit)设置,示例:cpp
sc_set_time_resolution(1, SC_NS); // 设为1纳秒 -
关键限制 :
- 仅能设置一次,且必须在创建
sc_time对象和调用sc_start()之前完成。 - 配置值必须是 10 的正整数次幂(如 1、10、100,不能是 3 或 5)。
- 仅能设置一次,且必须在创建
四、仿真时间的核心控制函数
(一)sc_time_stamp ():获取当前仿真时间
-
作用 :返回当前仿真时刻的
sc_time对象,用于日志输出、时序判断等。 -
示例 :
cpp
cout << "当前时间:" << sc_time_stamp() << endl; // 输出如"0 ns"
(二)sc_start ():启动仿真
-
作用:触发仿真内核开始执行,控制仿真运行时长。
-
语法格式 :
cpp
sc_start(); // 无参数:运行至无事件可执行、调用sc_stop()或时间溢出 sc_start(const sc_time& max_time); // 运行至指定最长时间 sc_start(double max_time, sc_time_unit unit); // 简化格式(如sc_start(10, SC_NS)) -
示例 :
cpp
sc_start(60.0, SC_SEC); // 限制仿真最长运行60秒
(三)wait ():进程延时 / 挂起
-
作用:使 SC_THREAD 进程挂起,等待指定时间后恢复,是实现时序的核心函数。
-
语法格式 :
cpp
wait(sc_time delay); // 按sc_time对象延时 wait(double delay, sc_time_unit unit); // 按数值+单位延时(如wait(5, SC_MS)) -
注意事项 :
- 若延时时间的分辨率高于系统配置的时间分辨率,会自动 rounding(具体规则由仿真器实现)。
- 仅能在 SC_THREAD 进程中使用,SC_METHOD 进程不可调用。
-
示例 :
cpp
void my_thread() { wait(10, SC_NS); // 延时10纳秒 cout << "延时后时间:" << sc_time_stamp() << endl; }
五、核心要点与实践建议
- 时间分辨率需根据模型精度需求配置:细粒度模型(如 RTL 级)用 PS/NS,粗粒度模型(如算法级)用 MS/SEC,平衡精度与仿真速度。
sc_start()无参数时,仿真会持续运行至无活跃进程,需通过sc_stop()或进程逻辑主动终止。wait()的延时时间应避免负数,否则行为未定义(多数仿真器会报错)。- 日志输出中结合
sc_time_stamp(),可精准追踪进程执行时序,便于调试。