位矢量输出分配中的延迟



我是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

若要查找有关此行为的详细信息,请搜索术语"信号语义"和"延迟分配"。

最新更新