SystemC中的SC_THREAD会创建一个真正的线程吗?

mil*_*sma 0 c++ multithreading systemc

我通过在开始时设置断点来调试Visual Studio 2008(64位)中的以下代码,do_test1并且do_test2令我惊讶的是,代码在sc_main函数的同一个线程中运行.

我没有在Linux环境中调试.但是,通过搜索源代码,我发现"pthread.h"一些SystemC库源代码包含了它.

问题1:在Windows中,是否会SC_THREAD创建一个真正的线程?或者它总是在同一个线程中sc_main?如果是这种情况,我可以说SC_THREAD是创建一个"假"线程吗?

问题2:在Linux中,既然"pthread.h"包括在内,会SC_THREAD创建一个新的线程吗?

问题3:在Windows和Linux中,我是否错过了启用真实线程的一些设置?

========================================

以下代码来自本网站:

http://www.asic-world.com/systemc/systemc_time4.html#Example_:_sc_event

    #include <systemc.h>

    SC_MODULE (events) {
      sc_in<bool> clock;

      sc_event  e1;
      sc_event  e2;

      void do_test1() {

        while (true) {
          // Wait for posedge of clock
          wait();
          cout << "@" << sc_time_stamp() <<" Starting test"<<endl;
          // Wait for posedge of clock
          wait();
          cout << "@" << sc_time_stamp() <<" Triggering e1"<<endl;
          // Trigger event e1
          e1.notify(5,SC_NS);
          // Wait for posedge of clock
          wait();
          // Wait for event e2
          wait(e2);
          cout << "@" << sc_time_stamp() <<" Got Trigger e2"<<endl;
          // Wait for posedge of clock
          wait();
          cout<<"Terminating Simulation"<<endl;
          sc_stop(); // sc_stop triggers end of simulation
        }
      }

      void do_test2() {
        while (true) {
          // Wait for event e2
          wait(e1);
          cout << "@" << sc_time_stamp() <<" Got Trigger e1"<<endl;
          // Wait for 3 posedge of clock
          wait(3);
          cout << "@" << sc_time_stamp() <<" Triggering e2"<<endl;
          // Trigger event e2
          e2.notify();
        }
      }

      SC_CTOR(events) {
        SC_CTHREAD(do_test1,clock.pos());
        SC_CTHREAD(do_test2,clock.pos());
      }
    }; 

    int sc_main (int argc, char* argv[]) {
      sc_clock clock ("my_clock",1,0.5);
      events  object("events");
        object.clock (clock); 
      sc_start();  // Run the simulation till sc_stop is encountered
      return 0;// Terminate simulation
    }
Run Code Online (Sandbox Code Playgroud)

Ahm*_*sar 11

简短回答:

线程库,无论是用户级线程(更轻和更快的上下文切换)还是内核级线程,都不用于提供真正的并发.相反,它们用于实现SC_THREAD进程的协同语义.

答案很长:

SystemC有3种类型的进程(即并发单元),其中最重要的只有两种:

  1. SC_METHODs是方法(类似于alwaysVerilog中的语句),当由事件触发时,它们在零时间内完整地执行.他们不能wait用来等待时间间隔或事件发生.
  2. SC_THREADs是initial只执行一次的方法(如Verilog中的语句),但它们可以wait用来等待特定事件或时间段,并且可以使用循环来模拟always 语句(因此SC_THREAD可以消耗时间).

对于实现透视图,SC_METHODs 没有问题,因为它们就像在触发时要调用的SystemC内核中注册的方法一样.但是,对于SC_THREADs,虽然它们被定义为成员函数,但它们的行为与普通例程不同.它们被称为协程:

子程序,允许多个入口点在某些位置暂停和恢复执行.

SystemC内核不为系统级或RTL模型提供真正的并发性.它仅通过流程构造提供模拟并发.因此,在编写高级模型时,您不必使用同步原语(例如,锁或信号量)来保护不同进程共享的数据,因为在任何时候,只有一个进程正在执行且不能被中止SystemC的内核(执行切换到下一工序准备只有当当前执行的进程放弃控制来执行.然而,可以使用的同步,但SystemC的推广使用的消息传递的通道进程之间的沟通.这是一个优点,因为它降低了复杂性.但是,也有缺点.SystemC模型按顺序执行(非并行化),因此它们不利用多核架构来加速模拟.这是一个热门的研究领域,需要模拟性能.

无论如何,SystemC内核因此实现了协作调度,其中每个人都SC_THREAD愿意放弃控制(通过使用wait)以允许其他SC_THREAD进程执行.如果在一个SC_THREAD永不放弃控制的过程中有一个无限循环,那么整个模拟将停留在那里并且模拟时间不会提前.SC_METHODs的情况也是如此,必须返回SystemC内核才能重新获得控制权.

为了使用协同程序实现该协作调度策略,使用了一个线程库(例如,包含在SystemC源代码中的pthreads或QuickThread)来启用SC_THREAD(作为线程启动)暂停自身并使内核恢复他们以后.阅读本文以了解更多相关信息.