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

Правда, это никак не проясняет "чудо 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

 

 

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


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

А чудес не бывает. Что влоб, что по лбу.

В этом и заключался мой вопрос:)

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


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

Вот скажем - что нужно добавить к моему коду, чтобы for уже не "прокатывал"?

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

сделайте элементом массива структуру и тогда если вы в разных генереётах будете обращаться к разным типам полей, то синтезатор скажет, что это ошибка, т.к. вы присваиваете в разных процессах одному и тому же агригату данных, хотя формально вы одному и тому же элементу не присваиваете, т.е. проблемы разрешения драйверов не появляется.

а вообще я не понимаю о чём именно речь. вы хотите узнать всегда ли можно одну конструкцию заменить на другую без изменения функциональности? если так, то нет, конструкции эти не эквивалентны (я пару раз попадался и долго понять не мог почему ж компилятор ругается, потом оказывалось, что формально компиллер был прав)

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


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

вы хотите узнать всегда ли можно одну конструкцию заменить на другую без изменения функциональности? если так, то нет, конструкции эти не эквивалентны

Я понимаю, что "нет". Для того они обе и существуют.

Вот другой пример. Можно ли там обойтись без 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

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


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

Вот другой пример. Можно ли там обойтись без generate?

нет, ибо присвоение к цепи может быть длительным только. Что невозможно из процедурного кода, коим for является.

 

ЗЫ. раньше были оговорки что можно, но их убрали

 

Может быть, кто-то уже имеет точный критерий, когда он применяет generate, а когда просто

Какой критерий тут нужен, если for процедурный код (в процессе/функции, работает с переменными), а generate объектный (на уровне процессов, инстансов, длительных присвоений).

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


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

Какой критерий тут нужен, если for процедурный код (в процессе/функции, работает с переменными), а generate объектный (на уровне процессов, инстансов, длительных присвоений).

вот и я именно это сюда говорил, но кажись не заметили, иначе не пойму об чём спор

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


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

2 CaPpuCcino & des00

 

Видел, что писали. Это понятно. Только это "вид сзади". Когда написано, все понятно. А когда только приступаешь к описанию, что выбирать?

В-принципе, можно считать вопрос исчерпанным... Я лучше в стандарт залезу :)

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


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

нет, ибо присвоение к цепи может быть длительным только. Что невозможно из процедурного кода, коим for является.

случайно войны звёздные не смотрел намедни ты, des00?

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


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

случайно войны звёздные не смотрел намедни ты, des00?

неа, но смотрел раз 25. работы много, мозг клинит вплоть до access violation, иногда пишу по инерциии, вот такие перлы и вылезают %)

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


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

"Влез" в стандарт 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 убрать :)

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


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

осталось только genvar убрать :)

не genvar убирать не стоит, этот ключ показывает, что переменная явл. переменной времени компиляции. иначе могут произойти большие неприятности при симуляции.

не именовать блоки, кажись, можно и раньше было (но Пресижн например не кушал без имени), однако без именования репликации на размноженные объекты нельзя ссылаться по иерархич. ссылки (т.е. откуда-л. вне блока репликации)

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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