SystemC-用SC_CTOR描述构造函数
模块的一个基本组成部分就是它的构造函数,熟悉C++的读者对此并不陌生。模块的构造函数完成创建和初始化一个模块的最初工作,它在一个模块的实例被创建时就被执行。C++中的构造函数创建模块内部数据结构,并把这些数据结构初始化为已知的值。在Syst中,除了完成C++中所要求的基本功能外,构造函数还用于初始化进程的类型并创建进程的敏感表。
sram的构造函数为:
- SC_CTOR(sram)
- {
- mem=new sc_uint<8>[256];
- assert(mem!=NULL);
- for (int i=0;i<256;i++) mem[i]=0;
- SC_METHOD(main)
- sensitive<<clk.pos();
- };
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进行了改写:
- //sram.h
- #ifndef __SRAM_H
- #define __SRAM_H
- #include "systemc.h"
- #include "assert.h"
- class sram8x256:publ sc_module
- {
- public:
- sc_in_clk clk;
- sc_in<bool> wr_en;
- sc_in<sc_uint<8> > wr_data;
- sc_in<sc_uint<8> > addr;
- sc_out<sc_uint<8> > rd_data;
- void main()
- {
- rd_data.write(mem[addr.read()]);
- if(wr_en.read())
- {
- mem[addr.read()]=wr_data.read();
- }
- }
- SC_HAS_PROCESS(sram8x256);
- sram(sc_module_name n):sc_module(n)
- {
- mem=new sc_uint<8>[256];
- assert(mem!=NULL);
- for (int i=0;i<256;i++) mem[i]=0;
- SC_METHOD(main)
- sensitive<<clk.pos();
- };
- ~sram8x256()
- {
- if(mem) {delete mem; mem=0;}
- };
- private:
- sc_uint<8>* mem;
- };
- #endif
任何SystemC模块必须继承sc_module(n),参数n的类型为sc_module_name,初学者可以将n理解为一个常量字符串,实际上sc_module_name是一个类,作为模块名的包容器,并负责建立一个设计中所有例化的模块的层次关系。
- 上一篇:C++析构函数
- 下一篇:SystemC-用SC_MODULE定义模块