stasik322 0 March 6 Posted March 6 · Report post Есть функция: function automatic logic [32-1:0][32-1:0] find_positions( input int SIZE, input logic [32-1:0] mask ); logic [32-1:0][32-1:0] result = '0; int k = 0; for(int i = 0; i < SIZE; i++) begin if(mask == 1'b1) begin result[k] = k; k++; end end return result; endfunction Вызываю функцию следующим образом: localparam int NUM_IF = 8; // пример localparam logic [NUM_IF-1:0] MASK_POS_THIS_TYPE = 8b'11000011; // пример localparam int NUM_POS_THIS_TYPE = 4; // вычисляется как количество 1 в маске MASK_POS_THIS_TYPE, в этом примере равно 4, но по факту тоже через другую функцию делаю localparam logic [NUM_POS_THIS_TYPE-1:0][$clog2(NUM_IF)-1:0] POS_THIS_TYPE = find_positions(NUM_IF,MASK_POS_THIS_TYPE); Функция выдаёт logic 32x32, в синтезируемой логике значение просто обрезается, тут вроде бы тоже самое, поправьте если я не прав. Как результат я жду, что функция присвоит POS_THIS_TYPE значения [0,1,6,7], естественно в виде векторов [000] [001] [110] [111]. По факту же имею на выходе [000] [000] [000] [000]. Функцию я вызываю в цикле по параметру. Сама функция лежит в package, его я импортирую. Все используемые здесь параметры правильно инициализированы и их значения правильны, только POS_THIS_TYPE не корректен. for (genvar k = 0; k < NUM_TYPE_CDC; k++) begin localparam logic [NUM_POS_THIS_TYPE-1:0][$clog2(NUM_IF)-1:0] POS_THIS_TYPE = find_positions(NUM_IF,MASK_POS_THIS_TYPE) end Есть идеи что не так? Quote Share this post Link to post Share on other sites More sharing options...
sazh 11 March 6 Posted March 6 (edited) · Report post 25 минут назад, stasik322 сказал: for(int i = 0; i < SIZE; i++) i в функции где. Может if(mask == 1'b1) Edited March 6 by sazh не отразилось mask[i] Quote Share this post Link to post Share on other sites More sharing options...
fpga_dev 11 March 6 Posted March 6 (edited) · Report post Было бы неплохо написать что именно функция должна делать. Но я смело предполагаю что Вы имели в виду Quote if (mask [ i ] == 1'b1) begin result[k] =i; и далее по тексту. Edited March 6 by fpga_dev Форумный движок не даёт написать [ I]. Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 99 March 6 Posted March 6 · Report post 33 minutes ago, stasik322 said: Функция выдаёт logic 32x32, в синтезируемой логике значение просто обрезается, тут вроде бы тоже самое, поправьте если я не прав. Как результат я жду, что функция присвоит POS_THIS_TYPE значения [0,1,6,7], естественно в виде векторов [000] [001] [110] [111]. По факту же имею на выходе [000] [000] [000] [000] Легким движением руки брюки размерности [31:0][31:0] вдруг превращаются в элегантные шорты [3:0][2:0] ... А с какой это стати? И куда деваются "обрезки"? ... Quote Share this post Link to post Share on other sites More sharing options...
stasik322 0 March 6 Posted March 6 · Report post 3 часа назад, fpga_dev сказал: Но я смело предполагаю что Вы имели в виду if (mask== 1'b1) begin result[k] =i; Да, это мой косяк, исправил, но результат от этого не изменился. 3 часа назад, fpga_dev сказал: То что верилог легко прощает сравнение 32х битов с одним это одна из причин почему я предпочитаю VHDL. Пробовал прокинуть параметры NUM_POS_THIS_TYPE и $clog2(NUM_IF), но не получалось этого сделать. Quote Share this post Link to post Share on other sites More sharing options...
fpga_dev 11 March 6 Posted March 6 · Report post Про сравнение и vhdl не берите в голову когда я это писал я еще не понял что у вас квадратные скобки потерялись 🙂 Quote Share this post Link to post Share on other sites More sharing options...
stasik322 0 March 6 Posted March 6 · Report post 3 часа назад, RobFPGA сказал: Легким движением руки брюки размерности [31:0][31:0] вдруг превращаются в элегантные шорты [2:0][2:0] ... А с какой это стати? И куда деваются "обрезки"? ... Как я и сказал, в синтезируемых конструкциях если сделать следующее: logic [7:0] data_i = 8b'11110011; logic [3:0] data_o; assign data_o = data_i; То data_o будет равен 0011, я только этим и руководствовался, как уже и сказал выше. С функциями это так не работает? function automatic logic [32-1:0][32-1:0] find_positions( input int SIZE, input logic [32-1:0] mask ); logic [32-1:0][32-1:0] result = '0; int k = 0; for(int i = 0; i < SIZE; i++) begin if(mask == 1'b1) begin result[k] = i; k++; end end return result; endfunction 3 часа назад, fpga_dev сказал: Про сравнение и vhdl не берите в голову когда я это писал я еще не понял что у вас квадратные скобки потерялись 🙂 Да уж, что есть, то есть))) Но я поправил и этот момент, а результат не изменяется в симе. Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 99 March 6 Posted March 6 · Report post Just now, stasik322 said: То data_o будет равен 0011, я только этим и руководствовался, как уже и сказал выше. С функциями это так не работает? Вопрос не в функции - вопрос в том что вы используете packed array для возвращаемого результата. И почему то думаете что он должен автоматом конвертироваться в другой packed array другой размерности. А это не так. Packed array [N-1:0][M-1:0] можно переставить как vector [N*M-1:0]. Вот вы и пытаетесь вектору [4*3-1:0] присвоить вектор [32*32-1:0] ... Quote Share this post Link to post Share on other sites More sharing options...
fpga_dev 11 March 6 Posted March 6 (edited) · Report post 19 minutes ago, RobFPGA said: Packed array [N-1:0][M-1:0] можно переставить как vector [N*M-1:0]. Вот вы и пытаетесь вектору [4*3-1:0] присвоить вектор [32*32-1:0] .. И что, верилог это съедает? Присваивание двухмерных массивов разного размера? 😱 Edited March 6 by fpga_dev Quote Share this post Link to post Share on other sites More sharing options...
stasik322 0 March 6 Posted March 6 · Report post 3 часа назад, RobFPGA сказал: Вопрос не в функции - вопрос в том что вы используете packed array для возвращаемого результата. И почему то думаете что он должен автоматом конвертироваться в другой packed array другой размерности. А это не так. Packed array [N-1:0][M-1:0] можно переставить как vector [N*M-1:0]. Вот вы и пытаетесь вектору [4*3-1:0] присвоить вектор [32*32-1:0] ... Да, я понял, это действительно проблема, изначально функция выглядела примерно вот так: function automatic logic [NUM_POS_THIS_TYPE-1:0][POS_DW-1:0] find_positions( input int SIZE, input int POS_DW, input int NUM_POS_THIS_TYPE, input logic [SIZE-1:0] mask ); logic [NUM_POS_THIS_TYPE-1:0][POS_DW-1:0] result = '0; int k = 0; for(int i = 0; i < SIZE; i++) begin if(mask[i] == 1'b1) begin result[k] = i; k++; end end return result; endfunction а вызывал вот так localparam logic [NUM_POS_THIS_TYPE-1:0][$clog2(NUM_IF)-1:0] POS_THIS_TYPE = find_positions(NUM_IF, $clog2(NUM_IF), NUM_POS_THIS_TYPE, MASK_POS_THIS_TYPE); Но vivado выдаёт ошибку: Ругается, на строчку function automatic logic [NUM_POS_THIS_TYPE-1:0][POS_DW-1:0] find_positions( Я так понял, что он не может объявить вектор с такими параметрами, пока сам этот параметр не объявлен, а объявляется он только внутри модуля, а функция лежит в pkg. Что делать в такой ситуации? Перемещение функции внутрь модуля мне не поможет потому что параметры NUM_POS_THIS_TYPE и POS_DW вычисляются в цикле, а делать функции в цикле тоже нельзя (логично). Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 99 March 6 Posted March 6 · Report post 1 minute ago, fpga_dev said: И что, верилог это съедает? Присваивание двухмерных массивов разного размера? Нет не съедает, иначе у TC не было бы проблем ... Ну и ещё раз packed array автоматом конвертируется только в vector, а вектор автоматом может конвертироваться в packed array. И если размерности array не совпадают то обрезка/дополнение нулями работает для вектора, а не для отдельных элементов packed array. Quote Share this post Link to post Share on other sites More sharing options...
RobFPGA 99 March 6 Posted March 6 · Report post 7 minutes ago, stasik322 said: Что делать в такой ситуации? А что мешает вам сделать? localparam [NUM_POS_THIS_TYPE-1:0][31:0] POS_THIS_TYPE = find_positions(NUM_IF, MASK_POS_THIS_TYPE); Quote Share this post Link to post Share on other sites More sharing options...