Перейти к содержанию
    

Как правильно написать task automatic на System Verilog

On 10/18/2018 at 8:48 PM, Darky777 said:

Хотелось бы, чтобы и другие разработчики оставили мнение по этому поводу. Использует ли кто таск в синтезе?

Из последнего синтезируемого 

  always_ff @(posedge iclk) begin
    if (iclkena) begin
      if (state == cDATA_FRM_STATE & irx_val) begin
        do_data_descramble(irx_dat, scrmb_state, odat);
      end
    end
  end
        
  task automatic do_data_descramble (input gfp_dat_t idat, inout gfp_scrmb_t state, output gfp_dat_t odat);
  begin
    odat  = idat ^ state[43 -: $size(idat)];
    state = {state[(43-$size(idat)) : 1], idat};
  end
  endtask

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Короче понятно, что конструкцию, выполняемую за много тактов в таск не запихнуть, даже если @(posedge CLK) будет вне таска.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

25 minutes ago, Restinstage said:

Короче понятно, что конструкцию, выполняемую за много тактов в таск не запихнуть, даже если @(posedge CLK) будет вне таска.

Для синтеза нет. Можно лишь вынести в такой таск работу со стейтами FSM или счетчиком но  выполнятся такой таск должен всегда за 0 времени (одним тактом).   
Но даже так пользоваться тасками удобно для простоты изменений и читаемости кода,  когда в таске  группируются отдельная функциональность, например:

  task automatic tx_seq_set (input u8_t sid, bit [0:SEQ_MAX-1][$bits(e_CMD_t)-1:0] seq);
    tx_seq_t v_seq = '{default:0};

    for (int ii=0,jj=0; ii<SEQ_MAX; ++ii) begin
      if (seq[ii]=='0) begin
        continue;
      end
      v_seq[jj].cmd = e_CMD_t'(seq[ii]);
      v_seq[jj].vld = (ii!=(SEQ_MAX-1));
      jj = jj+1;
    end

    tx_sid <= sid;
    tx_seq <= v_seq;
  endtask
  ...        
  always_ff @(posedge clk) begin
    ...
    if (...) begin
      tmo_clear_timeout(sid);
      tx_seq_set({CMD_SET_REMOTE_IP, CMD_SET_PORT_NUM, CMD_SEND_RST_SEQ});
    end
    else if (..) begin 
      tmo_set_timeout(sid, C_SYN_ACCEPT_TIMEOUT);
      tx_seq_set({CMD_SET_OPT, CMD_SET_REMOTE_IP, CMD_SET_PORT_NUM, CMD_SET_TX_ACK});
    end
    else 
      ...
  end         

Удачи! Rob.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почему-то обходится стороной желаине автора сделать task с локальными переменными, а не классический верилог таск, который вертится в едином пространстве сигналов.

------------

вопрос зачем нужен автоматик то ?

понятно почему синтез старается избавиться от таких описаний - внутри такого таска не сигналы, а переменные, что с ними делать синтезу? да еще постараться, чтобы результаты совпали с симулятором...

ну а если есть желание эксперементировать, можно попробовать обмануть квартуса 

 

task automatic simple_task;
ref Var1;
ref Var2;
begin

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, yes said:

вопрос зачем нужен автоматик то ?

если automatic не добавлять, то все одновременные вызовы будут работать с одними и теме же локальными переменными, то бишь static. А если с automatic, то одновременный вызов будет выполняться каждый в своем "потоке". Как то так

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, Restinstage said:

может правильнее void функцию использовать

Да, правильнее. В общем-то так и рекомендуется.
 

On 10/18/2018 at 4:48 PM, Darky777 said:

Использует ли кто таск в синтезе?

Использовал, когда нужно было, чтобы синтезировался Verilog, а там у функций нет формальных аргументов output и inout. На SystemVerilog не вижу в этом смысла.

1 hour ago, yes said:

вопрос зачем нужен автоматик то ?

чтобы инстанциировать разные вызовы, как разные куски железа. Для синтеза, вообще, требуется, чтобы функции/таски объявлялись автоматиками.

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 minutes ago, one_eight_seven said:

Да, правильнее. В общем-то так и рекомендуется.
 

Понятно, но в контексте моего вопроса это тоже не подходит. Из стандарта:

A void function can
also be used instead of a task to define a subroutine that executes and returns within a single time step.

 

Т.е. что функция, что таск в синтезируемом коде должны выполниться за один такт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Restinstage said:

Понятно, но в контексте моего вопроса это тоже не подходит. Из стандарта:

A void function can
also be used instead of a task to define a subroutine that executes and returns within a single time step.

 

Т.е. что функция, что таск в синтезируемом коде должны выполниться за один такт.

Ну с чего вы взяли, что за один такт? За время их выполнения, вообще не должно пройти нисколько времени. Ни такт, ни 1/10 такта. Для функций это и невозможно, поэтому, они лучше.
И не понимаю, а почему вам это не подходит? Вы хотите always блок поставить внутрь таска? Так - да, не будет работать. Но такая ли проблема - вызывать функцию в always блоке?
Ну, или если у вас размножается не функционал, который стоит выносить в таск, а вся конструкция с always блоками, и т.п. - то зачем вам таски/функции? оформляйте в модуль. Таски и функции хороши тем, что их можно засунуть в package, и импортировать, где нужны уже из package. так, чтобы изменения в функции распространялись всюду, где она используется. Если у вас другая задача, то и инструменты нужны другие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, one_eight_seven said:

Ну, или если у вас размножается не функционал, который стоит выносить в таск, а вся конструкция с always блоками, и т.п. - то зачем вам таски/функции? оформляйте в модуль. Таски и функции хороши тем, что их можно засунуть в package, и импортировать, где нужны уже из package. так, чтобы изменения в функции распространялись всюду, где она используется. Если у вас другая задача, то и инструменты нужны другие.

Именно так, в этом случае значит только модуль. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, можно ли передавать имя таска в качестве входного параметра другого таска?

Для использования в конструкции

disable task_name;

Т.е. есть повторяющийся кусок кода, в котором есть выход из таска. Чтобы можно было этот повторяющийся кусок кода вынести в таск, нужно туда передавать ссылку на таск, который нужно закрывать.

Да, и можно ли закрывать не текущий таск, а вышестоящий? Закроется ли при этом автоматически текущий таск?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...