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

Профессия RTL Designer не имеет будущего?

и на синтезируемом Верилоге, 1 такт/разряд (32 разряда - 33 такта), ~150 ЛУТ:

а мне так читать проще

module div32 #(parameter int pW = 32 )(
  output logic [pW-1:0] qs, rs,
  input  logic [pW-1:0] n, d,
  input  logic clk, ena
);

  // synthesis
  bit [4 : 0] cnt;
  bit         cnt_eq31;
  bit         cnt_eq0;
  bit         cnt_eq0_reg;

  int res;      // result
  int p;        // partial result
  bit decb;     // decision bit
  int d_reg;    // align reg

  assign cnt_eq31 = &cnt;
  assign cnt_eq0  = &(~cnt);

  always_ff @(posedge clk) begin
    if (~ena)
      cnt <= 31;
    else
      cnt <= cnt - 1'b1;

    if (cnt_eq31)
      {res[cnt], decb, p} <= div32_step(n[cnt], 1'b0, 32'd0);
    else
      {res[cnt], decb, p} <= div32_step(n[cnt], decb, p);

    // align delays
    cnt_eq0_reg <= cnt_eq0;
    d_reg       <= d;

    // correct result
    if (cnt_eq0_reg) begin
      qs <= res;
      rs <= decb ? (p + d_reg) : p;
    end
  end

  function bit [33 : 0] div32_step(input bit divb, decb, input int p);
    bit r_decb;
    int r_p;
  begin
    {r_decb, r_p} = decb ? {p, divb} + d : {p, divb} - d;
    return {~r_decb, r_decb, r_p};
  end
  endfunction

endmodule

240/167, но это 32 такта на одно деление. если сделать 33 такта и изменить адресацию данных, тогда можно поджаться по ресурсу где то до вашего уровня %)

 

UPD. ну вот, так оно и есть

 

module div_seq_shift #(parameter int pW = 32 )(
  output logic [pW-1:0] q, r,
  output logic oval,
  input  logic [pW-1:0] n, d,
  input  logic clk, ival
);

  // synthesis indexing adressing mode
  bit [5 : 0] cnt;
  bit         cnt_eq31;
  bit         cnt_eq0;
  bit         cnt_eq0_reg;

  int n_reg;    // incoming data & result
  int d_reg;

  int res;      // result
  int p;        // partial result
  bit decb;     // decision bit

  assign cnt_eq31 = &cnt[4:0];
  assign cnt_eq0  = &(~cnt[4:0]);

  always_ff @(posedge clk) begin
    if (ival) begin
      cnt   <= 31;
      n_reg <= n;
      d_reg <= d;
    end
    else if (~cnt[5]) begin
      cnt <= cnt - 1'b1;
      if (cnt_eq31)
        {n_reg, decb, p} <= {n_reg[30:0], div32_step(n_reg[31], 1'b0, 32'd0)};
      else
        {n_reg, decb, p} <= {n_reg[30:0], div32_step(n_reg[31], decb, p)};
    end

    // align delays
    cnt_eq0_reg <= cnt_eq0;

    // correct result
    oval <= cnt_eq0_reg;
    if (cnt_eq0_reg) begin
      q <= n_reg;
      r <= decb ? (p + d_reg) : p;
    end
  end

  function bit [33 : 0] div32_step(input bit divb, decb, input int p);
    bit r_decb;
    int r_p;
  begin
    {r_decb, r_p} = decb ? {p, divb} + d_reg : {p, divb} - d_reg;
    return {~r_decb, r_decb, r_p};
  end
  endfunction

endmodule

33 такта + 1 такт на коррекцию остатка. Reg/LC 214/169

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


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

И напоследок 32 такта + 1 такт на коррекцию остатка

  .......
  always_ff @(posedge clk) begin
    if (ival) begin
      cnt   <= 31;
      d_reg <= d;
      {n_reg, decb, p} <= {n[30:0], div32_step(n[31], 1'b0, 32'd0)};
    end
    else if (~cnt[5]) begin
      cnt <= cnt - 1'b1;
      {n_reg, decb, p} <= {n_reg[30:0], div32_step(n_reg[31], decb, p)};
    end
    // correct result
    oval <= cnt_eq0;
    if (cnt_eq0) begin
      q <= n_reg;
      r <= decb ? (p + d_reg) : p;
    end   
  end

178/167 не могу сказать что написано сильно сложнее вашего, зато всё нутро алгоритма и плис как на ладони %)

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


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

Посмотрел внимательнее на свой код, первый цикл for - лишний в HDL, тк только для ускорения кода на процессоре, и его надо выкинуть. Си:

int q, r, n, d;
div32() {
    int i, r1, ge;
    for ( q = n, r = 0, i = 32; i > 0; i = i-1,
        r1 = r << 1 | q >> 31 & 1, 
        ge = r1 >= d, 
        r = ge ? r1-d : r1,
        q = q << 1 | ge
    );
}

и Верилог:

module div32(
    output reg [31:0] q, r,
    input [31:0] n, d,
    input clk
);   
reg  [5:0] i;
wire [31:0] r1 = r << 1 | q[31];
wire ge =  r1 >= d;
`always@(posedge clk) 
`begin    
    `for ( q <= n; i <= 32; r <= 0; , i > 0, i <= i-1; 
        r <= ge ? r1-d : r1; 
        q <= q << 1 | ge; 
    )    
`end
endmodule

Когда алгоритм потребует FSM на большое число состояний, тогда смешанный стиль HDL+ЯП будет существенно нагляднее чистого HDL. Те к комбинаторной и регистровой логике нужно добавить "последовательную". Имхо.

Увлекся, следующий этап у меня - множественные "последовательные" `always в одном модуле, задачки посложнее. Потом - перенос в свой препроцессор (`define временно - проще экспериментировать).

 

Например, "for" у меня так описан:

`define `for(s1,s2,s3) `s s1 `while(s2) `s s3 `endwhile

поэтому и ограничения в синтаксисе.

 

178/167 не могу сказать что написано сильно сложнее вашего, зато всё нутро алгоритма и плис как на ладони %)

Квартус дает ~120 ЛЕ (с одним `for).

Не сказал бы, что "нутро алгоритма ... как на ладони" - и императивные ЯП, и HDL - являются обфускаторами нетривиальных алгоритмов, имхо.

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

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


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

Квартус дает ~120 ЛЕ (с одним `for).

выложите итоговый верилог код, покрутить. спасибо.

 

Не сказал бы, что "нутро алгоритма ... как на ладони" - и императивные ЯП, и HDL - являются обфускаторами нетривиальных алгоритмов, имхо.

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

{res[cnt], decb, p} <= (cnt_eq31) ? div32_step(n[cnt], 1'b0, 32'd0) : div32_step(n[cnt], decb, p);

function bit [33 : 0] div32_step(input bit divb, decb, input int p);
......
{r_decb, r_p} = decb ? {p, divb} + d : {p, divb} - d;
.....

и не сможет получить из них следующий код.

    int p [31:0]; // partial add/sub
    int res;      // result
    int i;
    for (i = 31; i >= 0; i--) begin
      if (i == 31)
        {res[i], p[i]} = {32'd0, n[i]} - d;
      else
        {res[i], p[i]} = res[i + 1] ? {p[i+1], n[i]} + d : {p[i+1], n[i]} - d;
    end
    q = ~res;
    r = res[0] ? p[0] + d : p[0];

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

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


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

выложите итоговый верилог код, покрутить.

Sorry, там есть один момент, который не хочется раскрывать(иначе выложил бы сразу). Вечером для симуляции/синтеза попробую вывести/выложить нетлист (на уровне нетлиста еще не делал ничего, надо попробовать, пригодится).

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


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

Не пойму, как получить нетлист для P&R и симуляции (ISE & Quartus), может, в Web-версиях нельзя?

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


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

Добавил в модуль сигналы en, rdy, и регистр для делителя (без этого модуль непрактичен), число LE почему-то стало заметно превышать число LC: ~160 LE, ~130 LC comb, ~110 LC reg.

module div32(
    output reg [31:0] q = 0,
    output reg [31:0] r = 0,
    output rdy,
    input [31:0] n, dd,
    input en, clk
);   
reg  [5:0] i = 0;
reg  [31:0] d = 0;
wire [31:0] r1 = r << 1 | q[31];
wire ge =  r1 >= d;
assign rdy = i == 0;
`always@(posedge clk) 
`begin 
    `while ( 1 )
        `if ( en ) 
            `for( q <= n; d <= dd; i <= 32; r <= 0; , i > 0, i <= i-1; 
                r <= ge ? r1-d : r1; 
                q <= q << 1 | ge; 
            )
        `els 
            `s
        `endf
    `endw
`end
endmodule

div32.vqm прилагается.

 

n = dd * q + r

div32.rar

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


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

Добавил в модуль сигналы en, rdy, и регистр для делителя (без этого модуль непрактичен), число LE почему-то стало заметно превышать число LC: ~160 LE, ~130 LC comb, ~110 LC reg.

спасибо, гляну на досуге, разница в ресурсе наших вариантов обусловлена разным алгоритмом, у меня алгоритм с коррекцией остатка (разница на лишний сумматор), у вас алгоритм без коррекции. Чуть позже выложу чисто HDL ый вариант вашего алгоритма. Мне еще интересна частота обоих вариантов, мой последний, по отчетам квартуса дает ~204МГц. На первый взгляд в вашем алгоритме должен быть частотный затык в пути выхода вычитателя, который идет на enable триггера.

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


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

Как в ISE получить текстовый нетлист для P&R (аналогичный *.vqm в Квартусе) ?

Остановился на netgen + самопальный конвертор.

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


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

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

Ваш чисто HDL ый вариант за 32 такта

module div32_others #(parameter int pW = 32 )(
  output logic [pW-1:0] q, r,
  input  logic [pW-1:0] n, d,
  input  logic clk, ival,
  output logic oval
);

  bit [5 : 0] cnt;
  bit         cnt_eq31;
  bit         cnt_eq0;

  int n_reg;
  int r_reg;

  int r_tmp;
  int sub;
  bit ge;

  int r_tmp31;
  int sub31;
  bit ge31;

  int res;

  assign cnt_eq0  = &(~cnt[4:0]);

  assign r_tmp     = (r_reg << 1) | n_reg[31];
  assign {ge, sub} = (r_tmp - d);

  assign r_tmp31        = {31'd0, n[31]};
  assign {ge31, sub31}  = r_tmp31 - d;

  always_ff @(posedge clk) begin
    if (ival) begin
      cnt   <= 31;
      n_reg <= (n << 1);
      r_reg <= !ge31 ? sub31 : r_tmp31;
      res   <= {31'd0, !ge31};
    end
    else if (~cnt[5]) begin
      cnt   <= cnt - 1'b1;
      n_reg <= (n_reg << 1);
      r_reg <= !ge ? sub : r_tmp;
      res   <= (res << 1) | !ge;
    end

    // output result
    oval <= cnt_eq0;
    if (cnt_eq0) begin
      q <= res;
      r <= r_reg;
    end
  end

endmodule

если отбросить объявления сигналов, то алгоритм легко читается. LC/LR 178/166. По скорости на третьем сыклоне квартус меня поразил 196МГц, он смог быстро протащить сигнал переноса до всех 32 триггеров.

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


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

В 1-ом такте фактически проверяется d==1, можно попробовать "вынести" этот тривиальный случай, чтобы уменьшить число ЛЕ или повысить частоту.

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

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


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

конец RTL кодерам дспешникам?

 

The new SimRF product lets system architects use Simulink to design and verify complete wireless communication systems with true-to-form RF subsystem models and advanced circuit-envelope and harmonic-balance methods. A major update to Simulink HDL Coder adds critical path analysis and area-speed optimizations for automatic HDL code generation, along with a new Workflow Advisor for FPGA implementations.

 

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


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

des00, да мы шутили уже на эту тему.

31 страницу нашутили.

устарело.

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


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

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

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

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

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

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

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

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

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

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