2009/01/14(水)[HDL][Quartus II] constant function
[Quartus II][HDL]今日の不思議:constant functionが作れない?
状況
parameter化を行うため,カウンタに必要なビット数を得たいと考えた.同様のVHDL実装は,FPGAの部屋で紹介されていました.どこかで見かけたなぁと思ったら,Verilog2001-LRMの"constant function"の使い方として紹介されていました.
ところが,QuartusII v8.1(SOPC Builderのmodule登録時のAnalysis)にてsynthesisを試みたところ,エラーが出てきました.エラーはVerilog codeの中にコメントで記します.
妄想
function文が,constantを返すと認識していないようですねぇ.\QuartusIIの制限事項にでも記載されているのかしら(未確認).Verilog-2001対応のはずですよね...
とりあえずcounter変数をintegerとして逃げました.regでビット幅を指定すると,余計なレジスタを作らないので安心なのですが.integerならbit幅違いや定数のビット数指定が抜けてもwarningが出ないので見た目が気持ち良いというか何というか….
parameter CLK_DIVIDER = 2 ; localparam CLK_DIVIDER_WIDTH = clogb2(CLK_DIVIDER) ; // Error: Error (10192): // Verilog HDL Defparam Statement error at avalonif_dai.v(49): // value for parameter "CLK_DIVIDER_WIDTH" must be constant expression File: ---- ////////////////////////////////////////////////////////////////////// // Verilog LRM "10.3.5 Use of constant functions" // // define the clogb2 function function integer clogb2; input depth; integer i,result; begin for (i = 0; 2 ** i < depth; i = i + 1) result = i + 1; clogb2 = result; end endfunction
参考(VHDLでのLOG2実装例)
ttp://www.opencores.org/cvsweb.cgi/~checkout~/AVR_Core/VHDL/AVRuCPackage.vhd?rev=1.1.1.4;content-type=text%2Fplain
勝手に持ってきたのでこっそりと(ぇ
-- Functions function LOG2(Number : positive) return natural is variable Temp : positive := 1; begin if Number=1 then return 0; else for i in 1 to integer'high loop Temp := 2*Temp; if Temp>=Number then return i; end if; end loop; end if; end LOG2; -- End of functions