Jump to content

Newbie sc_signal<class T> creation problem


Recommended Posts


I'm a newbie with systemc and using it for design.

I want to implement a class representing a generic register file which requires a mandatory parameter NUM_REGS in its constructor.

I want to then contain this register file inside sc_signal<> to allow event handling.

The reg_files header looks something like this (simplified version):


class reg_file
   sc_uint<8> *reg_set;

   unsigned REG_NUMS;

   reg_file(const unsigned numberOfRegs)
      REG_NUMS = numberOfRegs;
      reg_set = new sc_uint<8> [REG_NUMS];

      delete reg_set;

I want to contain the objects of this class in sc_signal by passing numberOfRegs as as a parameter during a creation of the the signal like this:

sc_signal<reg_file> tmr_regs;     // Where to pass numberOfRegs?
Link to post
Share on other sites


you can pass reg_file constructor parameter as second parameter to sc_signal constructor:


For example:

sc_signal<reg_file> tmr_regs {"tmr_regs", number_of_regs};

However your code won't compile anyway, because sc_signal requires operator =, operator <<, operator == and sc_trace method to be defined in user-defined data type. Check here for example:




Also, please note that your modeling style is not common in SystemC world. For regfile modeling you should probably

  • create a dedicated SC_MODULE (reg_file) 
  • or use array of sc_signals directly :   sc_signal<sc_uint<8>> tmr_regs[REG_NUMS]; //You can also use sc_vector for that purpose.
Link to post
Share on other sites

Thank you @Roman.

The version of the header file shown above does not have the overloads as its simplified.

I do have them all overloaded.


I like the SC_MODULE(reg_file) idea.

Essentially I want to model a module with a bunch of registers whose SC_CTHREAD and SC_MODULE is sensitive to the these its own register file.


How do I implement the SC_MODULE?

Link to post
Share on other sites

How about something like this:

template <int REG_NUMS>
SC_MODULE(reg_file) {

sc_signal<sc_uint<8> > reg_set[REG_NUMS];

SC_CTOR(reg_file) {
    for (int i = 0; i < REG_NUMS; ++i) {
        sensitive << reg_set[i];

void some_method() { /***/}


I don't know what your final goal is, but if I want to implement some parameterizable module I always use templates instead of constructor parameters.

Link to post
Share on other sites


This topic is now archived and is closed to further replies.

  • Create New...