У меня есть 256-битное значение в Verilog:Передача 256-битный провода к функции C через Verilog VPI
reg [255:0] val;
Я хочу, чтобы определить систему задачи $ Foo, который вызывает к внешним С помощью ИВТ, так что я могу назвать $ Foo вроде этого:
$foo(val);
Теперь, в определении C для функции «Foo», я не могу просто читать аргумент в виде целого числа (PLI_INT32), потому что у меня слишком много бит, чтобы соответствовать одному из них. Но, я могу прочитать аргумент как строку, то же самое, что и массив байтов. Вот что я писал:
static int foo(char *userdata) {
vpiHandle systfref, args_iter, argh;
struct t_vpi_value argval;
PLI_BYTE8 *value;
systfref = vpi_handle(vpiSysTfCall, NULL);
args_iter = vpi_iterate(vpiArgument, systfref);
argval.format = vpiStringVal;
argh = vpi_scan(args_iter);
vpi_get_value(argh, &argval);
value = argval.value.str;
int i;
for (i = 0; i < 32; i++) {
vpi_printf("%.2x ", value[i]);
}
vpi_printf("\n");
vpi_free_object(args_iter);
return 0;
}
Как вы можете видеть, этот код считывает аргумент в виде строки, а затем выводит каждый символ (так называемые байты) в строке. Это работает почти отлично. Однако байт 00
всегда считывается как 20
. Например, если я назначить рег Verilog следующим образом:
val = 256'h000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f;
И вызвать его, используя $foo(val)
, то функция печатает C это во время моделирования:
VPI: 20 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
Я испытал это со многими различными значениями и обнаружили, что байт 00
всегда отображается на 20
, независимо от того, где и сколько раз он отображается в val
.
Также обратите внимание, что если я прочитаю значение в качестве vpiHexStrVal
и распечатаю строку, это выглядит нормально.
Итак, два вопроса:
- Есть ли лучший способ читать в моем 256-битное значение из Verilog?
- Что происходит с
20
? Это ошибка? Я что-то упускаю?
Примечание: Я использую Aldec для моделирования.
Я не хотел использовать 'vpiBinStrVal' или' vpiVectorVal', потому что было неудобно иметь входной формат в один бит за раз. Я действительно хочу, чтобы данные отформатировались как 32 8-битных значения; Я закончил просто сращивание 256-битного провода и отправку его в виде 8 32-битных входов, которые можно прочитать как 'vpiIntVal', и тривиально преобразовать их в массив из 32 байтов. – pheaver
Ок, но 'vpiVectorVal' позволяет вам читать биты как 32-битные слова; это не бит за раз. – mark4o
Да, вы правы, и я оговорился. Я имею в виду, что мне нужна реальная интегральная ценность, а не то, что имеет в ней «x» и «z». Хотя неважное дело, я могу его преобразовать. – pheaver