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

Is it safe to call sc_fifo::nb_write() from a SC_THREAD process?

我正在将我的一些代码从 SC_THREAD 转换为 SC_METHOD。我的问题是,我需要停止使用 sc_fifo class 吗?我意识到 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() 是不是不好的政策?如果是,为什么?

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

nb_read 和 nb_write 都没有像它们的名字所暗示的那样在内部调用等待,因此可以从 SC_METHOD 中使用它们。

虽然您的示例代码有效,但如果不经常将内容放入 fifo,则效率会很低。如果您希望您的代码更多地由事件驱动,您可以使 SC_METHOD 对 sc_fifo.data_written_event() 敏感;那么它只会在实际写入 fifo 时才会被调用(尽管检查 nb_read returns 是否为真仍然是一个好主意,以防从同一个 fifo 中提取其他内容)。当然,这会跳过您的 "No read done but that's okay." 打印。

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