verilog中函数调用的帮助

verilog中函数调用的帮助,verilog,function-call,Verilog,Function Call,我试图理解国家奥委会仲裁员代码。当我尝试使用Xilinx软件进行语法检查时,我得到一个错误“localparam ARBITER_BIN_WIDTH=log2(ARBITER_WIDTH);”行的“常量表达式中不支持对'log2'的函数调用”。这条线应该做些什么改变? 我面临问题的代码部分: parameter ARBITER_WIDTH =4 input integer number; begin log2=0; while(2**log

我试图理解国家奥委会仲裁员代码。当我尝试使用Xilinx软件进行语法检查时,我得到一个错误“localparam ARBITER_BIN_WIDTH=log2(ARBITER_WIDTH);”行的“常量表达式中不支持对'log2'的函数调用”。这条线应该做些什么改变? 我面临问题的代码部分:

 parameter ARBITER_WIDTH    =4
      input integer number; begin   
      log2=0;   
      while(2**log2<number) begin   
        log2=log2+1;    
     end    
   end  
 endfunction // log2 

localparam ARBITER_BIN_WIDTH= log2(ARBITER_WIDTH);
参数仲裁器\u宽度=4
输入整数;开始
log2=0;

虽然(2**log2参见IEEE标准Verilog®硬件描述语言LRM,见第10.2.5节,他们描述了日志的功能

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
函数整数clogb2;
输入深度;
整数i,结果;
开始
对于(i=0;2**i<深度;i=i+1)
结果=i+1;
clogb2=结果;
结束
端功能

你能确认一下吗,它对你有用吗?

你能描述一下log2函数吗?没有更多的代码细节,很难说清楚,但是该工具抱怨说它不支持函数调用来获取编译时常量,比如参数;也就是说,它无法运行函数
log2
来获取ARBITER\u BIN\u WIDTH
。如果它是Vivado,您应该有SystemVerilog支持,它应该允许您使用
$clog2()
,以获得大致相同的功能。@Zuzu:您可以更新吗?错误“常量表达式中不支持对'log2'的函数调用”吗表达式的平均左侧和右侧与类型不匹配?是的!强烈建议位宽度必须相同。localparm支持的大小是多少?您可以将其设置为
参数[31:0]仲裁器\u width=32'h4
,或
参数整数仲裁器\u width=32'd4
。感谢您的帮助。