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

-Только после попыток догнать результат "белкового" синтезатора, первоначальное было в разы хуже, и осталось бы таким, если не с чем было сравнивать.

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

 

Для Спартана - хуже вдвое, выделив таблицы в отдельные модули, получил ~~2 уровня по быстродействию (без конвейера).

т.е. мой вариант занял 4 слоя логики на спартане? Что оптимизатор ISE настолько глуп, что 5 лютов, которые ква укладывает в 3 слоя, он может уложить только в 4? Не верю.

В ваших попугаях это будет в 1.5 раза. Но в попугаях временного анализа это будет задержка на люте в слайсе. Что для спартана 3 составляет меньше 1нс, с учетом того, что все это будет в одном слайсе, ваши рассуждения о заметном выигрыше, потраченном времени и его количестве не более чем понты.

 

Имхо, на Верилоге/SV/и тп языках - в принципе не может быть красивых решений. И найденные решения - далеко не самые простые.

вы гуру, вам виднее, полагаю что каждый из форумчан сделал свои выводы по теме.

 

 

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

если КА содержит больше 10 состояний, то уже имеет смысл оценить его декомпозицию. Если больше 16 ти, то имеет смысл рассмотреть использование МПА. Ну и писать все сплошной кашей, без комментариев ИМХО не айс.

 

Помнится кажется как раз уважаемый des публиковал компилятор ассемблер - hdl, и еще ктото говорил чтото по поводу больших state машин. Вроде находили какое то упрощения, дабы сильно ускорить процесс.

у меня автоматы несколько другие (в частности нет простой поддержки функциональных переходов вида cnt > X) , то что я делал не сильно подойдет вам.

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


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

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

Докажите это расширением, например, на 32х-разрядное входное слово.

 

Тогда я, может быть, и начну замечать "красоту простых решений" на Верилоге/SV/и тп.

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


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

Докажите это расширением, например, на 32х-разрядное входное слово. Тогда я, может быть, и начну замечать "красоту простых решений" на Верилоге/SV/и тп.

Выкладывайте ваш код, для использования его как референсного. Будет время сделаю.

 

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


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

Где-то я "накосячил"...

Маху дал - надо было в Waveform окне Quartus для отображения переменных задать MSB on Top, LSB on Bottom. А было наоборот (по-умолчанию, похоже). Оттого и рисовалось что-то ужасное.

Вот - работающий код. 36 LE для Cyclone III. Может, и не оптимальный, зато простой.

module exsZeros (
  input wire [7:0] data,
  output bit [2:0] pos,
  output bit [3:0] size
);
  always_comb begin
    priority casex (data)
    8'b00000000:  begin pos = 0; size = 8; end
    8'b10000000:  begin pos = 0; size = 7; end
    8'b00000001:  begin pos = 1; size = 7; end
    8'bx1000000:  begin pos = 0; size = 6; end
    8'b10000001:  begin pos = 1; size = 6; end
    8'b0000001x:  begin pos = 2; size = 6; end
    8'bxx100000:  begin pos = 0; size = 5; end
    8'bx1000001:  begin pos = 1; size = 5; end
    8'b1000001x:  begin pos = 2; size = 5; end
    8'b000001xx:  begin pos = 3; size = 5; end
    8'bxxx10000:  begin pos = 0; size = 4; end
    8'bxx100001:  begin pos = 1; size = 4; end
    8'bx100001x:  begin pos = 2; size = 4; end
    8'b100001xx:  begin pos = 3; size = 4; end
    8'b00001xxx:  begin pos = 4; size = 4; end
    8'bxxxx1000:  begin pos = 0; size = 3; end
    8'bxxx10001:  begin pos = 1; size = 3; end
    8'bxx10001x:  begin pos = 2; size = 3; end
    8'bx10001xx:  begin pos = 3; size = 3; end
    8'b10001xxx:  begin pos = 4; size = 3; end
    8'b0001xxxx:  begin pos = 5; size = 3; end
    default:      begin pos = 0; size = 0; end
    endcase
  end
endmodule

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


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

Вот - работающий код. ... Может, и не оптимальный, зато простой.

Именно. По этому коду можно сразу понять, что он делает - даже не зная исходной задачи - не нужно вникать в алгоритм, выявлять тайный смысл длинных имен, и тд и тп.

 

Выкладывайте ваш код

А его нет, есть лишь оценка "на промокашке" (те без гарантий) ~~ 300 лут, 12 уровней для 32х-разрядного входного слова.

 

Вот это вроде работает. Знаю, что не оптимально, но просто для порядка.

module testcnt
(
input [7:0] data,
output [2:0] pos,
output [3:0] cnt,
output valid
);

reg [2:0] lastmax;
reg [2:0] lastcnt;
reg [2:0] curmax;
reg [2:0] curcnt;
reg found;

wire [9:0] extdata = {1'b1,data,1'b1};

integer i;
always @(*)
begin
lastmax=0;
lastcnt=0;
curmax=0;
curcnt=0;
found = 0;
for (i=0; i<7; i=i+1)
begin
	case (extdata[i+:4])
	4'b0000: begin
		curcnt=curcnt+1;
	end
	4'b0001: begin
		curmax=i;
		curcnt=0;
	end
	4'b1000: begin
		if (curcnt>=lastcnt)
		begin
			lastmax=curmax;
			lastcnt=curcnt;
			found=1;
		end
	end
	endcase
end	
end

assign pos = lastmax;
assign cnt = lastcnt+2'b11;
assign valid = found;

endmodule

~300 лут уже для 14-разрядного слова, и ~35 уровней.

Изменено пользователем Leka

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


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

Именно. По этому коду можно сразу понять, что он делает - даже не зная исходной задачи - не нужно вникать в алгоритм, выявлять тайный смысл длинных имен, и тд и тп.

когда заканчиваются аргументы, спор переходи на нравится не нравится.

А его нет, есть лишь оценка "на промокашке" (те без гарантий) ~~ 300 лут, 12 уровней для 32х-разрядного входного слова.

тогда наш с вами разговор бесполезен

 

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


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

когда заканчиваются аргументы, спор переходи на нравится не нравится

А где я говорил, нравится/не нравится? Я просто высказал личное мнение, что из _приведенных_ кодов самым простым считаю код ViKo. Самым универсальным - код Sergey'F, тк не содержит явных ограничений на разрядность входного слова. А твой код не считаю универсальным, тк содержит в явном виде полный перебор всех входных воздействий. Про мой и говорить нечего, он только для проверки ручной оптимизации.

 

тогда наш с вами разговор бесполезен

Я уже дважды доказывал справедливость своих выводов "на промокашке". Могу и этот проверить - что изменится?

Изменено пользователем Leka

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


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

А твой код не считаю универсальным, тк содержит в явном виде полный перебор всех входных воздействий.

Даааа, сверх сложно ввести параметр и в циклах и разрядностях поставить вместо 3, 8 и 2**8, clogb(N)-1, N и 2**N. Это сверх тяжелый труд, такой же как портирование SV кода в верилог :biggrin:

Я уже дважды доказывал справедливость своих выводов "на промокашке". Могу и этот проверить - что изменится?

у меня будет ваш код, который будет использован как референсная модель. Да и промокашки у нас разные, у вас исе у меня квартус. Как я понимаю желание ставить ква у вас нет, так же как и у меня желание ставить исе.

 

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


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

Параметр ввести не сложно, но что делать с циклом от 0 до 1<<32-1 ?

 

Если я приведу свой код - это будет не поведенческий, а "схемный" код, те схема, описанная на Верилоге. И утверждаю, что в большинстве случаев (нетривиальных) существующий софт не в состоянии получить сколь-либо оптимальную схему из поведенческого описания. Как, например, из поведенческого описания поиска "за такт" 0...00 в 32х-разрядном(и более) слове. И предлагаю привести мне пример поведенческого описания этой задачи, дающее приемлемый синтез в Квартусе или ISE.

 

"Схемным" кодом называю такое описание алгоритма, из которого явно следует оптимальное схемное решение.

 

В качестве референсного поведенческого кода предлагаю взять код Sergey'F, и расширить разрядность входного слова до 31 (чтобы не заморачиваться с лишним разрядом счетчика длины). ISE дает > 600 лут, > 100 уровней логики. И какой не "белковый" оптимизатор сможет помочь в этом случае?

Изменено пользователем Leka

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


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

Проверил на всякий случай/для тренировки, 350 лут, ~14 уровней по быстродействию (~50МГц для медленной версии спартана3). Метод быстрой оценки "на промокашке" (те без написания какого-либо кода) - и в этот раз не подкачал. :biggrin:

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


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

:bb-offtopic: Немного заинтересовал вопрос оптимального синтеза на базе 4/6-входовых таблиц - хотел разобраться, какие алгоритмы существуют... :smile3046:

Очередной пример неоптимального синтеза софтом(должно быть 5 лут и 2 уровня):

module tst(
  output reg q,
  input [12:0] d
);
always@* begin
  q <= 0;
  if(d == 0) q <= 1;
  if(d == ~13'b0) q <= 1;
end
endmodule

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


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

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

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

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

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

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

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

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

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

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