des00 25 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба ??? мой косяк, не туда посмотрел нет возможности проверить SV код c ISE. и куда же я ето: typedef struct packed((( присуну в своих хилых и synplify ? А Вы говорите ошибку не приметил.... вы меня удивляете, за 4 минуты сделал и проверил верилог версию. не так красиво конечно как на SV, но все же module zerosv (input wire [7 : 0] idat, output wire [2 : 0] bitptr, bitlength); reg [5 : 0] ROM [0 : 255]; assign {bitptr, bitlength} = ROM[idat]; integer i; integer data; // integer zero_bit_ptr; integer zero_bit_length [0 : 7]; // integer max_bit_ptr; integer max_bit_length; `ifdef MODEL_TECH initial begin : generate_table `else always @(*) begin : generate_table `endif for (data = 0; data < 256; data = data + 1) begin zero_bit_ptr = 0; for (i = 0; i < 8; i = i + 1) zero_bit_length[i] = 0; // create zero bit mask for (i = 0; i < 8; i = i + 1) begin if (data[i] == 1'b0) zero_bit_length[zero_bit_ptr] = zero_bit_length[zero_bit_ptr] + 1; else zero_bit_ptr = i + 1; // see next is start ? end // detect which is better max_bit_length = 0; max_bit_ptr = 0; for (zero_bit_ptr = 0; zero_bit_ptr < 8; zero_bit_ptr = zero_bit_ptr + 1) begin if (zero_bit_length[zero_bit_ptr] > max_bit_length) begin max_bit_length = zero_bit_length[zero_bit_ptr]; max_bit_ptr = zero_bit_ptr; end end // 3 bit mask if (max_bit_length < 3) begin max_bit_length = 0; max_bit_ptr = 0; end else begin max_bit_length = max_bit_length + 1; end // write to rom ROM[data] = {max_bit_ptr[2 : 0], max_bit_length[2 : 0]}; end end endmodule те же 29 плиток Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 (изменено) · Жалоба за 4 минуты сделал и проверил верилог версию В ISE не синтезируется, моделирование дает неверный результат, разрядность длины надо увеличить до 4. Лучше сравнивать с нормальным выводом 4-разрядной длины 0,3..8. "Белковый" синтезатор + ISE: 20 лут, 276МГц на 2х-уровневом конвейере(отчет синтезатора, grade-4), 7-разрядный выход. Без конвейера ISE никак не хочет укладывать 5-входовые таблицы в одноуровневую логику с использованием muxf5 :maniac: RTL Изменено 7 декабря, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба В ISE не синтезируется, моделирование дает неверный результат, разрядность длины надо увеличить до 4. Лучше сравнивать с нормальным выводом 4-разрядной длины 0,3..8. ваш тест в студию, функциональность блоков zero, zerov проверена вот таким тестом module tb; logic [7 : 0] idat; logic [2 : 0] bitptr; logic [2 : 0] bitlength; logic [2 : 0] bitptr1; logic [2 : 0] bitlength1; logic [2 : 0] bitptr2; logic [2 : 0] bitlength2; zeros zeros (idat, bitptr, bitlength); zerosv zeros1 (idat, bitptr1, bitlength1); tst tst (idat, bitptr2, bitlength2); initial begin int ibitlength2; idat = 0; #1ns; for (int i = 0; i <= 255; i++) begin idat = i; #1ns; $display("bit vector %8b == ptr = %0d, length = %0d", idat, bitptr, (bitlength != 0) ? (bitlength + 1) : 0 ); // assert (bitptr == bitptr1) else begin $error("pointer1 error"); $stop; end assert (bitlength == bitlength1) else begin $error("length1 error "); $stop; end // assert (bitptr == bitptr2) else begin $error("pointer2 error"); $stop; end ibitlength2 = (bitlength2 == 0) ? 0 : (bitlength2 + 1); assert (bitlength == ibitlength2) else begin $error("length2 error "); $stop; end end $stop; end endmodule ошибок нет, хочу отметить что сравнивается с вашим модулем. zerov это чистый верилог 2001, все по стандарту. Выкладывайте лог ISE, посмотрим что ему не нравиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба Хотел было я "сбацать" код попроще, с помощью case. И получил для Cyclone III те же 29 ЛЭ. Но при симуляции в Quartus получаю бред. Где-то я "накосячил". А где, не пойму. Я уже и порядок строк поменял, и размерности с форматом добавил к выходным данным. Что-то в case не так... module exsZeros ( input wire [7:0] data, output logic [2:0] pos, output logic [3:0] size ); always_comb begin casex (data) 8'b00011111: begin pos = 3'd5; size = 4'd3; end 8'b00001111: begin pos = 3'd4; size = 4'd4; end 8'b10001111: begin pos = 3'd4; size = 4'd3; end 8'b00000111: begin pos = 3'd3; size = 4'd5; end 8'b10000111: begin pos = 3'd3; size = 4'd4; end 8'bx1000111: begin pos = 3'd3; size = 4'd3; end 8'b00000011: begin pos = 3'd2; size = 4'd6; end 8'b10000011: begin pos = 3'd2; size = 4'd5; end 8'bx1000011: begin pos = 3'd2; size = 4'd4; end 8'bxx100011: begin pos = 3'd2; size = 4'd3; end 8'b00000001: begin pos = 3'd1; size = 4'd7; end 8'b10000001: begin pos = 3'd1; size = 4'd6; end 8'bx1000001: begin pos = 3'd1; size = 4'd5; end 8'bxx100001: begin pos = 3'd1; size = 4'd4; end 8'bxxx10001: begin pos = 3'd1; size = 4'd3; end 8'b00000000: begin pos = 3'd0; size = 4'd8; end 8'b10000000: begin pos = 3'd0; size = 4'd7; end 8'bx1000000: begin pos = 3'd0; size = 4'd6; end 8'bxx100000: begin pos = 3'd0; size = 4'd5; end 8'bxxx10000: begin pos = 3'd0; size = 4'd4; end 8'bxxxx1000: begin pos = 3'd0; size = 4'd3; end default: begin pos = 3'd0; size = 4'd0; end endcase end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба data=00000000 pos=0 cnt=1 data=00000001 pos=1 cnt=0 ??? data=00000010 pos=2 cnt=7 data=00000011 pos=2 cnt=7 data=00000100 pos=3 cnt=6 ... data=11111111 pos=0 cnt=0 У меня сейчас так: data=00000000 pos=0 cnt= 8 data=00000001 pos=1 cnt= 7 data=00000010 pos=2 cnt= 6 data=00000011 pos=2 cnt= 6 data=00000100 pos=3 cnt= 5 ... data=11111111 pos=0 cnt= 0 Что-то в case не так... 8'b00011111: begin pos = 3'd5; size = 4'd3; end А где 8'b00010111 и тд и тп ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба А где 8'b00010111 и тд и тп ? добавил и т.д. и т.п., и все равно абы что :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба На базе 3-х 5-входовых таблиц: module tst(input[7:0] data, output[2:0] pos, output[3:0] cnt); localparam[127:0] alo=128'h00000002000000130000000200001123; localparam[127:0] ahi=128'h00010002000100630001000200017754; localparam[127:0] apos=128'h00150004040401230123012301200010; localparam[127:0] acnt=128'h43330303040487657654654354304330; wire[7:0] a0,a1,a; assign a0=data[4:0]; assign a1=data[7:3]; assign a={ahi[a1<<2+:3],alo[a0<<2+:2]}; assign pos=apos[a<<2+:3]; assign cnt=acnt[a<<2+:4]; endmodule ISE синтезирует неоптимально, без использования muxf5. Если сделать конвейер, тогда все Ок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба На базе 3-х 5-входовых таблиц: 28 плиток, местами 4 слоя логики так что там с логом ISE ? подозреваю что он не понимает метки процессов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 (изменено) · Жалоба так что там с логом ISE ? ISE не нравится: 1) integer zero_bit_length [0 : 7] - поменял на reg signed [31:0] zero_bit_length [0 : 7] 2) always @(*) - выкинул @(*) Ошибка в логике: 3) max_bit_length = max_bit_length + 1 - поменял на max_bit_length = max_bit_length - 1 Теперь синтезирует. Непонятно, почему даже для Спартан-6, в котором 6-входовые луты, ISE не кладет 5-входовую таблицу в один уровень логики... А если в 2х-уровневый конвейер положить - тогда пожалуйста, 11 лут и ~500МГц для Спартан-6. Изменено 7 декабря, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a123-flex 0 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба ISE не нравится: 1) integer zero_bit_length [0 : 7] - поменял на reg signed [31:0] zero_bit_length [0 : 7] 2) always @(*) - выкинул @(*) Ошибка в логике: 3) max_bit_length = max_bit_length + 1 - поменял на max_bit_length = max_bit_length - 1 Теперь синтезирует. Непонятно, почему даже для Спартан-6, в котором 6-входовые луты, ISE не кладет 5-входовую таблицу в один уровень логики... А если в 2х-уровневый конвейер положить - тогда пожалуйста, 11 лут и ~500МГц для Спартан-6. а Вы как количество лют определили ? Ноги подключали ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба По отчету синтезатора, без P&R. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба Теперь синтезирует. Ндя, если уж такая поддержка классического верилога в исе, нескоро там будет хоть что то из SV. Насчет ошибки сам виноват, код вставил до прогонки в симуляторе, хотя написал что код отлажен. А если в 2х-уровневый конвейер положить - тогда пожалуйста, 11 лут и ~500МГц для Спартан-6. дык итог то какой ? самодокументированное решение в лоб, на которое потрачено минимум времени, оказалось на копейки хуже по ресурсу и как минимум не хуже по производительности? И стоило ли этих копеек, время потраченное на их добывание? Красота простых решений спасет этот мир Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба дык итог то какой ? самодокументированное решение в лоб, на которое потрачено минимум времени, оказалось на копейки хуже по ресурсу -Только после попыток догнать результат "белкового" синтезатора, первоначальное было в разы хуже, и осталось бы таким, если не с чем было сравнивать. и как минимум не хуже по производительности? Для Спартана - хуже вдвое, выделив таблицы в отдельные модули, получил ~~2 уровня по быстродействию (без конвейера). И стоило ли этих копеек, время потраченное на их добывание? На оценку требуемых ресурсов и ожидаемого быстродействия у меня ушло ~5 минут, много времени ушло на проверку выводов - после требований "код в студию". Для меня эта задачка - просто как развлечение, в реальных проектах оптимизация узких мест "белковым" синтезатором дает очень заметный выйгрыш. Красота простых решений спасет этот мир Имхо, на Верилоге/SV/и тп языках - в принципе не может быть красивых решений. И найденные решения - далеко не самые простые. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a123-flex 0 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба -Только после попыток догнать результат "белкового" синтезатора, первоначальное было в разы хуже, и осталось бы таким, если не с чем было сравнивать. Для Спартана - хуже вдвое, выделив таблицы в отдельные модули, получил ~~2 уровня по быстродействию (без конвейера). На оценку требуемых ресурсов и ожидаемого быстродействия у меня ушло ~5 минут, много времени ушло на проверку выводов - после требований "код в студию". Для меня эта задачка - просто как развлечение, в реальных проектах оптимизация узких мест "белковым" синтезатором дает очень заметный выйгрыш. Имхо, на Верилоге/SV/и тп языках - в принципе не может быть красивых решений. И найденные решения - далеко не самые простые. мущщины, не спорьте, каждый получил по моему прекрасный результат. мегареспект Вам за Ваши труды... результат прекрасный, мне помогли, и всем интересующимся прекрасный урок. подумал, может безо всяких примеров, а просто текстом, проконсультируете по поводу стратегии глобальной. Большое время я потратил на разработку системы транслирования, разделения, соединения итп больших потоков данных. В процессе получаются примерно такого вида исходники: LoadPHeadToMemoSt :// 2 begin if (iWasRead && !iWCntr && FifoInDataRdFrom[15:8] != cFarBPream) iHeadErr <= 1; if (iFifoInRdEn && !FifoInEmpty) iMainDataCntr <= iMainDataCntr + 1; if (iExtResGen) iExtResGen <= 0; if (iFifoInRdEn) iWasRead <= 1; iFifoInEmptyD <= FifoInEmpty; iFifoInRdEnD <= iFifoInRdEn; iWCntrD <= iWCntr; if (iFifoInRdEn && !FifoInEmpty) iDBigTrnsfrCntr <= iDBigTrnsfrCntr-1; if (!FifoInEmpty) begin if (iWCntr < 6) iFifoInRdEn <= 1; else begin if (iWCntr == 5 && !iFifoInRdEn) iFifoInRdEn <= 1; else iFifoInRdEn <= 0; end end else iFifoInRdEn <= 0; довольно большого размера и зубодробительной отладки. Вот подумал, может есть какие то методологические приемы, дабы ету рутинную работу упростить и ускорить ? Помнится кажется как раз уважаемый des публиковал компилятор ассемблер - hdl, и еще ктото говорил чтото по поводу больших state машин. Вроде находили какое то упрощения, дабы сильно ускорить процесс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 7 декабря, 2010 Опубликовано 7 декабря, 2010 · Жалоба :bb-offtopic: Рекорды по максимальной разрядности входного слова будем ставить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться