2016-12-18 7 views
0

я следующую функцию:systemVeilog - передать массив неизвестного размера

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 

Я вызвать функцию:

foo_arr_bit(seed, data_bit, "data_bit"); 

Где data_bit может быть: бит [1: 0]/бит [2: 0]/бит [3: 0]/бит [4: 0]/бит [5: 0] и т. Д.

При попытке скомпилировать я получил следующую ошибку: рядом с "[": ошибка синтаксиса, неожиданный [, ожидая IDENTIFIER или TYPE_IDENTIFIER или NETTYPE_IDENTIFIER.

ответ

1

[*] не правильный синтаксис для динамического массива, используйте [].

Ваш массив может быть только динамическим в без упаковки размер. Поэтому у вас не может быть bit [] mem_array, но должно быть bit mem_array[].

И, наконец, функция, использующая pass by reference, не может иметь статическое время жизни. То есть он должен быть объявлен как автоматический.

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 

Редактировать: Но даже с этими изменениями вы сталкиваетесь с более серьезной проблемой. Передача по ссылке требует очень строгой типизации. Не допускается кастинг, поэтому я ожидаю, что возникнут проблемы с преобразованием типов.

Кроме того, в вашем случае передача по ссылке не требуется. Вместо этого используйте inout.

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

мой вход упакованный массив, а не непечатан. – sara8d

+0

В Systemverilog нет динамических упакованных массивов. Использование параметризуемого класса для инкапсулирования вашей функции может быть решением. Подробнее об этом здесь: http://forums.accellera.org/topic/1177-how-to-pass-variable-sized-packed-arguments-to-a-taskfunction/ Или просто передайте SIZE функции и у вас есть достаточно большой упакованной решеткой. – Hida

 Смежные вопросы

  • Нет связанных вопросов^_^