module test(output [31:0] a, b, c); assign a = 1000 * $ln(123); assign b = 1000 * $log10(123); assign c = 1000 * $clog2(123); endmodule
8
1
5 回答
9
実行しようとしている対数の底が2の場合、組み込み関数 `$ clog2()`を使用できます。
4
RAM DEPTHからのADDRESS WIDTHへの回答では、この状況で一定の対数を評価するいくつかの方法を説明しています。
2
Verilogには、自然対数( $ ln()
)、10進対数( $ log10()
)、2進対数の上限( $ 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
E.g. Yosysを使用したRTL合成後(例: 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
_ しかし、Verilogで複雑な数学ステートメントを実行できないことを理解しています _
Verilogは、何よりもまずハードウェア記述言語です。 ハードウェアの `log(N)`ステートメントは何を記述していますか? 最新のFPGAは、LUT、フロップ、小型の組み込みメモリ、MAC(積和)プリミティブを実装するシンプルなDSPで構成されています。 `log(N)`およびその他の複雑な数学ステートメントは、これらのプリミティブに直接マッピングできません。 ASICでも同じことが言えます。
同様に、 `log(N)`はプロセッサによって実行されません。 そのために、多数の低レベルのアセンブリ命令を呼び出します。 これらのアセンブリ命令は、 `log(N)`ライブラリの一部です(C、C ++など)
ASIC / FPGAの log(N)`を合成できるようにするには、 `log(N)
IPコアのインスタンスが必要です。
1
(値の対数の底n)が「「値」の独立した数値を表すには基数nの桁数が必要ですか?」という質問に答えていると考えるのが好きです。 (0は数値としてカウントされることに注意してください)
そのように考えると、SystemVerilogで独自のログベース2を実装できます。
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