我同意你可以认为wait(expression)
总是不断地检查条件表达式。这是设计者的想法,但是不能以这种方式设计计算机程序,否则会在条件检查循环中浪费 CPU 时间。
在SystemVerilog
中,它的编译器可能会将布尔表达式建模为一个事件。当执行运行到wait()
并且条件为假时,模拟内核暂停当前线程并执行其他线程。在模拟中,每当queuecount
或queuemax
已经改变时,使用<
算子重新计算条件。一旦满足条件,就会触发事件,然后等待线程被重新调度并准备恢复其执行。
在SystemC
中,因为它是C/C++
世界加上一个事件驱动的硬件建模库,所以你很自然地C/C++
会编写一个类似function(<condition expression>)
. 但是,在C/C++
编译之后GCC
,实际上程序将首先评估<condition expression>
then 传递作为函数的参数。这是软件方式。这样,在wait()
功能上,它只能看到true
orfalse
或 0/1,它确实知道您在等待什么。wait()
对于硬件建模的真正意图没有任何意义。因此,wait()
can 只接受event
SystemC 中的参数。例如,
wait (event); // waiting for the event
wait (a_signal); // signal interface has value_changed_event, posedge_event, negedge_event
wait (10, SC_NS); // simulation time is also an event in SC kernel
如果您想为wait()
类似 SystemVerilog 的相同条件建模,则必须手动编写事件的详细信息。以下是概念验证伪代码,您可以从 SystemC 或 sc_fifo 类中找到示例。
sc_event waiting_event;
void put( ... ) {
while (!(queuecount < queuemax))
wait( waiting_event);
push_back(...);
}
void get( ... ) {
...
notify_queue_available();
}
void notify_queue_available() {
if (queuecount < queuemax)
waiting_event.notify();
}