"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;

错误消息有点含糊,但正确!