学海荡舟手机网
导航

主页 > 电子设备技术 > 电器电路基础 > > 详细内容

SystemC进程-SC_CTHREAD

 

  钟控线程进程(Cked Thread Process)是一种特殊的线程进程,它继承于线程进程,但只能在时钟的上升沿或者下降沿被触发或者激活,这种行为更加接近实际硬件的行为。引入钟控线程进程的目的是产生更好的行为综合(行为综合是从高层次描述综合为寄存器传输级描述的过程,请读者参考有关文献)的结果。

      为了仿真硬件行为,钟控线程进程被约束只能采用wait()和wait(int N)两种等待形式,这里N是等待的时钟数。同时,该进程还引入了专门的复位信号说明函数:

        void reset_signal_is( const sc_in<bool>& , bool );
        void reset_signal_is( const sc_signal<bool>& , bool );

      它们只能在钟控线程进程中使用。

      钟控线程进程最适合来描述隐式有限状态机。所谓隐式有限状态机是指编程中并不显式的定义状态机的状态,而是通过程序中的wait()语句和wait()语句中间的赋值语句来完成对状态机的描述。显式的有限状态机通常要明确定义系统的状态,要使用case语句来实现状态转移。

      我们对stimulus_gen进行改进,得到如下代码:

  1. #include "syst.h"  
  2. SC_MODULE(stimulus_gen2)  
  3. {  
  4.  sc_in_clk clk_i;  
  5.  sc_in<bool> rst_i;  
  6.  sc_out<bool> stb_o,cyc_o;  
  7.  sc_out<bool> we_o;  
  8.  sc_in<bool> ack_i;  
  9.  sc_out<sc_uint<8> > adr_o;  
  10.  sc_in<sc_uint<8> > dat_i;  
  11.  sc_out<sc_uint<8> > dat_o;  
  12.  void main()  
  13.  {  
  14.   if(rst_i)  
  15.   {  
  16.    adr_o=0;  
  17.    dat_o=100;  
  18.    we_o=1;  
  19.  }  
  20.   while(true)   
  21.   {   
  22.     if(ack_i) wait();  
  23.     //write operations.  
  24.     cyc_o=true;  
  25.     wait();  
  26.     stb_o=true;     
  27.     adr_o=adr_o.read()+1;  
  28.     dat_o=dat_o.read()+1;  
  29.     we_o=true;  
  30.  
  31.     //wait end of write operations  
  32.     if(~ack_i) wait();  
  33.     stb_o=false;  
  34.     cyc_o=false;  
  35.     wait(3);  
  36.     stb_o=false;  
  37.     cyc_o=true;  
  38.     //read operations.  
  39.     stb_o=true;  
  40.     cyc_o=true;  
  41.     we_o=false;  
  42.     if(~ack_i) wait();  
  43.     if(dat_o.read()!=dat_i.read()) cout<<"Err"<<endl;  
  44.     assert(false);  
  45.     //Loop bak for next round of operations.  
  46.   }  
  47.  }  
  48.  
  49.  SC_CTOR(stimulus_gen2)  
  50.  {  
  51.   SC_CTHREAD(main,clk_i.pos());  
  52.   reset_signal_is(rst_i, true);   
  53.  };  
  54. };   

  该代码在复位后首先等待wb_sram准备好(ack_o为0代表wb_sram准备好下一次操作),然后进行一次写操作,等待写操作完成,之后等待若干时钟周期,然后进行读操作,等待读操作完成后进行下一次写操作。


相关文章