doom13 0 August 26, 2014 Posted August 26, 2014 · Report post Так последний пример и обеспечивает генерацию кода методом повторения (как бы тупого копирования текста) сколько-то раз какого-то куска кода с подстановкой изменяющегося параметра. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 August 26, 2014 Posted August 26, 2014 · Report post я же не спорю, просто заметил что никогда не думал о такой механике его работы... так его смысл гораздо проще объяснить. Он же не только в цикле может быть. Им можно делать константы разной длинны в зависимости от условий, без варнингов про нулевую или отрицательную длину вектора и так далее... Quote Share this post Link to post Share on other sites More sharing options...
SM 9 August 26, 2014 Posted August 26, 2014 · Report post получается любой конечный цикл может быть записан через generate? Ведь циклы тоже по сути сокращение записи... В общем, да. Например, в AHDL, имеется только цикл GENERATE, и вариантов нет, и все отлично записывалось, что надо. Разница лишь в удобстве - внутри цикла for, который внутри always, можно (и нужно) для части переменных использовать блокирующие присваивания, тем самым используя одну переменную на каждой итерации цикла для сохранения своего значения и модификации его на следующей итерации. А внутри цикла GENERATE, при реализации того же, придется использовать "массив проводов (или регистров)" для хранения значения на каждой итерации. Собственно, вот и вся разница. Таким образом обычный цикл экономит запись за счет использования блокирующих присваиваний для промежуточных значений, устраняя необходимость в массивах промежуточных значений. Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 August 26, 2014 Posted August 26, 2014 · Report post вот тут примерчик бы... что-то я не понимаю откуда массив берется. Quote Share this post Link to post Share on other sites More sharing options...
SM 9 August 26, 2014 Posted August 26, 2014 · Report post да вот тупо сумма пачки значений: обычный цикл: always @* begin sum=0; for (i=0...) sum = sum + addend; end результат - в sum для generate: always @* sum[0] <= addend[0]; generate for (i=1...) always @* sum <= sum[i-1] + addend; результат - в sum[N-1] Quote Share this post Link to post Share on other sites More sharing options...
Golikov 0 August 26, 2014 Posted August 26, 2014 · Report post понял генерайт под always запихать нельзя... потому нужны как бы дополнительные сигналы которые прокинуть данные из одного алвиса в другой... Quote Share this post Link to post Share on other sites More sharing options...
dxp 113 August 26, 2014 Posted August 26, 2014 · Report post получается любой конечный цикл может быть записан через generate? Ведь циклы тоже по сути сокращение записи... никогда generate так не использовал, забавно... я всегда думал что generate (название) образовано от начального создания, а не от генерации кода, забавно.... Современный Verilog (aka SystemVerilog) позволяет при генерации логики по циклическому описанию во многих случаях обходиться без явного указания generate. Явное указание всегда требуется, когда, например, делается инстанцирование модулей или производится генерация модпортов (modport) в интерфейсах. Как-то не представляю применение for вне generate? Сплошь и рядом, простейший пример - функция clog2: function integer clog2 (input integer num); // calculates ceil(log2(num)) begin num = num - 1; for (clog2 = 0; num > 0; clog2 = clog2 + 1) num = num >> 1; end endfunction Quote Share this post Link to post Share on other sites More sharing options...
SM 9 August 26, 2014 Posted August 26, 2014 · Report post Современный Verilog (aka SystemVerilog) позволяет при генерации логики по циклическому описанию во многих случаях обходиться без явного указания generate. Да и несовременный, общепринятый и привычный v-2001, тоже. Quote Share this post Link to post Share on other sites More sharing options...
dxp 113 August 26, 2014 Posted August 26, 2014 · Report post Да и несовременный, общепринятый и привычный v-2001, тоже. Так-то да, по смыслу for внутри поведенческого блока не нуждается ни в каких generate, которые нужно указывать вне таких блоков. Но вот помнится мне, что во времена становления "общепринятых" синтезаторов были проблемы, например, внутри task'ов с "цикличным" описанием. Позднее стало получше, но тогда уже и стандарты посвежее пошли. P.S. Имхо, общепринятым уже давно стал v-2009 (а то и 2011). :) Quote Share this post Link to post Share on other sites More sharing options...