назначить sc_logic для sc_lv [i] - SystemC - PullRequest
0 голосов
/ 02 мая 2018

Я работаю над небольшим проектом в SystemC и получил запас для заполнения sc_lv (логического вектора) значениями из sc_logic. Итак:

#include <systemc.h>
#include "fullAdder.h"

SC_MODULE(eightBitAdder)
{
    public:
    fullAdder *fullAdder_p;

    //define I/O
    sc_in  < bool >      clk;
    sc_in  < sc_lv <8> > A;
    sc_in  < sc_lv <8> > B;
    sc_out < sc_lv <8> > SUM;
    sc_out < sc_logic >    C_out;

    // define internal signals
    sc_signal < sc_logic > fa_A, fa_B, fa_SUM, fa_C_out, fa_C_in;
    sc_signal < sc_lv <8> > SUM_temp;


    SC_CTOR(eightBitAdder)
    {
        fullAdder_p = new fullAdder("FullAdder");

        fullAdder_p -> fa_A(fa_A);
        fullAdder_p -> fa_B(fa_B);
        fullAdder_p -> fa_C_in(fa_C_in);
        fullAdder_p -> fa_SUM(fa_SUM);
        fullAdder_p -> fa_C_out(fa_C_out);

        SC_CTHREAD(eightBitAdderFunc, clk.pos());
        //sensitive << A << B << SUM << C_out;
    }

    private:
    void eightBitAdderFunc()
    {
        fa_C_in = SC_LOGIC_0;

        for (int i = 1; i <= 8; i++)
        {
            fa_A.write(A.read()[i]);
            fa_B.write(B.read()[i]);
            wait();
            SUM_temp[i] = fa_SUM; //hier is the problem
            C_out = fa_C_out;
            fa_C_in = fa_C_out;
            wait();
        }
        SUM.write(SUM_temp);
    };
};

Сообщение об ошибке:

eightBitAdder.h:55:14: error: no match for ‘operator[]’ in ‘((eightBitAdder*)this)->eightBitAdder::SUM_temp[i]’

Я пробовал несколько способов присвоить fa_SUM -биты SUM -векторам и всегда получал одну и ту же ошибку. Например:

SUM_temp[i] = fa_SUM.read();

SUM_temp[i].write(fa_SUM);

SUM_temp[i].write(fa_SUM.read());

1 Ответ

0 голосов
/ 03 мая 2018

Эта ошибка связана с тем, что вы пытаетесь получить доступ к операторам [] объекта типа sc_signal, а не объекта типа sc_lv. Только последний поддерживает операторы []. (См. Также стр. 139 и 261-262 IEEE 1666-2011 для определения классов sc_signal и sc_bv.)

Насколько я понимаю, вы используете SUM_temp только как внутреннюю временную переменную. Так что не нужно делать это сигналом. Код ниже работал для меня.

//old: sc_signal < sc_lv <8> > SUM_temp;
sc_lv<8> SUM_temp


//old: SUM_temp[i] = fa_SUM; //hier is the problem
SUM_temp[i] = fa_SUM.read();
...