"期望类型无效" - VHDL函数错误

时间:2016-03-17 03:25:43

标签: vhdl vivado

我编写了一个简单的函数,它可以对任何整数进行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类型?我怎样才能避免出现此错误?

2 个答案:

答案 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;

错误信息有点神秘,但是正确!