如何初始化作为数组的 systemc 端口名称?

Posted

技术标签:

【中文标题】如何初始化作为数组的 systemc 端口名称?【英文标题】:How to initialize a systemc port name which is an array? 【发布时间】: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"), mysignalssome_value1, some_value2 感谢您的建议。我试过了,但还是不行。我已经更新了我的问题。这里是a short intro to systemc 据我所知,在 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

以上是关于如何初始化作为数组的 systemc 端口名称?的主要内容,如果未能解决你的问题,请参考以下文章

systemC的错误

c#如何实现串口通信读取数据

systemC的组合逻辑建模

C语言 - 数组

verilog模块端口为二维数组如何调用?

在C#中获取整数的上下字节并将其作为char数组发送到com端口,如何?