0

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

4

2 回答 2

1

您的工具没有提供非常有用的错误消息。问题是您正在引用一个log2ceil尚未声明的函数。鉴于您定义事物的顺序,shiftRightInt尚不可见。

当我用 Modelsim 编译你的代码时,我得到:`

(vcom-1136) 未知标识符“shiftRightInt”。

编辑:包含您的流程后,我得到了@user1155120 指出的错误。在模型模拟中:

子程序“log2ceil”没有可行的条目。

正如 user1155120 所指出的,您正在过程上下文中调用函数。您需要将返回值分配给某些东西。

首先,您可以交换声明的顺序。IE:

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; 
于 2016-03-17T04:55:28.537 回答
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;

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

于 2016-03-17T13:06:44.397 回答