sazh 8 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Правда, это никак не проясняет "чудо for". А чудес не бывает. Что влоб, что по лбу. module TestFor #(parameter L = 8) ( input wire clk, input wire [7:0] din, output logic [7:0] dout ); bit[7:0] ff[0:L-1]; always_ff @(posedge clk) begin ff[0] <= din; end genvar k; generate for (k=0; k<(L-1); k++) begin: rg always_ff @(posedge clk) begin ff[k+1] <= ff[k]; end end endgenerate assign dout = ff[L-1]; endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба А чудес не бывает. Что влоб, что по лбу. В этом и заключался мой вопрос:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 7 октября, 2010 Опубликовано 7 октября, 2010 · Жалоба Вот скажем - что нужно добавить к моему коду, чтобы for уже не "прокатывал"? я вам могу сказать, что нужно добавить к коду чтобы generate for не прокатывал, там где процедурный for работает. сделайте элементом массива структуру и тогда если вы в разных генереётах будете обращаться к разным типам полей, то синтезатор скажет, что это ошибка, т.к. вы присваиваете в разных процессах одному и тому же агригату данных, хотя формально вы одному и тому же элементу не присваиваете, т.е. проблемы разрешения драйверов не появляется. а вообще я не понимаю о чём именно речь. вы хотите узнать всегда ли можно одну конструкцию заменить на другую без изменения функциональности? если так, то нет, конструкции эти не эквивалентны (я пару раз попадался и долго понять не мог почему ж компилятор ругается, потом оказывалось, что формально компиллер был прав) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба вы хотите узнать всегда ли можно одну конструкцию заменить на другую без изменения функциональности? если так, то нет, конструкции эти не эквивалентны Я понимаю, что "нет". Для того они обе и существуют. Вот другой пример. Можно ли там обойтись без generate? Могу и сам проверить на досуге, не сложно. Привожу для иллюстрации своего уже несколько раз озвученного вопроса. Может быть, кто-то уже имеет точный критерий, когда он применяет generate, а когда просто for. module Test2_wor (input logic [6:0] in, output wor out); generate genvar i; for (i = 0; i <= 6; i++) begin : wor_gen assign out = in[i]; end : wor_gen endgenerate endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба Вот другой пример. Можно ли там обойтись без generate? нет, ибо присвоение к цепи может быть длительным только. Что невозможно из процедурного кода, коим for является. ЗЫ. раньше были оговорки что можно, но их убрали Может быть, кто-то уже имеет точный критерий, когда он применяет generate, а когда просто Какой критерий тут нужен, если for процедурный код (в процессе/функции, работает с переменными), а generate объектный (на уровне процессов, инстансов, длительных присвоений). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба Какой критерий тут нужен, если for процедурный код (в процессе/функции, работает с переменными), а generate объектный (на уровне процессов, инстансов, длительных присвоений). вот и я именно это сюда говорил, но кажись не заметили, иначе не пойму об чём спор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба 2 CaPpuCcino & des00 Видел, что писали. Это понятно. Только это "вид сзади". Когда написано, все понятно. А когда только приступаешь к описанию, что выбирать? В-принципе, можно считать вопрос исчерпанным... Я лучше в стандарт залезу :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба нет, ибо присвоение к цепи может быть длительным только. Что невозможно из процедурного кода, коим for является. случайно войны звёздные не смотрел намедни ты, des00? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба случайно войны звёздные не смотрел намедни ты, des00? неа, но смотрел раз 25. работы много, мозг клинит вплоть до access violation, иногда пишу по инерциии, вот такие перлы и вылезают %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба "Влез" в стандарт SV1800-2009, в раздел 27. Generate constructs. В примере 1 написано: // "generate", "endgenerate" keywords are not required. Однако Quartus 9.1 такого не понимает, ошибки пишет. И хорошо! А то было бы еще "круче" - только благодаря genvar и именованным блокам begin - end можно было бы увидеть, что это генерация объектов. Чем ни чудо? А еще написано: Generate blocks in loop generate constructs can be named or unnamed Осталось только genvar убрать :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CaPpuCcino 0 8 октября, 2010 Опубликовано 8 октября, 2010 · Жалоба осталось только genvar убрать :) не genvar убирать не стоит, этот ключ показывает, что переменная явл. переменной времени компиляции. иначе могут произойти большие неприятности при симуляции. не именовать блоки, кажись, можно и раньше было (но Пресижн например не кушал без имени), однако без именования репликации на размноженные объекты нельзя ссылаться по иерархич. ссылки (т.е. откуда-л. вне блока репликации) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться