编辑
2024-03-08
SystemC
00
请注意,本文编写于 408 天前,最后修改于 408 天前,其中某些信息可能已经过时。

目录

Simulation Process
Simulation_Process.cpp
结果

Simulation Process

Simulation Process:

  1. 是sc_module类的成员函数,并且
  2. 没有输入参数,也没有返回值,那么
  3. 是否注册到模拟内核

如何注册一个Simulation Process:

  1. SC_METHOD(func):没有自己的执行线程,不消耗模拟时间,不能挂起,不能调用调用wait()的代码。
  2. SC_THREAD(func):有自己的执行线程,可能消耗模拟时间,可以挂起,并可以调用调用wait()的代码。
  3. SC_CTHREAD(func, event): SC_THREAD的一种特殊形式,只能对时钟边缘事件具有静态敏感性

什么时候可以注册:

  1. 在构造函数的主体中,
  2. 在模块的before_end_of_elaboration或end_of_elaboration回调函数中,
  3. 或在从构造函数或回调函数调用的成员函数中

限制:

  1. 只能在同一个模块的成员函数上进行注册。
  2. SC_CTHREAD不能从end_of_elaboration回调函数中调用。

注意:

  1. SC_THREAD可以完成SC_METHOD或SC_CHTEAD所做的一切。我将在示例中主要使用这个过程。
  2. 为了SC_THREAD或SC_CTHREAD进程被再次调用,应该有一个while循环确保它永远不会退出。
  3. SC_THREAD进程不需要while循环。next_trigger()会再次调用它。
  4. systemC中的模拟时间不是程序运行的实际时间。它是一个由模拟内核管理的计数器。稍后再解释。

Simulation_Process.cpp

c++
#include <systemc> using namespace sc_core; SC_MODULE(PROCESS) { sc_clock clk; // 声明时钟 SC_CTOR(PROCESS) : clk("clk", 1, SC_SEC) { // 实例化具有 1 秒周期性的时钟 SC_METHOD(method); // 注册方法 SC_THREAD(thread); // 注册线程 SC_CTHREAD(cthread, clk); // 注册时钟线程 } void method(void) { // 定义方法成员函数 // 这里没有 while 循环 std::cout << "method triggered @ " << sc_time_stamp() << std::endl; next_trigger(sc_time(1, SC_SEC)); // 1 秒后触发 } void thread() { // 定义线程成员函数 while (true) { // 无限循环确保它永远不会退出 std::cout << "thread triggered @ " << sc_time_stamp() << std::endl; wait(1, SC_SEC); // 等待 1 秒钟,然后再次执行 } } void cthread() { // 定义 CTHREAD 成员函数 while (true) { // 无限循环 std::cout << "cthread triggered @ " << sc_time_stamp() << std::endl; wait(); // 等待下一个 CLK 事件,该事件在 1 秒后出现 } } }; int sc_main(int, char*[]) { PROCESS process("process"); // 初始化模块 std::cout << "execution phase begins @ " << sc_time_stamp() << std::endl; sc_start(2, SC_SEC); // 运行模拟 2 秒 std::cout << "execution phase ends @ " << sc_time_stamp() << std::endl; return 0; }

结果

shell
SystemC 2.3.3-Accellera --- Oct 4 2020 22:59:38 Copyright (c) 1996-2018 by all Contributors, ALL RIGHTS RESERVED execution phase begins @ 0 s method triggered @ 0 s thread triggered @ 0 s cthread triggered @ 0 s method triggered @ 1 s thread triggered @ 1 s cthread triggered @ 1 s execution phase ends @ 2 s

本文作者:古月流新

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!