在SC_THREAD中的每个时钟姿势上改变信号

时间:2018-09-05 20:34:29

标签: systemc

我想实现模块,该模块在调用工作时会通过以下方式更改信号x

1 clk pos.edge : x = 0 // 1st phase
2 clk pos.edge : x = 0 // 2nd phase
3 clk pos.edge : x = 1 // 3rd phase

然后停下来,直到再次被调用。

我的模块中有函数foo(),该函数从main调用,并允许线程work_foo()在时钟的时钟上执行。

我试图用这种方式(用wait()来做到这一点,并在一些简单的测试中给出了正确的答案,但这是不合适的方式:my_module.h

#include "systemc.h"

SC_MODULE (my_module)
{
    sc_in <bool> clk;
    sc_out <sc_logic> x;

    sc_signal <bool> valid;

    void foo()
    {
        valid = 1;      
        return;
    }

    void work_foo()
    {
        while (true)
        {
            if (valid == 1)
            { // foo() was called
                if (phase == 0)
                {
                x = SC_LOGIC_0;
                wait(); // waiting for the next tick
                x = SC_LOGIC_0;
                wait(); // waiting for the next tick
                x = SC_LOGIC_1;
                wait(); // waiting for the next tick
            }
            else
            {   
                valid=0;
                wait();
            }
        }
    }

    SC_HAS_PROCESS(my_module);  
    my_module(sc_module_name name):
    sc_module(name),
    clk("clk"), x("x"), valid("valid")

    {
        SC_THREAD(work_foo);
        //dont_initialize();        
        sensitive<<clk.pos();
        valid=0;
    }
};

main.cpp

#include "systemc.h"
#include "my_module.h"

int sc_main (int argc, char* argv[])
{
    sc_clock clock("clock", 10, SC_NS);    
    sc_signal<sc_logic > x;    
    my_module mm("my_mod");     
    mm.clk(clock);
    mm.x(x);        
    mm.foo  ();
    sc_start(200, SC_NS);
    sc_stop();      
    return 0;
}

现在我正在尝试以另一种方式实现它。建议我在模块中使用其他sc_signal(或变量),它指示阶段的递增编号。问题是,这从一开始就是循环的。我该怎么解决?

#include "systemc.h"

SC_MODULE (my_module)
{
    sc_in <bool> clk;
    sc_out <sc_logic> x;

    sc_signal <bool> valid;
    sc_signal <uint> phase;

    void foo()
    {
        valid = 1;      
        return;
    }

    void work_foo()
    {
        while (true)
        {
            if (valid == 1)
            {
                if (phase == 0)
                {
                x = SC_LOGIC_0;
                phase=phase+1;
                }
                else if (phase == 1)
                {
                x = SC_LOGIC_0;
                phase=phase+1;
                }
                else if (phase == 2)
                {
                x = SC_LOGIC_1;
                phase=phase+1;
                }
            }
            else
            {   
                phase=0;    
                valid=0;
                wait();
            }
        }
    }

    SC_HAS_PROCESS(my_module);  
    my_module(sc_module_name name):
    sc_module(name),
    clk("clk"), x("x"), valid("valid")

    {
        SC_THREAD(work_foo);
        //dont_initialize();        
        sensitive<<clk.pos();
        valid=0;
        phase=0;
    }
};

0 个答案:

没有答案