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

???

мой косяк, не туда посмотрел

нет возможности проверить 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 плиток :biggrin:

 

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


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

за 4 минуты сделал и проверил верилог версию

В ISE не синтезируется, моделирование дает неверный результат, разрядность длины надо увеличить до 4. Лучше сравнивать с нормальным выводом 4-разрядной длины 0,3..8.

 

 

"Белковый" синтезатор + ISE: 20 лут, 276МГц на 2х-уровневом конвейере(отчет синтезатора, grade-4), 7-разрядный выход. Без конвейера ISE никак не хочет укладывать 5-входовые таблицы в одноуровневую логику с использованием muxf5 :maniac:

 

RTL

post-9118-1291714391_thumb.png

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

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


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

В 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, посмотрим что ему не нравиться.

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


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

Хотел было я "сбацать" код попроще, с помощью 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

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


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

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 и тд и тп ?

 

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


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

А где 8'b00010111 и тд и тп ?

добавил и т.д. и т.п., и все равно абы что :(

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


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

На базе 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. Если сделать конвейер, тогда все Ок.

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


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

На базе 3-х 5-входовых таблиц:

28 плиток, местами 4 слоя логики :biggrin:

 

так что там с логом ISE ? подозреваю что он не понимает метки процессов.

post-3453-1291725838_thumb.png

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


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

так что там с логом 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.

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

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


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

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.

 

а Вы как количество лют определили ? Ноги подключали ?

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


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

Теперь синтезирует.

Ндя, если уж такая поддержка классического верилога в исе, нескоро там будет хоть что то из SV. Насчет ошибки сам виноват, код вставил до прогонки в симуляторе, хотя написал что код отлажен.

А если в 2х-уровневый конвейер положить - тогда пожалуйста, 11 лут и ~500МГц для Спартан-6.

дык итог то какой ? самодокументированное решение в лоб, на которое потрачено минимум времени, оказалось на копейки хуже по ресурсу и как минимум не хуже по производительности? :biggrin: И стоило ли этих копеек, время потраченное на их добывание? :biggrin: Красота простых решений спасет этот мир :biggrin:

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


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

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

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

 

и как минимум не хуже по производительности? :biggrin:

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

 

И стоило ли этих копеек, время потраченное на их добывание? :biggrin:

На оценку требуемых ресурсов и ожидаемого быстродействия у меня ушло ~5 минут, много времени ушло на проверку выводов - после требований "код в студию". Для меня эта задачка - просто как развлечение, в реальных проектах оптимизация узких мест "белковым" синтезатором дает очень заметный выйгрыш.

 

Красота простых решений спасет этот мир :biggrin:

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

И найденные решения - далеко не самые простые.

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


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

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

 

 

Для Спартана - хуже вдвое, выделив таблицы в отдельные модули, получил ~~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 машин. Вроде находили какое то упрощения, дабы сильно ускорить процесс.

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


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

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

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

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

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

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

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

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

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

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