2

我有一个 SystemVerilog 任务,我正在尝试移植到 SystemC。任务的主体只是等待一个布尔表达式,然后推送到一个队列中。SystemC 等待机制的工作方式并不完全相同,它只会等待时间或事件。

所以我想知道 SystemVerilog wait() 在重新测试布尔表达式之前等待的最小周期/时间长度是多少。换句话说,在 SV wait() 中驱动重新测试布尔表达式的频率或原因是什么?

如果答案只是每个周期一次,我希望并期望但无法确认,那么解决方案很容易。

这是代码,其中一些内容被重命名和简化,以便脱离上下文更有意义:

    virtual task put(input cls_item item);
        wait (queuecount < queuemax);
        push_back(item);
    endtask
4

2 回答 2

3

来自 LRM:

9.4.3 电平敏感事件控制

程序语句的执行也可以延迟到条件变为真为止。这是使用等待语句完成的,它是一种特殊形式的事件控制。等待语句的性质是级别敏感的,与基本事件控制(由@ 字符指定)相反,后者是边缘敏感的。

等待语句将评估一个条件;并且,如果它为假,则等待语句之后的程序语句应保持阻塞,直到该条件变为真,然后再继续。

基本上,您可以将其wait(<boolean expression>)视为连续检查表达式。一旦表达式为真,等待将解除阻塞,顺序代码的执行将继续。

如果wait()第一次遇到时表达式为真,则根本不会等待。

于 2012-11-08T18:06:04.877 回答
1

我同意你可以认为wait(expression)总是不断地检查条件表达式。这是设计者的想法,但是不能以这种方式设计计算机程序,否则会在条件检查循环中浪费 CPU 时间。

SystemVerilog中,它的编译器可能会将布尔表达式建模为一个事件。当执行运行到wait()并且条件为假时,模拟内核暂停当前线程并执行其他线程。在模拟中,每当queuecountqueuemax已经改变时,使用<算子重新计算条件。一旦满足条件,就会触发事件,然后等待线程被重新调度并准备恢复其执行。

SystemC中,因为它是C/C++世界加上一个事件驱动的硬件建模库,所以你很自然地C/C++会编写一个类似function(<condition expression>). 但是,在C/C++编译之后GCC,实际上程序将首先评估<condition expression>then 传递作为函数的参数。这是软件方式。这样,在wait()功能上,它只能看到trueorfalse或 0/1,它确实知道您在等待什么。wait()对于硬件建模的真正意图没有任何意义。因此,wait()can 只接受eventSystemC 中的参数。例如,

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();
    }
于 2012-11-09T00:29:28.970 回答