【问题标题】:How to initialize a systemc port name which is an array?如何初始化作为数组的 systemc 端口名称?
【发布时间】:2016-02-16 06:11:17
【问题描述】:

我想初始化一个端口名称。端口是一个数组,我的代码不起作用。

SC_MODULE(example) {
  sc_clock clk;
  sc_signal<bool> mysignals[2];

 public: 

 SC_CTOR(example)
   :clk("clk"),
    mysignals[0]("mysignals[0]"), // won't work
    mysignals[1]("mysignals[1]") // won't work
      {}

  ~example() {
  }
};

下面的代码可以通过给clk 命名为“clk”来工作。但是clk 端口不是数组:

SC_MODULE(example) {
  sc_clock clk;

 public: 

 SC_CTOR(example)
   :clk("clk")
      {}

  ~example() {
  }
};

如何命名一个端口数组?

更新:

尝试了建议的评论。还是不行:

#include "systemc.h"

SC_MODULE(example) {
  sc_clock clk;
  sc_signal<bool> mysignals[2];

 public: 

  SC_CTOR(example)
    :clk("clk"),
    mysignals{"mysig1", "mysig2"}
  {}

  ~example() {
  }
};

int sc_main(int argc, char* argv[]) {
  example hello("HELLO");

  return(0);
}

编译:

g++ -I. -I<SYSTEMC LIB>/include -L. -L<SYSTEMC LIB>/lib-linux64 -o sim example.cpp -lsystemc -lm -std=c++0x

错误:

example.cpp:在构造函数“example::example(sc_core::sc_module_name)”中: example.cpp:11: 错误:错误的数组初始化器

【问题讨论】:

  • “命名数组”是什么意思?不是“初始化数组”吗?
  • 如果你想初始化一个数组你可以写SC_CTOR(example) :clk("clk"), mysignals{some_value1, some_value2} {}
  • 感谢您的建议。我试过了,但还是不行。我已经更新了我的问题。这里是a short intro to systemc
  • 据我所知,在 SystemC 中没有很好的解决方案。您可以潜在地重组并在具有适当名称的项目中一次一个地添加指针和新数组。

标签: c++ systemc


【解决方案1】:

我一发布答案,就想起了选项 3:使用sc_vector。例如:

SC_MODULE(M){

     static const int SIZE = 4;

     typedef sc_uint<16> DataType;
     typedef sc_in<DataType> PortType;
     typedef sc_vector<PortType> PortVectorType;

     PortVectorType port_vec;

     SC_CTOR(M) : port_vec("my_port", SIZE){
        for(int i = 0; i < SIZE; ++i)
           cout << port_vec[i].basename() << '\n';
    }       
};

int sc_main(int, char**){
   M("m");
   return 0;
}

产生以下输出

my_port_0
my_port_1
my_port_2
my_port_3

【讨论】:

    【解决方案2】:

    两种选择: 1)创建一个信号数组并让systemc命名它们 2) 我们构造信号指针的数组

    示例代码:

    SC_MODULE(M){
    
        static const int SIZE = 4;
    
        sc_signal<bool> S[SIZE];    //array of signals let sc name them
        sc_signal<bool>* P[SIZE];   //array of pointers name on create
    
        SC_CTOR(M){
    
            for(int i = 0; i < SIZE; ++i)   //new the signals and give them a name
                P[i] = new sc_signal<bool>(("my_sig_" + to_string(i)).c_str());
        }
    };
    
    int sc_main(int, char**){
    
        M m("m");
    
        for(int i = 0; i < M::SIZE; ++i){
            cout << "S[" << i << "].name = " << m.S[i].basename() << '\n';
            cout << "P[" << i << "].name = " << m.P[i]->basename() << '\n';
        }
        return 0;
    }
    

    在我的机器上产生以下输出

    P[0].name = signal_0
    P[0].name = my_sig_0
    S[1].name = signal_1
    P[1].name = my_sig_1
    S[0].name = signal_0
    P[0].name = my_sig_0
    S[1].name = signal_1
    P[1].name = my_sig_1
    S[2].name = signal_2
    P[2].name = my_sig_2
    S[3].name = signal_3
    P[3].name = my_sig_3
    

    【讨论】:

    • 实际上它产生这个输出:) S[0].name = signal_0 P[0].name = my_sig_0 S[1].name = signal_1 P[1].name = my_sig_1 S[2 ].name = signal_2 P[2].name = my_sig_2 S[3].name = signal_3 P[3].name = my_sig_3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    相关资源
    最近更新 更多