0

カウンターの定数のサイズを設定したい:

localparam MAX_COUNT = ((debounce_per_ms * clk_freq)) + 1;
parameter MAX_COUNT_UPPER = $rtoi($floor($log10(MAX_COUNT)/$log10(2)));

これは XST (ise) とベリレーターでうまく動作しますが、Icarus では次のエラーが発生します。

src/button_deb.v:20: error: $rtoi() is not a constant system function.

「整数」タイプを使用してこれを解決できます:

parameter integer MAX_COUNT_UPPER = $floor($log10(MAX_COUNT)/$log10(2));

しかし、それはベリレーターで警告を出します:

$ verilator -cc src/button_deb.v
%Warning-REALCVT: src/button_deb.v:20: Implicit conversion of real to integer
%Warning-REALCVT: Use "/* verilator lint_off REALCVT */" and lint_on around source to disable this message.
%Error: Exiting due to 1 warning(s)
%Error: Command Failed /usr/local/bin/verilator_bin -cc src/button_deb.v

これを行う良い方法があり、Icarus、veilator、および Xst と互換性があると思いますか?

4

1 に答える 1

2

$log10(MAX_COUNT)/$log10(2)log2 が利用できない場合に log2 を計算する方法です。

$log10()利用可能なVerilog システムでは、 $log2().

フロア関数は整数に丸めることであり、これは切り捨てられます。その数の位置をカバーするために必要なビット数を知るために切り上げたいと思うのがより一般的です。

このために、 Ceiling log2 があり$clog2()ます。これは、切り上げではなく切り上げであるため、関数の正確な置き換えではありません。

例:

parameter RAM_DEPTH      = 10;
parameter RAM_ADDR_WIDTH = $clog2(RAM_DEPTH);

以下もうまくいくはずです(整数型にする必要はありません):

parameter MAX_COUNT_UPPER = $floor($log10(MAX_COUNT)/$log10(2));
于 2015-03-15T11:16:09.193 に答える