des00 25 8 декабря, 2010 Опубликовано 8 декабря, 2010 · Жалоба -Только после попыток догнать результат "белкового" синтезатора, первоначальное было в разы хуже, и осталось бы таким, если не с чем было сравнивать. пад стулом, шикарно вы без меня, меня женили. вы изначально сделали вариант по ТЗ, от которого начали отталкиваться, я изначально сделал много более функциональный вариант, который потом обрезал. И как это можно назвать корректным сравнением? Для Спартана - хуже вдвое, выделив таблицы в отдельные модули, получил ~~2 уровня по быстродействию (без конвейера). т.е. мой вариант занял 4 слоя логики на спартане? Что оптимизатор ISE настолько глуп, что 5 лютов, которые ква укладывает в 3 слоя, он может уложить только в 4? Не верю. В ваших попугаях это будет в 1.5 раза. Но в попугаях временного анализа это будет задержка на люте в слайсе. Что для спартана 3 составляет меньше 1нс, с учетом того, что все это будет в одном слайсе, ваши рассуждения о заметном выигрыше, потраченном времени и его количестве не более чем понты. Имхо, на Верилоге/SV/и тп языках - в принципе не может быть красивых решений. И найденные решения - далеко не самые простые. вы гуру, вам виднее, полагаю что каждый из форумчан сделал свои выводы по теме. довольно большого размера и зубодробительной отладки. Вот подумал, может есть какие то методологические приемы, дабы ету рутинную работу упростить и ускорить ? если КА содержит больше 10 состояний, то уже имеет смысл оценить его декомпозицию. Если больше 16 ти, то имеет смысл рассмотреть использование МПА. Ну и писать все сплошной кашей, без комментариев ИМХО не айс. Помнится кажется как раз уважаемый des публиковал компилятор ассемблер - hdl, и еще ктото говорил чтото по поводу больших state машин. Вроде находили какое то упрощения, дабы сильно ускорить процесс. у меня автоматы несколько другие (в частности нет простой поддержки функциональных переходов вида cnt > X) , то что я делал не сильно подойдет вам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 8 декабря, 2010 Опубликовано 8 декабря, 2010 · Жалоба я изначально сделал много более функциональный вариант, который потом обрезал Докажите это расширением, например, на 32х-разрядное входное слово. Тогда я, может быть, и начну замечать "красоту простых решений" на Верилоге/SV/и тп. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 декабря, 2010 Опубликовано 8 декабря, 2010 · Жалоба Докажите это расширением, например, на 32х-разрядное входное слово. Тогда я, может быть, и начну замечать "красоту простых решений" на Верилоге/SV/и тп. Выкладывайте ваш код, для использования его как референсного. Будет время сделаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 декабря, 2010 Опубликовано 8 декабря, 2010 · Жалоба Где-то я "накосячил"... Маху дал - надо было в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 8 декабря, 2010 Опубликовано 8 декабря, 2010 (изменено) · Жалоба Вот - работающий код. ... Может, и не оптимальный, зато простой. Именно. По этому коду можно сразу понять, что он делает - даже не зная исходной задачи - не нужно вникать в алгоритм, выявлять тайный смысл длинных имен, и тд и тп. Выкладывайте ваш код А его нет, есть лишь оценка "на промокашке" (те без гарантий) ~~ 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 уровней. Изменено 8 декабря, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 декабря, 2010 Опубликовано 8 декабря, 2010 · Жалоба Именно. По этому коду можно сразу понять, что он делает - даже не зная исходной задачи - не нужно вникать в алгоритм, выявлять тайный смысл длинных имен, и тд и тп. когда заканчиваются аргументы, спор переходи на нравится не нравится. А его нет, есть лишь оценка "на промокашке" (те без гарантий) ~~ 300 лут, 12 уровней для 32х-разрядного входного слова. тогда наш с вами разговор бесполезен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 8 декабря, 2010 Опубликовано 8 декабря, 2010 (изменено) · Жалоба когда заканчиваются аргументы, спор переходи на нравится не нравится А где я говорил, нравится/не нравится? Я просто высказал личное мнение, что из _приведенных_ кодов самым простым считаю код ViKo. Самым универсальным - код Sergey'F, тк не содержит явных ограничений на разрядность входного слова. А твой код не считаю универсальным, тк содержит в явном виде полный перебор всех входных воздействий. Про мой и говорить нечего, он только для проверки ручной оптимизации. тогда наш с вами разговор бесполезен Я уже дважды доказывал справедливость своих выводов "на промокашке". Могу и этот проверить - что изменится? Изменено 8 декабря, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 8 декабря, 2010 Опубликовано 8 декабря, 2010 · Жалоба А твой код не считаю универсальным, тк содержит в явном виде полный перебор всех входных воздействий. Даааа, сверх сложно ввести параметр и в циклах и разрядностях поставить вместо 3, 8 и 2**8, clogb(N)-1, N и 2**N. Это сверх тяжелый труд, такой же как портирование SV кода в верилог Я уже дважды доказывал справедливость своих выводов "на промокашке". Могу и этот проверить - что изменится? у меня будет ваш код, который будет использован как референсная модель. Да и промокашки у нас разные, у вас исе у меня квартус. Как я понимаю желание ставить ква у вас нет, так же как и у меня желание ставить исе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 8 декабря, 2010 Опубликовано 8 декабря, 2010 (изменено) · Жалоба Параметр ввести не сложно, но что делать с циклом от 0 до 1<<32-1 ? Если я приведу свой код - это будет не поведенческий, а "схемный" код, те схема, описанная на Верилоге. И утверждаю, что в большинстве случаев (нетривиальных) существующий софт не в состоянии получить сколь-либо оптимальную схему из поведенческого описания. Как, например, из поведенческого описания поиска "за такт" 0...00 в 32х-разрядном(и более) слове. И предлагаю привести мне пример поведенческого описания этой задачи, дающее приемлемый синтез в Квартусе или ISE. "Схемным" кодом называю такое описание алгоритма, из которого явно следует оптимальное схемное решение. В качестве референсного поведенческого кода предлагаю взять код Sergey'F, и расширить разрядность входного слова до 31 (чтобы не заморачиваться с лишним разрядом счетчика длины). ISE дает > 600 лут, > 100 уровней логики. И какой не "белковый" оптимизатор сможет помочь в этом случае? Изменено 8 декабря, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 9 декабря, 2010 Опубликовано 9 декабря, 2010 · Жалоба Проверил на всякий случай/для тренировки, 350 лут, ~14 уровней по быстродействию (~50МГц для медленной версии спартана3). Метод быстрой оценки "на промокашке" (те без написания какого-либо кода) - и в этот раз не подкачал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 16 декабря, 2010 Опубликовано 16 декабря, 2010 · Жалоба :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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться