使用信号w / o方法可以将输入转发到输出端吗?

时间:2016-06-23 19:50:28

标签: systemc

我有一个实现硬件块的SystemC模块,其中输入按原样指向输出(例如,关于非反相缓冲区)。我说定义了:

sc_in<bool>  ip;
sc_out<bool> op;

我是否可以仅使用sc_signal对象将输入转发到输出(即,不创建带有输入灵敏度列表的方法)?

sc_signal<bool> net;
....

// in the constructor:
ip(net);
op(net);

3 个答案:

答案 0 :(得分:3)

您可以,但不应该,因为通常端口应绑定在模块之外。这不是强制执行,而是一种常见的编码约定。这样,模块的用户总是知道会发生什么:&#34;我应该将模块实例的每个端口绑定到某个信号&#34;

分层绑定端口(即输入到子模块输入)被认为是OK。由于顶级模块仍然持有合同,因此它的端口必须绑定到外部&#34;信号。

考虑你的缓冲区,例如:

template <typename T>
SC_MODULE(buffer) {
    sc_in <int>       ip{"ip"};
    sc_out <int>      op{"out"};

    SC_CTOR(buffer) { ip(tmp_sig); op(tmp_sig); }

private:
    sc_signal <int>   tmp_sig{"sig"};
};

假设我想为这个模块编写一个测试平台:

int sc_main(int argc, char * argv[] ) {
    sc_signal<int> in_signal{"in_signal"};
    sc_signal<int> out_signal{"out_signal"};

    buffer buffer1{"buffer1"};

    // Error ! **ip** is already bound to tmp_sig!!
    buffer1.ip(in_signal);

    // How can I write to **in** ??
    buffer1.ip = 1; // Error! Writing to input port is not defined

    sc_start();
    return 0;
}

如您所见,以这种方式编写的缓冲区非常无用!

请注意,正如Rahul建议的那样,直接将输入端口连接到输出端口也是一个坏主意:

SC_MODULE(buffer) {
    sc_in <int>       ip{"ip"};
    sc_out <int>      op{"op"};

    SC_CTOR(buffer) { ip(op);  }
};


int sc_main(int argc, char * argv[] ) {
    sc_signal<int> in_signal{"in_signal"};
    sc_signal<int> out_signal{"out_signal"};
    buffer buffer1{"buffer1"};

    buffer1.ip(in_signal);

    // Error, **op** is already bound to in_signal !
    buffer1.op(out_signal);

    sc_start();
    return 0;
}

答案 1 :(得分:0)

是的,如果您愿意,可以直接连接op(in)。

答案 2 :(得分:0)

我认为输入敏感列表的方法是这种情况的最佳选择。