SystemC:时间建模

SystemC 仿真中的时间建模,详细介绍仿真时间的表示、分辨率配置、时间控制方法,以及进程延时的实现,为后续并发、时序相关建模奠定基础。

一、三类时间测量维度

SystemC 仿真涉及三种不同时间概念,需明确区分:

  1. 壁钟时间(Wall-Clock Time):从仿真启动到结束的实际流逝时间(含系统其他进程占用时间)。
  2. 处理器时间(Processor Time):CPU 实际用于执行仿真的时间,通常小于壁钟时间。
  3. 仿真时间(Simulated Time):模型所模拟的系统时间,可短于或长于壁钟时间(如用 2 秒壁钟时间模拟 15 毫秒系统时间)。

二、时间的核心表示:sc_time 类

  1. 作用:SystemC 中表示时间的核心数据类型,用于存储仿真时间、指定延时和超时时间。

  2. 语法格式

    cpp

    复制代码
    sc_time name; // 无初始化
    sc_time name(double value, sc_time_unit unit); // 带值和单位初始化
    sc_time name(const sc_time& other); // 拷贝构造,用已经创建的对象再创建另一个
  3. 支持的时间单位 (由sc_time_unit枚举定义):

    • 从飞秒(SC_FS,10⁻¹⁵秒)到秒(SC_SEC,10⁰秒),覆盖硬件建模的细粒度到系统级的粗粒度时间需求。
  4. 核心操作

    • 算术运算:支持+-*/(如t1 + t2t * 2)。
    • 比较运算:支持==!=<>等(如t1 > t2判断时间长短)。
    • 转换方法:to_double()(转换为数值)、to_seconds()(转换为秒数),支持流输出(cout << t)。

三、时间分辨率配置

  1. 定义:仿真时间的最小精度单位,默认值为 1 皮秒(SC_PS)。

  2. 配置方法 :通过sc_set_time_resolution(double value, sc_time_unit unit)设置,示例:

    cpp

    复制代码
    sc_set_time_resolution(1, SC_NS); // 设为1纳秒
  3. 关键限制

    • 仅能设置一次,且必须在创建sc_time对象和调用sc_start()之前完成。
    • 配置值必须是 10 的正整数次幂(如 1、10、100,不能是 3 或 5)。

四、仿真时间的核心控制函数

(一)sc_time_stamp ():获取当前仿真时间

  1. 作用 :返回当前仿真时刻的sc_time对象,用于日志输出、时序判断等。

  2. 示例

    cpp

    复制代码
    cout << "当前时间:" << sc_time_stamp() << endl; // 输出如"0 ns"

(二)sc_start ():启动仿真

  1. 作用:触发仿真内核开始执行,控制仿真运行时长。

  2. 语法格式

    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))
  3. 示例

    cpp

    复制代码
    sc_start(60.0, SC_SEC); // 限制仿真最长运行60秒

(三)wait ():进程延时 / 挂起

  1. 作用:使 SC_THREAD 进程挂起,等待指定时间后恢复,是实现时序的核心函数。

  2. 语法格式

    cpp

    复制代码
    wait(sc_time delay); // 按sc_time对象延时
    wait(double delay, sc_time_unit unit); // 按数值+单位延时(如wait(5, SC_MS))
  3. 注意事项

    • 若延时时间的分辨率高于系统配置的时间分辨率,会自动 rounding(具体规则由仿真器实现)。
    • 仅能在 SC_THREAD 进程中使用,SC_METHOD 进程不可调用。
  4. 示例

    cpp

    复制代码
    void my_thread() {
        wait(10, SC_NS); // 延时10纳秒
        cout << "延时后时间:" << sc_time_stamp() << endl;
    }

五、核心要点与实践建议

  1. 时间分辨率需根据模型精度需求配置:细粒度模型(如 RTL 级)用 PS/NS,粗粒度模型(如算法级)用 MS/SEC,平衡精度与仿真速度。
  2. sc_start()无参数时,仿真会持续运行至无活跃进程,需通过sc_stop()或进程逻辑主动终止。
  3. wait()的延时时间应避免负数,否则行为未定义(多数仿真器会报错)。
  4. 日志输出中结合sc_time_stamp(),可精准追踪进程执行时序,便于调试。