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进行改进,得到如下代码:
- #include "syst.h"
- SC_MODULE(stimulus_gen2)
- {
- sc_in_clk clk_i;
- sc_in<bool> rst_i;
- sc_out<bool> stb_o,cyc_o;
- sc_out<bool> we_o;
- sc_in<bool> ack_i;
- sc_out<sc_uint<8> > adr_o;
- sc_in<sc_uint<8> > dat_i;
- sc_out<sc_uint<8> > dat_o;
- void main()
- {
- if(rst_i)
- {
- adr_o=0;
- dat_o=100;
- we_o=1;
- }
- while(true)
- {
- if(ack_i) wait();
- //write operations.
- cyc_o=true;
- wait();
- stb_o=true;
- adr_o=adr_o.read()+1;
- dat_o=dat_o.read()+1;
- we_o=true;
- //wait end of write operations
- if(~ack_i) wait();
- stb_o=false;
- cyc_o=false;
- wait(3);
- stb_o=false;
- cyc_o=true;
- //read operations.
- stb_o=true;
- cyc_o=true;
- we_o=false;
- if(~ack_i) wait();
- if(dat_o.read()!=dat_i.read()) cout<<"Err"<<endl;
- assert(false);
- //Loop bak for next round of operations.
- }
- }
- SC_CTOR(stimulus_gen2)
- {
- SC_CTHREAD(main,clk_i.pos());
- reset_signal_is(rst_i, true);
- };
- };
该代码在复位后首先等待wb_sram准备好(ack_o为0代表wb_sram准备好下一次操作),然后进行一次写操作,等待写操作完成,之后等待若干时钟周期,然后进行读操作,等待读操作完成后进行下一次写操作。