systemC: sc_signal cannot have more than one driver

        如题,systemc规则中,同一个sc_signal不允许有多个驱动,也就是说,同一个sc_signal,只能在一个SC_METHOD或SC_THREAD中被write赋值,如果在多个SC_THREAD或SC_METHOD中write同一个信号,编译没问题,执行时就会报如题的错误,并给出提示,是哪两个thread/method。同一个sc_signal可以在多个SC_METHOD或SC_THREAD中被read。

       这样的规则,是为了同RTL一致。RTL中,一个信号就是只能在一个地方被赋值。

/*
Original 2020-05-13
README:
    This is an error example of write a signal in more than one thread/method
      
execute:    
    g++ -g -Wall -lsystemc -m64 -pthread main.cpp  
        -L/$(your systemc path)/lib-linux64 
        -I/$(your systemc path)/include  -I/$(your systemc path)/src/tlm_utils -o sim
NOTE : 
    Error: (E115) sc_signal<T> cannot have more than one driver: 
    signal `MyTest.test_sig' (sc_signal)
    first driver `MyTest.TestMethod'  (sc_method_process)
    second driver `MyTest.TestThread1' (sc_thread_process)
    In file: ../../../../src/sysc/communication/sc_signal.cpp:73
*/

#include <iostream>
#include "systemc.h"

using namespace std;
class MyTest
: public sc_module
{
    public:
        SC_HAS_PROCESS(MyTest);
        MyTest(const sc_module_name&    name)
        : sc_module(name)
        ,m_period (sc_time(1000,SC_PS))
        ,m_sig("test_sig")
        ,m_in_clk("in_clk")
        {
            SC_THREAD(TestThread1);
            // SC_THREAD(TestThread2);
            SC_METHOD(TestMethod);
            sensitive<<m_in_clk.pos()  ; // static sensitive event
            dont_initialize();

            m_sig.write(0);
        };
    public:
        void TestThread1();
        void TestThread2();
        void TestMethod();
        ~MyTest(){;}
    public:
        sc_time     			m_period;
        sc_signal<sc_uint<5> >  m_sig;   // must have a blank in <sc_uint<5> >
        sc_in_clk   			m_in_clk;
};

void MyTest::TestThread1()
{
    wait(2 *m_period);
    m_sig.write(1);
    cout<<" ["<<sc_time_stamp()<<"]"<< " Thread write 1, read is "<< m_sig.read() <<endl;  
}

void MyTest::TestThread2()
{
    wait(5 *m_period);  
    m_sig.write(2);
    cout<<" ["<<sc_time_stamp()<<"]"<< " Thread write 2, read is "<< m_sig.read() <<endl;     
}

void MyTest::TestMethod()
{
    m_sig.write(5);
    cout<<" ["<<sc_time_stamp()<<"]"<< " Method read is "<< m_sig.read() <<endl; 
}

int sc_main(int argc, char** argv)
{
    MyTest *     	m_test;
    m_test   = new  MyTest("MyTest");
    sc_clock    	m_clk ("Clock",m_test->m_period);
    m_test->m_in_clk( m_clk );

    sc_start(10,SC_NS);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zgcjaxj/article/details/106106426