inco 1 18 октября, 2016 Опубликовано 18 октября, 2016 · Жалоба Сразу скажу 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, вообще проблем не было. А тут попался.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inco 1 18 октября, 2016 Опубликовано 18 октября, 2016 · Жалоба Вот так всегда. Стоит задать вопрос как сразу находится ответ. С энной попытки таки получилось! 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]); Значения читаются нормально. Так что теперь осталось разобраться с записью. Но это уже другая история. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться