学海荡舟手机网
导航

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

SystemC-用SC_CTOR描述构造函数

模块的一个基本组成部分就是它的构造函数,熟悉C++的读者对此并不陌生。模块的构造函数完成创建和初始化一个模块的最初工作,它在一个模块的实例被创建时就被执行。C++中的构造函数创建模块内部数据结构,并把这些数据结构初始化为已知的值。在Syst中,除了完成C++中所要求的基本功能外,构造函数还用于初始化进程的类型并创建进程的敏感表。
      sram的构造函数为:
   

  1. SC_CTOR(sram)  
  2.     {  
  3.       mem=new sc_uint<8>[256];  
  4.       assert(mem!=NULL);  
  5. for (int i=0;i<256;i++) mem[i]=0;  
  6.         SC_METHOD(main)   
  7.         sensitive<<clk.pos();  
  8.     };  


      Syst的构造函数用SC_CTOR标识,构造函数的名字必须与模块的名字相同。在构造函数中可以对需要初始化的数据进行初始化。在构造函数中,可以初始化进程的敏感表。在本例中,进程main对时钟信号的上升沿敏感。在每一个时钟的上升沿,void main()被执行一次。SC_METHOD进程的具体特征我们将在下文讲述。
      SystemC包括3个基本的进程:SC_METHOD,SC_CTHREAD和SC_THREAD,我们将在后文详细讲述。宏SC_CTOR定义了这3个基本进程所需要的一些定义,这些定义同样在SC_AS_PROCESS中也进行了定义。因此,如果构造函数采用传统的C++方法来定义,必须在源代码中声明SC_HAS_PROCESS,下面的代码对sram进行了改写:
 

  1. //sram.h  
  2. #ifndef __SRAM_H  
  3. #define __SRAM_H  
  4. #include "systemc.h"                           
  5. #include "assert.h"                             
  6. class sram8x256:publ sc_module   
  7. {  
  8. public:  
  9.  sc_in_clk clk;                               
  10.  sc_in<bool> wr_en;                   
  11.  sc_in<sc_uint<8> >  wr_data;  
  12.  sc_in<sc_uint<8> >  addr;  
  13.  sc_out<sc_uint<8> >  rd_data;  
  14.                    
  15.      void main()  
  16.      {  
  17.       rd_data.write(mem[addr.read()]);  
  18.       if(wr_en.read())   
  19.       {  
  20.        mem[addr.read()]=wr_data.read();  
  21.       }  
  22.      }  
  23.         SC_HAS_PROCESS(sram8x256);  
  24.      sram(sc_module_name n):sc_module(n)  
  25.      {  
  26.       mem=new sc_uint<8>[256];  
  27.       assert(mem!=NULL);  
  28.    for (int i=0;i<256;i++) mem[i]=0;  
  29.         SC_METHOD(main)   
  30.         sensitive<<clk.pos();  
  31.      };  
  32.      ~sram8x256()  
  33.      {  
  34.       if(mem) {delete mem; mem=0;}  
  35.      };  
  36. private:  
  37.  sc_uint<8>* mem;     
  38. };  
  39. #endif  


    任何SystemC模块必须继承sc_module(n),参数n的类型为sc_module_name,初学者可以将n理解为一个常量字符串,实际上sc_module_name是一个类,作为模块名的包容器,并负责建立一个设计中所有例化的模块的层次关系。


相关文章