2016-12-18 1 views
0

je la fonction suivante:systemVeilog passe - tableau de taille inconnue

function void foo_arr_bit (int seed, ref bit [*] mem, string mem_name); 
     for (int i=0; i< mem.size(); i++) 
    mem[i] = my_randomize_int(seed, mem[i], mem_name);  
    endfunction: foo_arr_bit 

-je appeler la fonction par:

foo_arr_bit(seed, data_bit, "data_bit"); 

Où data_bit peut être: bit [1: 0]/bit [2: 0]/bit [3: 0]/bit [4: 0]/bit [5: 0] etc ...

Lorsque j'essaie de compiler j'ai l'erreur suivante: près de "[": erreur de syntaxe, inattendue [, attend IDENTIFIER ou TYPE_IDENTIFIER ou NETTYPE_IDENTIFIER.

Répondre

1

[*] n'est pas la syntaxe correcte pour un tableau dynamique, utilisez [].

Votre groupe ne peut être dynamique que dans la dimension déballée. Donc vous ne pouvez pas avoir bit [] mem_array, mais vous devez avoir bit mem_array[].

Enfin, une fonction utilisant le passage par référence ne peut avoir une durée de vie statique. Autrement dit, il doit être déclaré comme automatique.

function automatic void foo_arr_bit (int seed, ref bit mem[], string mem_name); 
    for (int i=0; i< mem.size(); i++) 
    mem[i] = my_randomize_int(seed, mem[i], mem_name);  
endfunction: foo_arr_bit 

Modifier: Mais même avec ces changements, vous faites face à un problème plus important. Passer par référence exige un typage très strict. Il n'y a pas de casting autorisé donc je m'attends à ce qu'il y ait des problèmes avec la conversion de type.

De plus, le passage par référence n'est pas vraiment nécessaire dans votre cas. Utilisez inout à la place.

function automatic void foo_arr_bit (input int seed, string mem_name, inout bit mem[]); 
    for (int i=0; i< mem.size(); i++) 
    mem[i] = my_randomize_int(seed, mem[i], mem_name); 
endfunction: foo_arr_bit 
+0

mon entrée est un tableau condensé, non découplé. – sara8d

+0

Systemverilog ne dispose pas de tableaux dynamiques. L'utilisation d'une classe paramétrable pour encapsuler votre fonction pourrait être une solution. Plus sur cela ici: http://forums.accellera.org/topic/1177-how-to-pass-variable-sized-packed-arguments-to-a-taskfunction/ Ou juste passer SIZE à la fonction et avoir un réseau compact suffisamment grand. – Hida