首页 > 解决方案 > 从 SC_THREAD 进程调用 sc_fifo::nb_write() 是否安全?

问题描述

我正在将我的一些代码从 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() 是不好的策略吗?如果是,为什么?

标签: systemc

解决方案


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


推荐阅读