Le passage d'un fil de 256 bits à une fonction C à travers le Verilog VPI

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

  •  21-09-2019
  •  | 
  •  

Question

I ont une valeur de 256 bits en Verilog:

reg [255:0] val;

Je veux définir une tâche de système $ foo qui appelle à C externe en utilisant le VPI, donc je peux appeler $ foo comme ceci:

$foo(val);

Maintenant, dans la définition de C pour la fonction « foo », je ne peux pas lire simplement l'argument comme un entier (PLI_INT32), parce que j'ai trop de bits pour tenir dans un. Mais, je peux lire l'argument comme une chaîne, qui est la même chose que d'un tableau d'octets. Voici ce que je l'ai écrit:

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

Comme vous pouvez le voir, ce code lit l'argument comme une chaîne et puis imprime sur chaque caractère (alias octet) dans la chaîne. Cela fonctionne presque parfaitement. Cependant, l'octet 00 obtient toujours lu comme 20. Par exemple, si j'Affectez les Verilog reg comme suit:

 val = 256'h000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f;

Et appeler à l'aide $foo(val), puis les impressions de la fonction C à ce temps de simulation:

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

Je l'ai testé avec beaucoup de valeurs différentes et ont trouvé que l'octet 00 obtient toujours mappé à 20, peu importe où ou combien de fois il apparaît dans val.

En outre, notez que si je lis la valeur en tant vpiHexStrVal et imprimer la chaîne, il semble bien.

Alors, deux questions:

  1. Y at-il une meilleure façon de lire dans ma valeur 256 bits du Verilog?
  2. Qu'est-ce qui se passe avec le 20? Est-ce un bug? Est-ce que je manque quelque chose?

Note:. J'utilise Aldec pour la simulation

Était-ce utile?

La solution

vpiStringVal est utilisé lorsque la valeur devrait être du texte ASCII, afin d'obtenir la valeur en tant que pointeur sur une chaîne C. Ceci est utile si vous voulez l'utiliser avec des fonctions C qui attendent une chaîne de C, comme printf() avec le format %s, fopen(), etc. Cependant, les chaînes C ne peuvent pas contenir le caractère nul (puisque nul est utilisé pour mettre fin à des chaînes C), et aussi ne peut pas représenter les bits de x ou z, donc ce n'est pas un format qui doit être utilisé si vous avez besoin de distinguer une valeur de vecteur possible. Il semble que le simulateur vous utilisez des formats le caractère nul comme un espace (0x20); d'autres simulateurs simplement les sauter, mais cela ne vous aide pas non plus. Pour distinguer une valeur de vecteur possible d'utiliser soit vpiVectorVal (la représentation la plus compacte) ou vpiBinStrVal (une chaîne binaire avec une 0/1 / x / z caractère pour chaque bit).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top