2016-03-17 4 views
-1

Я написал простую функцию, которая делает log2 вычисление любого целого числа, а затем «ceils» это до следующего целого числа:«Ожидаемый тип аннулируются» - функция VHDL ошибка

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 

Почему ожидать типа Пустоты? И как я могу избежать получения этой ошибки?

+2

Вызов функции - это выражение, которое возвращает значение. Если бы вы предоставили [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), кто-то мог бы продублировать ошибку в другом инструменте, который может дать более выразительный отчет об ошибках. В идеальном мире вы должны получить сообщение об ошибке, сообщающее, что log2ceil не обозначает процедуру, а использование - синтаксическая ошибка. (Попробуйте назначить возвращаемое значение вызова функции переменной или объекту класса сигнала типа integer или natural). – user1155120

+0

При составлении минимального, полного и проверяемого примера вы также можете попытаться уменьшить код функции 'log2ceil' или просто использовать другую тестовую функцию. –

+0

Это очень странное сообщение об ошибке от компилятора VHDL!Это имело бы смысл для компилятора C, где процедуры моделируются с использованием «void functions», поэтому вы можете вызывать функции и отбрасывать возвращаемые значения. Вы не можете сделать это в VHDL. –

ответ

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; 

Сообщение об ошибке немного загадочным, но верно!

+0

Процедуры не имеют возвратного значения. VHDL не имеет типа пустоты. Для другого примера того же сообщения об ошибке, которое не поддерживает вашу гипотезу, см. [Ожидание типа void для поведенческих] (https://stackoverflow.com/questions/45116813/expecting-type-void-for-behavioral), вызванное двумя ' иначе я должен быть 'elsif's. Сообщение об ошибке не имеет оснований на языке VHDL. void содержится только в 18. Функции доступа VHPI, описывающие модели информации C, которые не применяются в связанном вопросе или здесь. – user1155120

1

Ваш инструмент не дает очень полезного сообщения об ошибке. Проблема в том, что вы ссылаетесь на функцию в log2ceil, которая еще не объявлена. Учитывая порядок, который вы определяете, shiftRightInt пока не отображается.

Когда я скомпилировать код с Modelsim, я получаю: `

(vcom-1136) Unknown identifier "shiftRightInt".

Edit: После включения вашего процесса я получил ошибку @ user1155120 указал. В Modelsim:

No feasible entries for subprogram "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; 
+0

порядок не имеет к этому никакого отношения, но проблема назначения очевидна. – refDL

+0

В данном примере заказ имеет значение. Я указал на ошибку компиляции. Именно поэтому @ user1155120 указал MCVE. И я отредактировал свой ответ, чтобы включить примечание о назначении результата функции. – PlayDough

Смежные вопросы