繁体   English   中英

位向量输出分配延迟

[英]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;

对于问题#2inputs块看起来更早看到值,但真正的问题是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.

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