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