$sscanf не возвращает или не устанавливает значения в Questasim

У меня серьезная проблема совместимости с моим системным кодом verilog.

У меня есть эта строка: c = $sscanf(line, "0x%x %s %s %d", hex_value, type, name, size);

Использование компилятора vcs дает результат: c = 4, hex_value = 0x001, type = "empty", name = "mem_block", size = 8

При использовании Questasim vlog -sv и vsim -c дает результат: c = 0, hex_value = 0x000, type = "", name = "", size = 0

Кто-нибудь знает решение для этой или другой функции сканирования строк?

Редактировать:

Я нашел причину, по которой я не распечатал правильный вывод. Я использовал:

display($sformatf("c=%d, hex_value = %x, type=%s, size=%s", c, hex_value, type, name, size));

Изменил это значение на $display($sformatf(line, "c=%d, hex_value = %x, type=%s, size=%s", c, hex_value, type, name, size));, и оно отлично заработало в Questasim, но не в VCS. У меня все еще есть проблема с тем, что c возвращается как 0 из $sscanf, а также не устанавливает значения hex_value и т. д.

Редактировать 2:

Нашел проблему, но не решение

Причиной ошибки/проблемы является 0x%x, где VCS нужно, чтобы это не помещало что-то вроде 0x0f1, в то время как в Questasim это приводит к тому, что все значения по умолчанию равны 0, так что c=0, hex_value=0x00, type="" и т. д. Кто-нибудь знает хороший способ решить эту проблему? Я пробовал разные комбинации 0x и x0 до %x, но ничего не работает. hex_value определяется так typedef bit unsigned [63:0] hex_addr_t;


person user123577    schedule 07.08.2014    source источник
comment
К вашему сведению, type является ключевым словом SystemVerilog и должно вызвать проблемы, переименуйте его (например, _type или type_). Почему вы кладете $sformatf внутрь $display? Попробуйте: $display("c=%d, hex_value = %x, type=%s, name=%s, size=%d", c, hex_value, _type, name, size); или output_msg = $sformatf("c=%d, hex_value = %x, type=%s, name=%s, size=%d", c, hex_value, _type, name, size); $display("%s", output_msg);   -  person Greg    schedule 07.08.2014
comment
Ах да, извините, я немного новичок в системе-верилог   -  person user123577    schedule 08.08.2014


Ответы (1)


Обнаружил проблему, у меня есть шестнадцатеричные значения с 0x перед значениями, к сожалению, это сканируется $sscanf в VCS, а затем по умолчанию используется шестнадцатеричное значение 0x0f1, а добавление 0x в VCS $sscanf пропускает часть 0x. К сожалению, это приводит к тому, что Questasim принимает по умолчанию все значения, указанные от $sscanf до 0, потому что он не знает, что делать со спецификатором. Решением этого было использование цикла for для проверки первого вхождения x, а затем замены его на 0 с помощью str.putc(len_to_x, "0").

person user123577    schedule 08.08.2014