|
|
|
Синтезируемый цикл с досрочным выходом по условию, Verilog |
|
|
|
May 18 2018, 21:42
|
Группа: Новичок
Сообщений: 4
Регистрация: 18-05-18
Пользователь №: 104 378
|
Всем привет! Делаю один проект на Verilog и столкнулся с проблемой, связанной с необходимостью добавления цикла с выходом по условию. Но, как я понимаю, циклы while, repeat и forever несинтезируемы, а с конструкцией for-disable возникают какие-то проблемы. Как правильно решить мою проблему? Можно ли использовать for-disable в данном случае? Вот на всякий случай мой фрагмент кода, который не работает (крашится при моделировании). Мне, в общем, надо тут пускать через модуль A_neural входные числа до тех пор, пока они не останется только одно число > или пока они все не станут нулями. Короче говоря, нейронная сеть Хемминга Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо! CODE genvar j; for(j=0;j<100; j=j+1) begin: break initial count = 0;
genvar k; for(k=0;k<100;k=k+1) begin A_neural a(zout[9*(k+1)-1:9*k], zout, uout[9*(k+1)-1:9*k]); always @* if(uout[9*k + : 9] == 0) count = count + 1; end always @* if(count >= 9) disable break;
end
|
|
|
|
|
May 18 2018, 22:23
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветсвую! Цитата(Eugene_eugene @ May 19 2018, 00:42) ... Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо! CODE genvar j; for(j=0;j<100; j=j+1) begin: break ... disable break end Оххх ... что за.... 0,1,2,3 ...10 ... вдох Для начала - можете посмотреть что значит в verilog ключевое слово break, и где оно обычно применяется Да и неприлично как то использовать ключевые слова для имен блоков - может это и злит симулятор? Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования? Удачи! Rob.
|
|
|
|
|
May 18 2018, 22:28
|
Профессионал
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942
|
Цикл в программировании — это когда какие-то команды [процессора] повторяются одна за другой по кругу, т.е. в цикле. В вашем случае, цикла не будет. Также не будет выхода по условию. Т.к. выходить некуда и не из чего. Имею в виду именно ваш контекст. Необходимо поменять парадигму написания программы с Си на HDL. Было бы неплохо представлять, как это можно сделать на элементарных цифровых блоках (триггерах, регистрах, компараторах и т.п.). Если можно это нарисовать на листке бумаги схематично, то дальше уже несложно переложить все на язык HDL. Цитата(RobFPGA @ May 19 2018, 01:23) Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования? Так в названии же темы
|
|
|
|
|
May 18 2018, 22:53
|
Группа: Новичок
Сообщений: 4
Регистрация: 18-05-18
Пользователь №: 104 378
|
Цитата(RobFPGA @ May 18 2018, 23:23) Оххх ... что за.... 0,1,2,3 ...10 ... вдох Да, прощу прощения за такую сборную солянку. Я изучаю Verilog довольно короткое время, и на нем мне тянет писать так, как на плюсах. Цитата(RobFPGA @ May 18 2018, 23:23) Для начала - можете посмотреть что значит в verilog ключевое слово break, и где оно обычно применяется Да и неприлично как то использовать ключевые слова для имен блоков - может это и злит симулятор? Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования? Для синтеза. Я только сейчас увидел, что прикрепил немного не тот код. Согласен, что там много чуши. Хотя наверняка еще больше чуши в коде ниже, хм CODE genvar j; begin : genrar; for(j=0;j<100; j=j+1)
initial count = 0;
genvar k; for(k=0;k<10;k=k+1) begin A_neural a(zout[9*k + : 9], zout, uout[9*k + : 9]); always @* if(uout[9*k + : 9] == 0) count = count + 1; end always @* if(count >= 9) disable genrar; assign zout = uout; end Цитата(x736C @ May 18 2018, 23:28) В вашем случае, цикла не будет. Также не будет выхода по условию. Т.к. выходить некуда и не из чего. Имею в виду именно ваш контекст. Почему цикла не будет? Я же вызываю циклично экземпляры модуля нейрона А. Или Вы про внешний цикл? Да, я не понимаю, как его организовать Цитата(x736C @ May 18 2018, 23:28) Необходимо поменять парадигму написания программы с Си на HDL. Было бы неплохо представлять, как это можно сделать на элементарных цифровых блоках (триггерах, регистрах, компараторах и т.п.). Если можно это нарисовать на листке бумаги схематично, то дальше уже несложно переложить все на язык HDL. Да, наверное, это самая большая проблема. Попробую исправиться в этом, хм. Спасибо за совет!
|
|
|
|
|
May 18 2018, 23:36
|
Профессионал
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643
|
Приветствую! Цитата(Eugene_eugene @ May 19 2018, 01:53) Да, прощу прощения за такую сборную солянку. Я изучаю Verilog довольно короткое время, и на нем мне тянет писать так, как на плюсах. Да без проблем так сказать застали врасплох Цитата(Eugene_eugene @ May 19 2018, 01:53) Для синтеза. Я только сейчас увидел, что прикрепил немного не тот код. Согласен, что там много чуши. Хотя наверняка еще больше чуши в коде ниже, хм CODE genvar j; begin : genrar; for(j=0;j<100; j=j+1) initial count = 0; ...
Если для синтеза то что тут делает initial ? это не синтезируемая кострукция. Цитата(Eugene_eugene @ May 19 2018, 01:53) Почему цикла не будет? Я же вызываю циклично экземпляры модуля нейрона А. Или Вы про внешний цикл? Да, я не понимаю, как его организовать В приведенном коде Вы НЕ вызываете в цикле 1000 раз функцию A_neural - Вы синтезируете 1000 отдельных блоков A_neural ! Это то что Вы хотели? При этом связи между этими блоками задаются жестко на этапе синтеза и в процесе работы не меняются. Break цикла при синтезе возможен но при определенных условиях. Но уж точно нельзя менять число синтезированных модулей в зависимости от значения данных которые эти модули обрабатывают. Аналогом вызова функции можно грубо представить один модуль на вход которого коммутируются данные по очереди. Для начала попробуйте синтезировать код попроще - типа счетчика или сумматоров. Так как в реальном железе обычно состояние системы меняется не мгновенно - а за конечное время, по тактам. Поэтому такой код Код always @* if(uout[9*k + : 9] == 0) count = count + 1; // с точки зрения синтеза невозможен. // надо бы хотябы так always @(posedge clk) begin if (uout[9*k + : 9] == 0) count <= count + 1; end Удачи! Rob.
|
|
|
|
|
May 19 2018, 09:51
|
Участник
Группа: Участник
Сообщений: 16
Регистрация: 30-11-17
Пользователь №: 100 439
|
Цитата(Eugene_eugene @ May 18 2018, 21:42) Всем привет! Делаю один проект на Verilog и столкнулся с проблемой, связанной с необходимостью добавления цикла с выходом по условию. Но, как я понимаю, циклы while, repeat и forever несинтезируемы, а с конструкцией for-disable возникают какие-то проблемы. Как правильно решить мою проблему? Можно ли использовать for-disable в данном случае? Вот на всякий случай мой фрагмент кода, который не работает (крашится при моделировании). Мне, в общем, надо тут пускать через модуль A_neural входные числа до тех пор, пока они не останется только одно число > или пока они все не станут нулями. Короче говоря, нейронная сеть Хемминга Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо! CODE genvar j; for(j=0;j<100; j=j+1) begin: break initial count = 0;
genvar k; for(k=0;k<100;k=k+1) begin A_neural a(zout[9*(k+1)-1:9*k], zout, uout[9*(k+1)-1:9*k]); always @* if(uout[9*k + : 9] == 0) count = count + 1; end always @* if(count >= 9) disable break;
end Сделайте привязку к частоте clk, на каждом такте оценивайте текущее состояние "системы" (например с помощью if ... else) и решайте как быть дальше, выходить из так называемого цикла или же нет.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|