我编写了一个简单的函数,它可以对任何整数进行log2计算,然后是" ceils"它到下一个整数:
function log2ceil(intVal: integer) return natural is
variable i : natural;
variable bitCount : natural;
begin
i := (intVal - 1);
bitCount := 0;
while (i > 0) loop
bitCount := bitCount + 1;
i:=shiftRightInt(i,1);
end loop;
return bitCount;
end log2ceil;
function shiftRightInt(ValueToShift: integer; NrToShift:natural) return integer is
begin
return to_integer(shift_right(to_unsigned(ValueToShift, 32), NrToShift));
end shiftRightInt;
工作,很好。问题在于模拟。每当我尝试在测试平台上使用简单的函数调用来模拟它时:
stim: process
begin
wait for 10 ns;
log2ceil(3);
wait;
end process;
它给了我以下错误:
ERROR: [VRFC 10-1472] type error near log2ceil ; expected type void
为什么期望Void类型?我怎样才能避免出现此错误?
答案 0 :(得分:1)
您的工具没有提供非常有用的错误消息。问题是您正在引用尚未声明的log2ceil
中的函数。根据您定义的顺序,shiftRightInt
尚未显示。
当我使用Modelsim编译代码时,我得到: `
(vcom-1136)未知标识符“shiftRightInt”。
编辑:在包含您的过程后,我收到了错误@ user1155120指出。在Modelsim:
子程序“log2ceil”没有可行的条目。
正如user1155120所指出的,您正在调用过程上下文中的函数。您需要将返回值分配给某个东西。
首先,您可以交换声明的顺序。即:
function shiftRightInt(ValueToShift: integer; NrToShift:natural) return integer is
begin
return to_integer(shift_right(to_unsigned(ValueToShift, 32), NrToShift));
end shiftRightInt;
function log2ceil(intVal: integer) return natural is
variable i : natural;
variable bitCount : natural;
begin
i := (intVal - 1);
bitCount := 0;
while (i > 0) loop
bitCount := bitCount + 1;
i:=shiftRightInt(i,1);
end loop;
return bitCount;
end log2ceil;
另一种是定义shiftRightInt
:
function shiftRightInt(ValueToShift: integer; NrToShift:natural) return integer;
function log2ceil(intVal: integer) return natural is
variable i : natural;
variable bitCount : natural;
begin
i := (intVal - 1);
bitCount := 0;
while (i > 0) loop
bitCount := bitCount + 1;
i:=shiftRightInt(i,1);
end loop;
return bitCount;
end log2ceil;
function shiftRightInt(ValueToShift: integer; NrToShift:natural) return integer is
begin
return to_integer(shift_right(to_unsigned(ValueToShift, 32), NrToShift));
end shiftRightInt;
答案 1 :(得分:0)
代码:
stim: process
begin
wait for 10 ns;
log2ceil(3);
wait;
end process;
描述了一个过程调用,但log2ceil
是一个函数。过程的返回类型为void,而函数返回一个整数。
您需要提供一个虚拟变量来收集返回值:
stim: process
variable dummy : natural;
begin
wait for 10 ns;
dummy := log2ceil(3);
wait;
end process;
错误信息有点神秘,但是正确!