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

Синтезируемый цикл с досрочным выходом по условию

Всем привет! Делаю один проект на Verilog и столкнулся с проблемой, связанной с необходимостью добавления цикла с выходом по условию. Но, как я понимаю, циклы while, repeat и forever несинтезируемы, а с конструкцией for-disable возникают какие-то проблемы.

Как правильно решить мою проблему? Можно ли использовать for-disable в данном случае?

 

Вот на всякий случай мой фрагмент кода, который не работает (крашится при моделировании). Мне, в общем, надо тут пускать через модуль A_neural входные числа до тех пор, пока они не останется только одно число > или пока они все не станут нулями. Короче говоря, нейронная сеть Хемминга

 

Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо!

 

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

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


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

Приветсвую!

 

...

Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо!

genvar j;
for(j=0;j<100; j=j+1)
begin: break
...
disable break 
end

Оххх :smile3046: ... что за.... 0,1,2,3 ...10 ... вдох :)

 

Для начала - можете посмотреть что значит в verilog ключевое слово break, и где оно обычно применяется :laughing:

Да и неприлично как то использовать ключевые слова для имен блоков - может это и злит симулятор?

Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования?

 

Удачи! Rob.

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


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

Цикл в программировании — это когда какие-то команды [процессора] повторяются одна за другой по кругу, т.е. в цикле.

В вашем случае, цикла не будет. Также не будет выхода по условию. Т.к. выходить некуда и не из чего. Имею в виду именно ваш контекст.

Необходимо поменять парадигму написания программы с Си на HDL.

Было бы неплохо представлять, как это можно сделать на элементарных цифровых блоках (триггерах, регистрах, компараторах и т.п.). Если можно это нарисовать на листке бумаги схематично, то дальше уже несложно переложить все на язык HDL.

 

 

Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования?

Так в названии же темы:)

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


Ссылка на сообщение
Поделиться на другие сайты
Оххх :smile3046: ... что за.... 0,1,2,3 ...10 ... вдох :)

 

Да, прощу прощения за такую сборную солянку. Я изучаю Verilog довольно короткое время, и на нем мне тянет писать так, как на плюсах.

 

Для начала - можете посмотреть что значит в verilog ключевое слово break, и где оно обычно применяется :laughing:

Да и неприлично как то использовать ключевые слова для имен блоков - может это и злит симулятор?

Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования?

Для синтеза.

Я только сейчас увидел, что прикрепил немного не тот код. Согласен, что там много чуши. Хотя наверняка еще больше чуши в коде ниже, хм

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

 

 

В вашем случае, цикла не будет. Также не будет выхода по условию. Т.к. выходить некуда и не из чего. Имею в виду именно ваш контекст.

 

Почему цикла не будет? Я же вызываю циклично экземпляры модуля нейрона А. Или Вы про внешний цикл? Да, я не понимаю, как его организовать

 

 

Необходимо поменять парадигму написания программы с Си на HDL.

Было бы неплохо представлять, как это можно сделать на элементарных цифровых блоках (триггерах, регистрах, компараторах и т.п.). Если можно это нарисовать на листке бумаги схематично, то дальше уже несложно переложить все на язык HDL.

 

Да, наверное, это самая большая проблема. Попробую исправиться в этом, хм. Спасибо за совет!

 

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


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

Приветствую!

Да, прощу прощения за такую сборную солянку. Я изучаю Verilog довольно короткое время, и на нем мне тянет писать так, как на плюсах.
Да без проблем так сказать застали врасплох :)

 

Для синтеза.

Я только сейчас увидел, что прикрепил немного не тот код. Согласен, что там много чуши. Хотя наверняка еще больше чуши в коде ниже, хм

genvar j;
begin : genrar;
for(j=0;j<100; j=j+1)
initial count = 0;
...

Если для синтеза то что тут делает initial ? это не синтезируемая кострукция.

 

Почему цикла не будет? Я же вызываю циклично экземпляры модуля нейрона А. Или Вы про внешний цикл? Да, я не понимаю, как его организовать

В приведенном коде Вы НЕ вызываете в цикле 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.

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


Ссылка на сообщение
Поделиться на другие сайты
Как правильно решить мою проблему?

Хотите расскажу как надо это делать?

По скайпу голосом...

 

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


Ссылка на сообщение
Поделиться на другие сайты
Всем привет! Делаю один проект на Verilog и столкнулся с проблемой, связанной с необходимостью добавления цикла с выходом по условию. Но, как я понимаю, циклы while, repeat и forever несинтезируемы, а с конструкцией for-disable возникают какие-то проблемы.

Как правильно решить мою проблему? Можно ли использовать for-disable в данном случае?

 

Вот на всякий случай мой фрагмент кода, который не работает (крашится при моделировании). Мне, в общем, надо тут пускать через модуль A_neural входные числа до тех пор, пока они не останется только одно число > или пока они все не станут нулями. Короче говоря, нейронная сеть Хемминга

 

Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо!

 

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) и решайте как быть дальше, выходить из так называемого цикла или же нет.

 

 

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация