VHDL: определение / сообщение битовой ширины / длины целого числа (по сравнению с std_logic_vector)?

Скажем, мне нужен сигнал для представления чисел от 0 до 5; очевидно, для этого требуется 3 бита std_logic (т.е. если MAXVAL = 5, то битовая ширина = {wcalc "floor(logtwo($MAXVAL))+1"}).

Я знаю, что могу:

SIGNAL myLogicVector : STD_LOGIC_VECTOR(2 downto 0) := 5; 

в котором я бы явно указал массив из трех «битов» std_logic и установил начальное значение; тогда я мог бы использовать ОТЧЕТ, чтобы распечатать длину (в данном случае 3):

report("Bit width of myLogicVector is "& integer'image(myLogicVector'length));

Все идет нормально. Но, допустим, вместо этого я использую целочисленный (числовой) тип:

SIGNAL myInteger : NATURAL range 0 to 5 := 5;

Я предполагаю, что здесь «компилятор» («синтезатор») автоматически сделает вывод, что ему требуется 3 бита длины хранения, поскольку это целое число находится в диапазоне значений от 0 до 5. Если это В этом случае мой вопрос: можно ли как-нибудь распечатать эту битовую ширину / длину / размер в ОТЧЕТЕ?

Уловка, конечно, вот в чем:

report("Bit width of myInteger is "& integer'image(myInteger'length));

... потерпит неудачу (скажем, с "HDLParsers: 3389 - Префикс длины атрибута должен быть объектом массива"), поскольку, насколько я понимаю, применимы все эти атрибуты, такие как 'length и 'range только для массивов (понимание атрибутов VHDL), тогда как целое число (натуральное) не является массивом - это число :) (вопрос о векторном целочисленном преобразовании VHDL)

Опять же, я знаю, что мог бы использовать log2 (Вычисление ширины беззнаковой переменной из максимального значения?) - но мне бы хотелось просто быстро увидеть (во время синтеза), сколько« битов » 'синтезатор', выделенный для окончательного синтезируемого проекта, и, следовательно, примерное количество, которое будет использовано с точки зрения конечных ресурсов ПЛИС (, особенно если бы я использовал 'generics', чтобы каким-то образом вычислить конкретное максимальное значение для целого числа ).

Что ж, заранее спасибо за любые отзывы, Ура!

РЕДАКТИРОВАТЬ: немного контекста: я использую ISE Webpack 9.2; Я пытаюсь использовать «общие» переменные / константы в качестве параметров, а затем использовать уравнения для вычисления максимальных значений счетчиков. Этот расчет, я полагаю, происходит во время «компиляции» (который в ISE будет «синтезировать», а не «реализовать дизайн»), поэтому именно здесь я хочу, чтобы сообщения отчета появлялись (и я фактически получил их так, для собственно std_logic_vector, в журнале синтеза - однако те же сообщения отчета для меня появляются и при запуске поведенческой симуляции, и это нормально).

И цель этих сообщений отчета - убедиться, что мои уравнения в порядке, и что синтезатор не будет пытаться вывести 32-битный счетчик - даже если я хочу считать только от 0 до 5 :)


person sdaau    schedule 04.03.2011    source источник
comment
Привет, Сдау. Чтобы уточнить, нужна ли вам эта информация во время компиляции или после синтеза? В случае пост-синтеза, какой инструмент синтеза вы используете?   -  person George    schedule 04.03.2011
comment
Привет, @George, спасибо за комментарий! Я добавил немного пояснений к OP; Я думаю, что мне нужны сообщения во время «компиляции» (кроме того, как я это вижу, по крайней мере для ISE: время компиляции = синтез ?!)   -  person sdaau    schedule 04.03.2011
comment
Нет, вы не можете присвоить вектору значение целое число 5. Вы можете попробовать присвоить литералу битовой строки 101.   -  person Philippe    schedule 04.03.2011
comment
Привет @Phillipe, спасибо за комментарий! Я предполагаю, что всегда можно было использовать преобразование типа «std_logic_vector(to_unsigned(5, x'length)» - но тогда вам нужно указать ширину в битах вручную; В противном случае я искал способ, чтобы синтезатор сообщал мне автоматически необходимую разрядность :) Ура!   -  person sdaau    schedule 04.03.2011


Ответы (5)


Я предполагаю, что здесь 'компилятор' ('синтезатор') автоматически сделает вывод, что ему требуется 3 бита длины хранения, поскольку это целое число находится в диапазоне от 0 до 5.

Согласно спецификации это должно быть, но это не обязательно. Из IEEE 1076.6-2004:

1.3 Терминология

Слово должен указывает на обязательные требования, которые должны строго соблюдаться, чтобы соответствовать стандарту, и отклонения от которых не допускаются (должно быть равно требуется). Слово следует используется для обозначения того, что определенный образ действий является предпочтительным, но не обязательно обязательным;

8.3.1.2 Целочисленные типы

Рекомендуется, чтобы инструмент синтеза преобразовывал сигнал или переменную, имеющую указание целочисленного подтипа, в соответствующий вектор битов. Если диапазон не содержит отрицательных значений, элемент должен иметь двоичное представление без знака. Если диапазон содержит одно или несколько отрицательных значений, элемент должен иметь реализацию с дополнением до двух. Вектор должен иметь наименьшую ширину, соответствующую этим представлениям.

Инструмент синтеза должен поддерживать целочисленные типы и положительные, отрицательные и неограниченные (универсальные) целые числа, границы которых лежат в диапазоне от –2 147 483 648 до +2 147 483 647 включительно (диапазон, который успешно отображает 32-битные числа с дополнением до двух).

Пример: «Целочисленный диапазон от 9 до 10» должен быть синтезирован с использованием эквивалентной длины вектора в 4 бита, как если бы он был определен с указанием подтипа «Целочисленный диапазон от 0 до 15».

Я могу с уверенностью сказать, что по крайней мере один инструмент синтеза не использует range таким образом, поскольку мне пришлось отлаживать несоответствия формальной проверки.

Для ПЛИС Xilinx отчет по синтезу XST покажет, какие элементы памяти имеют неиспользуемые биты, но не простые провода.

person Community    schedule 04.03.2011
comment
Привет @ Adam12, спасибо и +1 за ответ! Небольшое пояснение - означает ли это, что для целочисленного типа в принципе невозможно получить используемую битовую ширину на этапе синтеза, поскольку для целого числа указано 32 бита - и возможно только после ( в отсутствие лучшего срока) реализация (т.е. после шагов места и маршрута?)? Еще раз спасибо за ответ - ура! - person sdaau; 04.03.2011
comment
Привет, sdaau. Вам не нужно запускать PAR, чтобы получить счетчик регистров. Это делается с помощью XST, что является самым первым шагом. Посмотрите в файле .syn. - person ; 04.03.2011
comment
Это не так. Ограничение диапазона является частью указания подтипа. Нет причин, по которым инструмент синтеза не учел бы это заранее, до оптимизации логики. - person Jan Decaluwe; 05.03.2011
comment
INTEGER - это почти 32 бита, но не совсем. Спецификация языка требует поддержки +/- (2 ^ 32) -1, но не -2 ^ 32. - person Martin Thompson; 07.03.2011
comment
Я не знаю других синтезаторов, но Quartus II НЕ игнорирует диапазон. Вы можете легко убедиться, что он генерирует более эффективный дизайн с меньшими логическими ресурсами, если вы ограничите диапазон вашего сигнала / переменной с помощью подтипа Integer. - person ultimA; 13.07.2012

В принципе, представление целого числа VHDL не определено.

На практике обычно можно предположить, что инструмент синтеза будет использовать представление с дополнением до 2 с учетом ограничения диапазона. Следовательно, связь между ограничением диапазона и реализованной шириной в битах очевидна, даже несмотря на то, что сообщение о ширине битов изнутри VHDL - нет.

person Jan Decaluwe    schedule 05.03.2011
comment
Спасибо за разъяснения, @Jan Decaluwe - Ура! - person sdaau; 13.03.2011

можно ли как-то распечатать эту битовую ширину / длину / размер в ОТЧЕТЕ?

Основы математики:

Разрядность = ceil (log2 (my_integer + 1))

Но VHDL требует немного больше усилий ...

Встроенный код:

use ieee.math_real.all;
...
report "Bit width of myInteger is " & integer'image(integer(ceil(log2(real(myInteger) + real(1)))));

Как функция:

use ieee.math_real.all;
...
-- Returns the bit width of i as a positive integer.
function BitWidth(constant i: in positive) return positive is
begin
    return positive(ceil(log2(real(i) + real(1))));  -- Add one to prevent errors when i = 2**n
end function;

-- Overload for returning the string representation of the bit width of i.
function BitWidth(constant i: in positive) return string is
    variable bit_width: positive := BitWidth(i);
begin
    return positive'image(bit_width);
end function;

signal myInteger: positive := 8;
...
report "Bit width of myInteger is " & BitWidth(myInteger);

Вы можете поместить эти функции в пакет вспомогательных функций.

person tim    schedule 15.12.2020

Это можно решить следующим образом:

Сначала объявите новый (под) тип, представляющий диапазон, который должен использоваться для myInteger. (Затем объявите myInteger как сигнал этого типа, а не непосредственно целочисленного диапазона).

Затем объявите фиктивный тип массива, используя объявленный диапазон в качестве диапазона индекса, а затем используйте 'length из that:

subtype myInteger_range is natural range 0 to 5;
signal myInteger : myInteger_range;
type myInteger_dummy_array is array (myInteger_range) of boolean; -- or whatever
report integer'image(myInteger_dummy_array'length); --> "6"
person mkrieger1    schedule 16.09.2016

Вы всегда можете использовать:

report ("Разрядность myInteger равна" & integer'image (myInteger'left - myInteger'Right));

person Gonzalo Pacheco    schedule 19.03.2015