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