SystemC中的线程和时钟线程

时间:2013-07-27 13:42:29

标签: while-loop systemc

在阅读SystemC中的线程时,据说必须在函数内部使用while(true)循环。为什么会这样?

您能否看到下面给出的示例代码,并解释为什么while循环用于线程,wait()命令与循环一起使用:

 1 //-----------------------------------------------------
  2 // This is my second Systemc Example
  3 // Design Name : first_counter
  4 // File Name : first_counter.cpp
  5 // Function : This is a 4 bit up-counter with
  6 // Synchronous active high reset and
  7 // with active high enable signal
  8 //-----------------------------------------------------
  9 #include "systemc.h"
 10 
 11 SC_MODULE (first_counter) {
 12   sc_in_clk     clock ;      // Clock input of the design
 13   sc_in<bool>   reset ;      // active high, synchronous Reset input
 14   sc_in<bool>   enable;      // Active high enable signal for counter
 15   sc_out<sc_uint<4> > counter_out; // 4 bit vector output of the counter
 16 
 17   //------------Local Variables Here---------------------
 18   sc_uint<4>    count;
 19 
 20   //------------Code Starts Here-------------------------
 21   // Below function implements actual counter logic
 22   void incr_count () {
 23     // For threads, we need to have while true loop
 24     while (true) { 
 25       // Wait for the event in sensitivity list to occure
 26       // In this example - positive edge of clock
 27       wait();
 28       if (reset.read() == 1) {
 29         count =  0;
 30         counter_out.write(count);
 31       // If enable is active, then we increment the counter
 32       } else if (enable.read() == 1) {
 33         count = count + 1;
 34         counter_out.write(count);
 35       }
 36     }
 37   } // End of function incr_count
 38 
 39   // Below functions prints value of count when ever it changes
 40   void print_count () {
 41     while (true) {
 42       wait();
 43       cout<<"@" << sc_time_stamp() <<
 44         " :: Counter Value "<<counter_out.read()<<endl;
 45     }
 46   }
 47 
 48   // Constructor for the counter
 49   // Since this counter is a positive edge trigged one,
 50   // We trigger the below block with respect to positive
 51   // edge of the clock
 52   SC_CTOR(first_counter) {
 53     // Edge sensitive to clock
 54     SC_THREAD(incr_count);
 55     sensitive << clock.pos();
 56     // Level Sensitive to change in counter output
 57     SC_THREAD(print_count);
 58     sensitive << counter_out;
 59   } // End of Constructor
 60 
 61 }; // End of Module counter

2 个答案:

答案 0 :(得分:2)

SC_THREADSC_CTHREAD应该有无限循环来保持线程不被终止。如果未在函数体中放置for(;;)while(true),则当执行到达函数作用域的末尾时,线程将终止。在这种情况下,敏感列表永远不会唤醒您的线程以处理某些内容。或者你可以将它转换为等效的SC_METHOD,然后就可以没有无限循环。

SystemC正在使用非抢占式线程,因此如果您不使用wait()等待静态或动态敏感列表中列出的内容发生,则会导致线程无限执行。并且您的进程的CPU执行不会超出功能范围。这样SystemC内核将无法继续处理其他方法/线程和事件来继续模拟。在基于事件的模拟中,只应在指定条件(敏感列表中的事件)发生时运行该线程。因此wait()函数可以等到下一个事件发生,并将CPU执行交给其他线程/方法和SystemC内核。下次事件发生时,例如时钟的上升沿,wait()语句将返回并继续您的过程。

在您的示例中,您的程序正在等待时钟的正边沿触发器将计数器的值增加1.因此,如果您未在代码中添加wait(),则incr_count将始终增加无论时钟的状态如何,计数器的值都是无限的,它不会停止。通过使用wait(),您的线程将被阻塞并等待下一个时钟正边沿触发。

答案 1 :(得分:0)

while(true) - &gt;使线程无限,以便它在获得上下文时可以继续执行 wait() - &gt;强制线程丢失上下文并允许执行其他操作