Задержка в битвекторе - PullRequest
       74

Задержка в битвекторе

0 голосов
/ 16 января 2020

Я новичок в Системе C, и мне очень нужна ваша помощь в решении проблемы времени.

Пожалуйста, найдите ниже код activuli.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();  
}

input2.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);
};

input2. 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) Почему busin в моем файле данных обновляется после 1ns? Я уже вижу значение во входах. cpp при 0 нс. Как это может случиться, что busin получает свое значение в датагене, но обновляет входные данные. (Примечание: входные данные. cpp файл получает значение busin из datagen). Если вы говорите, что поведение правильное, и мне не нужно ничего менять в моем коде, то все хорошо.

Любая помощь приветствуется. Заранее спасибо.

1 Ответ

0 голосов
/ 30 января 2020

Для вопроса # 1 есть две активации в нулевое время, потому что все процессы System C будут выполняться в нулевое время, не будучи вызванными чувствительностью. Вторая активация запускается вашей первой записью на шину в нулевое время.

Если вы не хотите автоматизировать c выполнение метода в нулевое время, поместите 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);

При выполнении write() для sc_out (или sc_signal) новое значение не принимает эффект, пока вы не приостановите поток, вызвав wait(). Чтобы увидеть правильное значение, которое было применено, вам нужно напечатать значение busin_o после wait(). Одним из подходов может быть установка ожидания нулевой задержки после записи:

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.

Чтобы узнать больше об этом поведении, найдите термины «семантика сигнала» и «отложенное назначение». ».

...