从 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。
我正在将我的一些代码从 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。