Jump to content
    

Функция не правильно выдаёт значения

Есть функция:
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
Есть идеи что не так?
image.png.d45658fa5f3c65e89ccf67d4e8061b92.pngimage.png.9df5a62fbec1ea5e7b5a66ec4a2c7573.png

Share this post


Link to post
Share on other sites

25 минут назад, stasik322 сказал:

for(int i = 0; i < SIZE; i++)

i в функции где. Может if(mask == 1'b1) 

 

Edited by sazh
не отразилось mask[i]

Share this post


Link to post
Share on other sites

Было бы неплохо написать что именно функция должна делать.

Но я смело предполагаю что Вы имели в виду

Quote

 

if (mask [ i ] == 1'b1) begin

result[k] =i;

 

и далее по тексту.

Edited by fpga_dev
Форумный движок не даёт написать [ I].

Share this post


Link to post
Share on other sites

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] ...
А с какой это стати?  И куда деваются "обрезки"? ... 

Share this post


Link to post
Share on other sites

3 часа назад, fpga_dev сказал:

 

Но я смело предполагаю что Вы имели в виду

if (mask== 1'b1) begin

result[k] =i;

 

Да, это мой косяк, исправил, но результат от этого не изменился.
image.png.07bbbd9c689d51f8a0fb71ce56a44342.png

3 часа назад, fpga_dev сказал:

То что верилог легко прощает сравнение 32х битов с одним это одна из причин почему я предпочитаю VHDL.

 


Пробовал прокинуть параметры NUM_POS_THIS_TYPE и $clog2(NUM_IF), но не получалось этого сделать.

image.png

Share this post


Link to post
Share on other sites

Про сравнение и vhdl не берите в голову когда я это писал я еще не понял что у вас квадратные скобки потерялись 🙂

Share this post


Link to post
Share on other sites

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 не берите в голову когда я это писал я еще не понял что у вас квадратные скобки потерялись 🙂

Да уж, что есть, то есть))) Но я поправил и этот момент, а результат не изменяется в симе.
 

Share this post


Link to post
Share on other sites

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] ...  

Share this post


Link to post
Share on other sites

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 by fpga_dev

Share this post


Link to post
Share on other sites

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 выдаёт ошибку:
image.png.11402fe7be792d66e58927f919643871.png
Ругается, на строчку 
function automatic logic [NUM_POS_THIS_TYPE-1:0][POS_DW-1:0] find_positions(
Я так понял, что он не может объявить вектор с такими параметрами, пока сам этот параметр не объявлен, а объявляется он только внутри модуля, а функция лежит в pkg. Что делать в такой ситуации? Перемещение функции внутрь модуля мне не поможет потому что параметры NUM_POS_THIS_TYPE и POS_DW вычисляются в цикле, а делать функции в цикле тоже нельзя (логично).

Share this post


Link to post
Share on other sites

1 minute ago, fpga_dev said:

И что, верилог это съедает? Присваивание двухмерных массивов разного размера?

Нет не съедает, иначе у TC не было бы проблем ... 
Ну и ещё раз packed array автоматом конвертируется только в vector,  а вектор автоматом может конвертироваться в packed array.
И если размерности array не совпадают то обрезка/дополнение нулями работает для вектора, а не  для отдельных элементов packed array.  

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...