Изменение сигнала на каждой позиции часов в SC_THREAD - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу реализовать модуль, который при вызове на работу изменяет сигнал 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;
    }
};
...