Jump to content

    

Генерация единичной матрицы на SV

Добрый день!

Подскажите, пожалуйста, простой и доступный способ реализации на SV функции генерации единичной матрицы. 

Вот набросок моего видения этой функции:

function automatic logic[size-1:0][size-1:0] eye (input int size);
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++)
            eye[i][j] = (i == j);           
endfunction

Понятно, что компилятор не видит size в шапке объявляемой функции. Не понятно, как описать функцию, у которой размерность выходного аргумента зависит входного аргумента.

Share this post


Link to post
Share on other sites
4 hours ago, TamRazZ said:

Добрый день!

Подскажите, пожалуйста, простой и доступный способ реализации на SV функции генерации единичной матрицы. 

Вот набросок моего видения этой функции:


function automatic logic[size-1:0][size-1:0] eye (input int size);
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++)
            eye[i][j] = (i == j);           
endfunction

Понятно, что компилятор не видит size в шапке объявляемой функции. Не понятно, как описать функцию, у которой размерность выходного аргумента зависит входного аргумента.

Размеры должны быть определены статически, до компиляции. Это HDL.

А по вашему вопросу, если нужно синтезированное, то сделать шаблон через функцию в параметризуемом интерфейсе. Если для моделирования - параметризуемый класс.

PS. LDPC декодер?

Share this post


Link to post
Share on other sites

Приветствую!

3 hours ago, TamRazZ said:

...

Понятно, что компилятор не видит size в шапке объявляемой функции. Не понятно, как описать функцию, у которой размерность выходного аргумента зависит входного аргумента.

IMHO никак - в SV тип возвращаемый из функции должен быть определен  на этапе компиляции. 

Поэтому либо заранее резервируете длинный вектор "logic [max_x*max_y-1:0]" с последующими плясками с приведением типов, либо извратится (если только для симуляции нужно) как то так:  

module tst;

typedef bit dynarray_of_bit_t[];

function dynarray_of_bit_t gen_one (input int size);
  gen_one=new[size*size];
  
  for (int ii=0;ii<size;++ii) begin
    gen_one[ii*size+ii]=1;
  end
endfunction

bit [2:0][2:0] arr3x3;
bit [4:0][4:0] arr5x5;

initial begin
  arr3x3 = {>> {gen_one(3)}};
  arr5x5 = {>> {gen_one(5)}};
end

endmodule

Удачи! Rob.

Share this post


Link to post
Share on other sites
2 hours ago, des00 said:

Размеры должны быть определены статически, до компиляции. Это HDL.

А по вашему вопросу, если нужно синтезированное, то сделать шаблон через функцию в параметризуемом интерфейсе. Если для моделирования - параметризуемый класс.

PS. LDPC декодер?

Нужно именно синтезируемое. Пока Хэмминг для тренировки, в будущем, конечно, LDPC=)

сделать шаблон через функцию в параметризуемом интерфейсе

Можно поподробнее не совсем понял, терминология у меня хромает пока...

Share this post


Link to post
Share on other sites
7 hours ago, TamRazZ said:

Нужно именно синтезируемое. Пока Хэмминг для тренировки, в будущем, конечно, LDPC=)

Хмм, непомню зачем в Хэмминге единичные матрицы, ну да ладно) Как вариант, можете в теме про FEC кодек Хэмминга посмотреть)

7 hours ago, TamRazZ said:

сделать шаблон через функцию в параметризуемом интерфейсе

Можно поподробнее не совсем понял, терминология у меня хромает пока...

очень условно

interface pipa_if #(parameter int pIDAT_W = 8);

  localparam int cODAT_W = 10 + pIDAT_W;

  function logic [cODAT_W-1 : 0] do_something (input logic [pIDAT_W-1 : 0] dat);
    do_something = (dat << 8) ^ dat;
  endfunction

endinterface


module test (input logic [15 : 0] idat, output logic [17 : 0] odat8, logic [23 : 0] odat16);

  pipa_if #(8)  popa8 ();
  pipa_if #(16) popa16();

  assign odat8  = popa16.do_something(idat[7 : 0]);
  assign odat16 = popa16.do_something(idat);

endmodule

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this