El paso de un alambre de 256 bits a una función de C a través de la Verilog VPI

StackOverflow https://stackoverflow.com/questions/2282840

  •  21-09-2019
  •  | 
  •  

Pregunta

I tienen un valor de 256 bits en Verilog:

reg [255:0] val;

quiero definir un $ foo de tareas del sistema que llama a C externo utilizando el VPI, para que pueda llamar a $ foo como esto:

$foo(val);

Ahora, en la definición de C para la función de 'foo', no puedo simplemente leer el argumento como un entero (PLI_INT32), porque tengo demasiados bits para caber en uno de esos. Pero, puedo leer el argumento como una cadena, lo que es lo mismo que una matriz de bytes. Aquí está lo que escribí:

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;
}

Como se puede ver, este código lee el argumento como una cadena y luego imprime cada personaje (también conocido como byte) en la cadena. Esto funciona casi a la perfección. Sin embargo, el 00 byte siempre se lee como 20. Por ejemplo, si le asigno la reg Verilog de la siguiente manera:

 val = 256'h000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f;

Y llamarlo usando $foo(val), a continuación, las impresiones de función C este en tiempo de simulación:

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

He probado esto con muchos valores diferentes y han encontrado que el 00 byte siempre se asigna a 20, no importa dónde o cómo muchas veces que aparece en val.

Además, tenga en cuenta que si el valor leído en como vpiHexStrVal, e imprimir la cadena, se ve bien.

Por lo tanto, dos preguntas:

  1. ¿Hay una mejor manera de leer en mi valor de 256 bits desde el Verilog?
  2. ¿Qué está pasando con el 20? Es esto un error? Me estoy perdiendo algo?

Nota:. Estoy usando Aldec para la simulación

¿Fue útil?

Solución

vpiStringVal se utiliza cuando se espera que el valor sea de texto ASCII, con el fin de obtener el valor como un puntero a una cadena C. Esto es útil si desea utilizarlo con funciones C que esperan una cadena C, como printf() con el formato %s, fopen(), etc. Sin embargo, cadenas de C no pueden contener el carácter nulo (ya nula se utiliza para terminar cadenas de C), y que además no puede representar xoz bits, por lo que esto no es un formato que se debe utilizar si es necesario distinguir cualquier valor vectorial posible. Parece que el simulador está utilizando formatos el carácter nulo como un espacio (0x20); otros simuladores ignorando los mensajes, pero eso no le ayuda tampoco. Para distinguir cualquier valor vector posible utilizar ya sea vpiVectorVal (la representación más compacto) o vpiBinStrVal (una cadena binaria con uno / x / carácter z 0/1 para cada bit).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top