des00 25 10 марта, 2021 Опубликовано 10 марта, 2021 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Restinstage 1 10 марта, 2021 Опубликовано 10 марта, 2021 · Жалоба Спасибо. Короче понятно, что конструкцию, выполняемую за много тактов в таск не запихнуть, даже если @(posedge CLK) будет вне таска. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 10 марта, 2021 Опубликовано 10 марта, 2021 · Жалоба Приветствую! 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 5 10 марта, 2021 Опубликовано 10 марта, 2021 · Жалоба почему-то обходится стороной желаине автора сделать task с локальными переменными, а не классический верилог таск, который вертится в едином пространстве сигналов. ------------ вопрос зачем нужен автоматик то ? понятно почему синтез старается избавиться от таких описаний - внутри такого таска не сигналы, а переменные, что с ними делать синтезу? да еще постараться, чтобы результаты совпали с симулятором... ну а если есть желание эксперементировать, можно попробовать обмануть квартуса task automatic simple_task; ref Var1; ref Var2; begin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 10 марта, 2021 Опубликовано 10 марта, 2021 · Жалоба 1 hour ago, yes said: вопрос зачем нужен автоматик то ? если automatic не добавлять, то все одновременные вызовы будут работать с одними и теме же локальными переменными, то бишь static. А если с automatic, то одновременный вызов будет выполняться каждый в своем "потоке". Как то так Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 10 марта, 2021 Опубликовано 10 марта, 2021 (изменено) · Жалоба 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: вопрос зачем нужен автоматик то ? чтобы инстанциировать разные вызовы, как разные куски железа. Для синтеза, вообще, требуется, чтобы функции/таски объявлялись автоматиками. Изменено 10 марта, 2021 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Restinstage 1 10 марта, 2021 Опубликовано 10 марта, 2021 · Жалоба 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. Т.е. что функция, что таск в синтезируемом коде должны выполниться за один такт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 10 марта, 2021 Опубликовано 10 марта, 2021 · Жалоба 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. так, чтобы изменения в функции распространялись всюду, где она используется. Если у вас другая задача, то и инструменты нужны другие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Restinstage 1 10 марта, 2021 Опубликовано 10 марта, 2021 · Жалоба 5 minutes ago, one_eight_seven said: Ну, или если у вас размножается не функционал, который стоит выносить в таск, а вся конструкция с always блоками, и т.п. - то зачем вам таски/функции? оформляйте в модуль. Таски и функции хороши тем, что их можно засунуть в package, и импортировать, где нужны уже из package. так, чтобы изменения в функции распространялись всюду, где она используется. Если у вас другая задача, то и инструменты нужны другие. Именно так, в этом случае значит только модуль. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 20 апреля, 2023 Опубликовано 20 апреля, 2023 · Жалоба Подскажите, можно ли передавать имя таска в качестве входного параметра другого таска? Для использования в конструкции disable task_name; Т.е. есть повторяющийся кусок кода, в котором есть выход из таска. Чтобы можно было этот повторяющийся кусок кода вынести в таск, нужно туда передавать ссылку на таск, который нужно закрывать. Да, и можно ли закрывать не текущий таск, а вышестоящий? Закроется ли при этом автоматически текущий таск? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться