![](/img/trans.png)
[英]How to simulate output delay using sc_method but without using next_trigger() in SystemC?
[英]Delay in bitvector Output assignment
我是 SystemC 的初学者,我真的需要您的帮助来解决计时问题。
请在下面找到 stimuli.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) 为什么我的 datagen 文件中的 busin 会在 1ns 后更新? 我已经可以在 0 NS 处看到 input.cpp 中的值。 怎么会发生 busin 在 datagen 中获取其值但首先在 input.cpp 中更新的情况。 (注意:Inputs.cpp 文件从 datagen 接收 busin 值)如果你说行为是正确的,我不需要修改我的代码中的任何内容,那么一切都很好。
任何帮助表示赞赏。 提前致谢。
对于问题#1 ,在时间零有两次激活,因为所有 SystemC 进程都将在时间零执行,而不会被敏感度触发。 然后,第二次激活由您在时间零时第一次写入总线触发。
如果您不想在时间为零时自动执行该方法,请在指定方法后放置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
的先前值。
要了解有关此行为的更多信息,请搜索术语“信号语义”和“延迟分配”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.