Логарифм в Верилоге - PullRequest
       17

Логарифм в Верилоге

9 голосов
/ 09 апреля 2011

У меня есть утверждение в verilog, похожее на integer level = log(N) (где N - параметр, и уровень должен быть определен) Но я понимаю, что не могу делать сложные математические выражения в verilog, поэтому мне интересно, есть ли альтернатива Решение вышеуказанной проблемы?

Любые отзывы приветствуются!

Ответы [ 5 ]

9 голосов
/ 31 августа 2011

Если вы пытаетесь использовать логарифмическую базу 2, вы можете использовать встроенную функцию $clog2().

4 голосов
/ 09 апреля 2011

Ответ на АДРЕСНАЯ ШИРИНА из ГЛУБИНЫ ОЗУ описывает несколько способов оценки постоянных логарифмов в этой ситуации.

3 голосов
/ 28 августа 2016

Verilog имеет функции для натурального логарифма ($ln()), десятичного логарифма ($log10()) и потолка двоичного логарифма ($clog2()).В постоянных выражениях они должны быть синтезируемыми, но фактическая поддержка инструментами может быть разной.

Ниже приводится синтезируемый код Verilog:

module test(output [31:0] a, b, c);
  assign a = 1000 * $ln(123);
  assign b = 1000 * $log10(123);
  assign c = 1000 * $clog2(123);
endmodule

Например, после синтеза RTL с Yosys (например, yosys -p 'prep; write_verilog -noattr' test.v):

module test(a, b, c);
  output [31:0] a;
  output [31:0] b;
  output [31:0] c;
  assign a = 32'd4812;
  assign b = 32'd2090;
  assign c = 32'd7000;
endmodule
1 голос
/ 21 июля 2017

Мне нравится думать (логарифм основания n значения) как ответ на вопрос "Сколько базовых n цифр мне нужно, чтобы представить независимые числа 'значения'?" (Помня, что 0 считается числом)

Думая об этом, вы можете реализовать свою собственную базу журналов 2 в SystemVerilog:

function bit [31:0] log_base_2 (bit [31:0] log_input);
  bit [31:0] input_copy;
  bit [31:0] log_out = 0;
  input_copy = log_input;

  while(input_copy > 0)begin
    input_copy = input_copy >> 1;
    log_out = log_out + 1;
  end
  log_out = log_out - 1;

  if(log_input != (1 << log_out))
    log_out = log_out + 1;

  return log_out;
endfunction
1 голос
/ 06 октября 2011

Но я понимаю, что не могу делать сложные математические выражения в Verilog

Verilog - это, прежде всего, язык описания аппаратного обеспечения.Какое аппаратное log(N) заявление описывает?Современные FPGA состоят из LUT, флопов, небольших встроенных модулей памяти, простых DSP, которые реализуют примитивы MAC (с множественным накоплением).log(N) и другие сложные математические операторы не могут быть отображены непосредственно в эти примитивы.То же самое касается ASIC.

По аналогии, log(N) не выполняется процессором.Для этого он вызывает кучу инструкций по сборке более низкого уровня.Эти инструкции по сборке являются частью библиотеки log(N) (C, C ++ и т. Д.)

Чтобы иметь возможность синтезировать log(N) для ASIC / FPGA, требуется экземпляр log(N) IP-ядра.

...