SystemC进程-SC_THREAD
线程进程(Threaded Proecess)能够被挂起和重新激活。线程进程使用wait()挂起,当敏感表中有事件发生,线程进程被重新激活运行到遇到新的wait()语句在重新挂起。在一次仿真中,线程进程一旦退出,将不能再次进入。
由于线程进程的这个特点,从理论上讲,用它可以描述几乎一切系统的行为。
线程进程的一个方便的用途是用来描述验证平台( Testbench)的输入激励和输出获取。我们使用SC_THREAD为wb_sram设计一个激励生成模块stimulus_gen,其代码如下:
- #include "syst.h"
- SC_MODULE(stimulus_gen)
- {
- 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()
- {
- adr_o=0;
- dat_o=100;
- we_o=1;
- while(true) {
- wait();
- if(~ack_i)
- {
- stb_o=true;
- cyc_o=true;
- adr_o=adr_o.read()+1;
- dat_o=dat_o.read()+1;
- we_o=~we_o;
- }
- else
- {
- stb_o=false;
- cyc_o=false;
- }
- }
- }
- SC_CTOR(stimulus_gen)
- {
- SC_THREAD(main);
- sensitive<<clk_i.pos();
- };
- };
在时钟clk的每一个上升沿,void main()被激活一次,当执行到wait()函数,则重新被挂起,直到下一个clk的上升沿到来,void main()重新被激活,开始执行wait()后面接下来的代码,这里wait()的作用是将进程挂起,等待下一次被激活。