"expected type void" - VHDL 函数错误
"expected type void" - VHDL function error
我写了一个简单的函数,它对任何整数进行 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 类型?我怎样才能避免出现这个错误?
您的工具未提供非常有用的错误消息。问题是您正在引用 log2ceil
中尚未声明的函数。鉴于您定义事物的顺序,shiftRightInt
尚不可见。
当我用 Modelsim 编译你的代码时,我得到:
`
(vcom-1136) Unknown identifier "shiftRightInt".
编辑:包含您的过程后,我得到了指出的错误@user1155120。在 Modelsim 中:
No feasible entries for subprogram "log2ceil".
如 user1155120 所述,您正在过程上下文中调用函数。您需要将 return 值分配给某物。
首先,您可以交换声明的顺序。即:
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;
另一种是定义一个"prototype" of 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;
代码:
stim: process
begin
wait for 10 ns;
log2ceil(3);
wait;
end process;
描述的是一个过程调用,但是log2ceil
是一个函数。程序有一个 return 类型的 void,而你的函数 return 是一个整数。
您需要提供一个虚拟变量来收集 return 值:
stim: process
variable dummy : natural;
begin
wait for 10 ns;
dummy := log2ceil(3);
wait;
end process;
错误消息有点含糊,但正确!
我写了一个简单的函数,它对任何整数进行 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 类型?我怎样才能避免出现这个错误?
您的工具未提供非常有用的错误消息。问题是您正在引用 log2ceil
中尚未声明的函数。鉴于您定义事物的顺序,shiftRightInt
尚不可见。
当我用 Modelsim 编译你的代码时,我得到: `
(vcom-1136) Unknown identifier "shiftRightInt".
编辑:包含您的过程后,我得到了指出的错误@user1155120。在 Modelsim 中:
No feasible entries for subprogram "log2ceil".
如 user1155120 所述,您正在过程上下文中调用函数。您需要将 return 值分配给某物。
首先,您可以交换声明的顺序。即:
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;
另一种是定义一个"prototype" of 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;
代码:
stim: process
begin
wait for 10 ns;
log2ceil(3);
wait;
end process;
描述的是一个过程调用,但是log2ceil
是一个函数。程序有一个 return 类型的 void,而你的函数 return 是一个整数。
您需要提供一个虚拟变量来收集 return 值:
stim: process
variable dummy : natural;
begin
wait for 10 ns;
dummy := log2ceil(3);
wait;
end process;
错误消息有点含糊,但正确!