从SC_THREAD进程调用sc_fifo :: nb_write()是否安全?

时间:2018-12-21 18:46:33

标签: systemc

我正在将我的一些代码从SC_THREAD转换为SC_METHOD。我的问题是,我需要停止使用sc_fifo类吗?我意识到SC_METHOD不应调用sc_fifo.write(),因为它使用了等待调用,这对于无法挂起的函数是不允许的。但是,sc_fifo提供了各种功能的非阻塞版本,可能我可以改用它们。我读过的一些文档表明,您绝对不要使用SC_METHOD中的sc_fifo,但不能提供任何依据。

这是我当前正在使用的代码示例。

class Example : public sc_module {
public:
        sc_fifo<int> myFifo;
        sc_in<bool> clock_in;

        SC_HAS_PROCESS(Example);

        // constructor
        Example(sc_module_name name) : sc_module(name) {
                SC_METHOD(read);
                        sensitive << clock_in;
        }

        void read() {
                int value = -1;
                bool success = myFifo.nb_read(value);
                if (success) { cout << "Read value " << value << endl; }
                else { cout << "No read done but that's okay." << endl; }
        }

};

int sc_main(int argc, char* argv[]) {
        sc_clock clock("clock");
        Example example("example");
        example.clock_in(clock);
        sc_start(10, SC_NS);
        return 0;
}

即使我从SC_METHOD调用sc_fifo函数,也不会引发任何错误。从SC_METHOD内部使用nb_read()是不好的策略吗?如果可以,为什么?

2 个答案:

答案 0 :(得分:0)

使用来自SC_METHOD的sc_fifo非阻塞调用应该没问题。 我没有在标准手册中找到禁止它的任何地方。

答案 1 :(得分:0)

顾名思义,nb_read和nb_write都不在内部调用wait,因此可以从SC_METHOD使用它们。

虽然示例代码可以正常工作,但是当不经常将内容放入fifo时效率很低。如果希望代码更多地受事件驱动,则可以使SC_METHOD对sc_fifo.data_write_event()敏感。那么只有在确实将某些内容写入到FIFO中时才会调用它(尽管在其他情况下从同一个FIFO中拉出nb_read返回true仍然是一个好主意)。当然,这将跳过您的“未读但没关系”。打印。

此外,我认为您问题的标题可能意味着要询问从SC_METHOD而不是SC_THREAD调用nb_write。