Jump to content

    
Sign in to follow this  
Koluchiy

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

Recommended Posts

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

 

Share this post


Link to post
Share on other sites

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

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.

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

task automatic simple_task;
ref Var1;
ref Var2;
begin

 

Share this post


Link to post
Share on other sites
1 hour ago, yes said:

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

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

Share this post


Link to post
Share on other sites
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:

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

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

Edited by one_eight_seven

Share this post


Link to post
Share on other sites
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.

 

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

Share this post


Link to post
Share on other sites
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. так, чтобы изменения в функции распространялись всюду, где она используется. Если у вас другая задача, то и инструменты нужны другие.

Share this post


Link to post
Share on other sites
5 minutes ago, one_eight_seven said:

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

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

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.

Sign in to follow this