Перейти к содержанию
    

Вопрос по интерфейсу vhpi к vhdl.

Сразу скажу VHDL не знаю (от слова совсем). Есть некий модуль у которого есть порт объявленный как namePort : out STD_LOGIC_VECTOR (2 downto 0);

Мне надо через vhpi интерфейс в целях верификации прочитать и затем изменить его значение.

Написал такой код (один из вариантов):

 

    vhpiValueT *value;
    value = (vhpiValueT*) malloc ( sizeof(vhpiValueT) );
    value->format = vhpiLogicVecVal;

    vhpiHandleT hnd_s = vhpi_handle_by_name(path, NULL);
    m_num_elems = vhpi_get(vhpiSizeP, hnd_s);
    
    value->bufSize = m_num_elems * sizeof(vhpiEnumT);
    value->value.enumvs = (vhpiEnumT *)malloc(value->bufSize + 1);
    vpi_printf((PLI_BYTE8*) "bufSize %d\n", value->bufSize);

    ret = vhpi_get_value(hnd_s, value);
    vpi_printf((PLI_BYTE8*) "get: hdl path %s, num_el = %0d\n", path, m_num_elems);

 

Получаю m_num_elems = 3, то есть ширину вектора возвращает правильно!

Функция vhpi_get_value возвращает значение 12.

Собственно не пойму, куда функция vhpi_get_value кладёт значения вектора?

Уже перепробовал разные варианты, надоело гадать на кофейной гуще!

Может кто подскажет, как прочитать собственно значение вектора?

До этого все модули были на SV или verilog, вообще проблем не было. А тут попался....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так всегда. Стоит задать вопрос как сразу находится ответ.

С энной попытки таки получилось!

 

    vhpiValueT *value;
    value = (vhpiValueT*) malloc ( sizeof(vhpiValueT) );
    value->format    = vhpiLogicVecVal;

    vhpiHandleT hnd_s = vhpi_handle_by_name(path, NULL);
    m_num_elems = vhpi_get(vhpiSizeP, hnd_s);
    vpi_printf((PLI_BYTE8*) "get: hdl path %s, num_el = %0d\n", path, m_num_elems);

    value->bufSize = m_num_elems * sizeof(vhpiEnumT);
    value->value.enumvs = (vhpiEnumT *)malloc(value->bufSize + 1);
    vpi_printf((PLI_BYTE8*) "bufSize %d\n", value->bufSize);

    ret = vhpi_get_value(hnd_s, value);
    vpi_printf((PLI_BYTE8*) "ret = %d\n", ret);
    
    for(i = 0; i < m_num_elems; i++)
        vpi_printf((PLI_BYTE8*) "val[%d] = %d\n", i, value->value.enumvs[i]);

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...