如题,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;
}