我是SystemC的初学者,我真的需要你的帮助来解决计时问题。
请在下面找到刺激.h代码,
SC_MODULE(datagen)
{
public:
sc_out<sc_bv<8>> busin_o;
SC_CTOR(datagen);
/*private:*/
void testgen(void);
void asTakt(void);
};
void datagen::testgen(void)
{
busin_o->write("11111111");
cout<< "-------------------------------------"<< endl;
cout << "In dataGen::testgen: @"
<< sc_time_stamp()
<< " Busin in datagen: "<< busin_o
<<endl;
wait(1,SC_NS);
cout<< sc_delta_count() << endl;
busin_o->write("00111111");
cout<< "-------------------------------------"<< endl;
cout << "In dataGen::testgen: @"
<< sc_time_stamp()
<< " Busin in datagen: "<< busin_o
<<endl;
wait(1,SC_NS);
busin_o->write("10000111");
cout<< "-------------------------------------"<< endl;
cout << "In dataGen::testgen: @"
<< sc_time_stamp()
<< " Busin in datagen: "<< busin_o
<<endl;
wait(1,SC_NS);
busin_o->write("11111110");
cout<< "-------------------------------------"<< endl;
cout << "In dataGen::testgen: @"
<< sc_time_stamp()
<< " Busin in datagen: "<< busin_o
<<endl;
cout<<"Intended end of simulation"<< endl;
sc_stop();
}
输入2.h
SC_MODULE(inputs)
{
public:
sc_in<sc_bv<8>> busin;
sc_out<sc_bv<8>> pout;
sc_out<sc_bv<8>> out;
SC_CTOR(inputs);
private:
/* method*/
void mydesign(void);
};
输入2.cpp
inputs::inputs(sc_module_name inst)
: sc_module(inst)
{
cout<<"Constructor- inputs: "<< name() <<endl;
SC_METHOD(mydesign);
sensitive << busin;
}
void inputs::mydesign()
{
cout<< "-------------------------------------"<< endl;
cout<<"Mydesign Activated @ "<<sc_time_stamp() <<endl;
cout<< "-------------------------------------"<< endl;
cout << "In Inputs::mydesign: @"
<< sc_time_stamp()
<< " Busin in Inputs: "<< busin
<<endl;
pout-> write(busin.read());
cout << "In Inputs::mydesign: @"
<< sc_time_stamp()
<< " pout in Inputs: "<< pout
<<endl;
}
在终端中看到的输出如下所示。
Copyright (c) 1996-2018 by all Contributors,
ALL RIGHTS RESERVED
Warning: (W506) illegal characters: data generator substituted by data_generator
In file: ../../../src/sysc/kernel/sc_object.cpp:247
Constructor- datagen: topblock.data_generator
Constructor- inputs: topblock.inputs
Constructor- top :topblock
Simulation started time resolution :1 ps
-------------------------------------
Mydesign Activated @ 0 s
-------------------------------------
In Inputs::mydesign: @0 s Busin in Inputs: 00000000
In Inputs::mydesign: @0 s pout in Inputs: 00000000
-------------------------------------
In dataGen::testgen: @0 s Busin in datagen: 00000000
-------------------------------------
Mydesign Activated @ 0 s
-------------------------------------
In Inputs::mydesign: @0 s Busin in Inputs: 11111111
In Inputs::mydesign: @0 s pout in Inputs: 00000000
2
-------------------------------------
In dataGen::testgen: @1 ns Busin in datagen: 11111111
-------------------------------------
Mydesign Activated @ 1 ns
-------------------------------------
In Inputs::mydesign: @1 ns Busin in Inputs: 00111111
In Inputs::mydesign: @1 ns pout in Inputs: 11111111
-------------------------------------
In dataGen::testgen: @2 ns Busin in datagen: 00111111
-------------------------------------
Mydesign Activated @ 2 ns
-------------------------------------
In Inputs::mydesign: @2 ns Busin in Inputs: 10000111
In Inputs::mydesign: @2 ns pout in Inputs: 00111111
-------------------------------------
In dataGen::testgen: @3 ns Busin in datagen: 10000111
Intended end of simulation
Info: /OSCI/SystemC: Simulation stopped by user.
我的两个问题是,
1( mydesign 块被调用两次 @ 0 NS
2( 为什么我的数据生成文件中的总线在 1ns 后更新?我已经可以看到输入中的值.cpp在 0 NS。为什么 busin 首先在 datagen 中获取其值,但在输入中更新.cpp这怎么可能发生。 (注意:输入.cpp文件从数据生成接收总线值( 如果你说行为是正确的,我不必修改代码中的任何内容,那么一切都很好。
任何帮助,不胜感激。提前谢谢。
对于问题#1,在时间 0 有两个激活,因为所有 SystemC 进程都将在时间 0 执行,而不会被灵敏度触发。然后,第二次激活由您在零时间首次写入总线触发。
如果不希望在时间零自动执行该方法,请在指定方法后放置dont_initialize()
:
SC_METHOD(mydesign);
dont_initialize(); // this can go before or after sensitivities
sensitive << busin;
对于问题#2,inputs
块看起来更早地看到了该值,但真正的问题是testgen
正在打印它写入总线的先前值。在代码中,busin_o
的值在编写后立即打印:
busin_o->write("11111111");
cout<< "-------------------------------------"<< endl;
cout << "In dataGen::testgen: @"
<< sc_time_stamp()
<< " Busin in datagen: "<< busin_o
<<endl;
wait(1,SC_NS);
对sc_out
(或sc_signal
(执行write()
时,新值不会生效,直到您通过调用wait()
挂起线程。若要查看应用的正确值,需要在wait()
后打印busin_o
的值。一种方法可能是在写入后放置零延迟等待:
busin_o->write("11111111");
wait(SC_ZERO_TIME);
cout<< "-------------------------------------"<< endl;
cout << "In dataGen::testgen: @"
<< sc_time_stamp()
<< " Busin in datagen: "<< busin_o
<<endl;
wait(1,SC_NS);
请注意,您在pout
中看到类似的行为。由于pout
的打印是在越过等待之前完成的,因此您正在打印以前的值pout
。
若要查找有关此行为的详细信息,请搜索术语"信号语义"和"延迟分配"。