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