简体   繁体   English

位向量输出分配延迟

[英]Delay in bitvector Output assignment

I am a beginner in SystemC, and I really need your help in solving a timing issue.我是 SystemC 的初学者,我真的需要您的帮助来解决计时问题。

Please find the stimuli.h code below,请在下面找到 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();  
}

inputs2.h输入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);
};

inputs2.cpp输入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;    
}

The output that is seen in the terminal is shown below.在终端中看到的输出如下所示。

    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.

The two questions I have are,我的两个问题是,

1) mydesign block is being called twice @ 0 NS 1) mydesign 块被调用两次@ 0 NS

2) Why does busin in my datagen file update after 1ns? 2) 为什么我的 datagen 文件中的 busin 会在 1ns 后更新? I can already see the value in inputs.cpp at 0 NS.我已经可以在 0 NS 处看到 input.cpp 中的值。 How can it happen that busin gets its value in datagen but updates in inputs.cpp first.怎么会发生 busin 在 datagen 中获取其值但首先在 input.cpp 中更新的情况。 (Note : Inputs.cpp file receives busin value from datagen) If you say that the behavior is correct and I don't have to modify anything in my code, then it's all good. (注意:Inputs.cpp 文件从 datagen 接收 busin 值)如果你说行为是正确的,我不需要修改我的代码中的任何内容,那么一切都很好。

Any help is appreciated.任何帮助表示赞赏。 Thanks in advance.提前致谢。

For question #1 , there are two activations at time zero because all SystemC processes will execute at time zero, without being triggered by sensitivities.对于问题#1 ,在时间零有两次激活,因为所有 SystemC 进程都将在时间零执行,而不会被敏感度触发。 The second activation is then triggered by your first write to the bus at time zero.然后,第二次激活由您在时间零时第一次写入总线触发。

If you don't want automatic execution of the method at time zero, place dont_initialize() after specifying the method:如果您不想在时间为零时自动执行该方法,请在指定方法后放置dont_initialize()

SC_METHOD(mydesign);
dont_initialize();     // this can go before or after sensitivities
sensitive << busin;

For question #2 , the inputs block looks to be seeing the value earlier, but the real problem is that testgen is printing the previous value it had written to the bus.对于问题#2inputs块看起来更早看到值,但真正的问题是testgen正在打印它之前写入总线的值。 In your code, the value of busin_o is printed immediately after writing it:在您的代码中, 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);

When doing a write() to an sc_out (or sc_signal ), the new value does not take effect until you suspend the thread by calling wait() .sc_out (或sc_signal )执行write() ,新值不会生效,直到您通过调用wait()挂起线程。 To see the correct value that was applied, you need to print the value of busin_o after a wait() .要查看应用的正确值,您需要在wait()之后打印busin_o的值。 One approach could be to put a zero-delay wait after the write:一种方法可能是在写入后进行零延迟等待:

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);

Note that you're seeing similar behavior with pout .请注意,您在pout看到了类似的行为。 Since the print of pout is done before crossing a wait, you are printing the previous value of pout .由于pout的打印是在经过等待之前完成的,因此您正在打印pout的先前值。

To find more about this behavior, search for the terms "signal semantics" and "delayed assignment".要了解有关此行为的更多信息,请搜索术语“信号语义”和“延迟分配”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM