Преобразование типов в VHDL: вещественное число в целое — указан ли режим округления?

При отладке обработки определяемых пользователем физических типов в Vivado (подробнее ), я обнаружил другое поведение для преобразования типа из вещественного в целочисленное.

Вот мой пример кода:

library IEEE;
use     IEEE.STD_LOGIC_1164.ALL;
--use     IEEE.MATH_REAL.all;

entity Top_PhysicalTest_Simple is
  port (
    Clock : in STD_LOGIC;
    Input : in STD_LOGIC;
    Output : out STD_LOGIC
  );
end;

architecture top of Top_PhysicalTest_Simple is
  constant int_1     : INTEGER  := natural(0.5);
  constant int_2     : INTEGER  := integer(-0.5);
--  constant int_2     : INTEGER  := natural(-0.5);
begin
  assert FALSE report "16 - int_1 (natural(0.5)):  " & INTEGER'image(int_1) severity note;
  assert FALSE report "17 - int_2 (natural(-0.5)): " & INTEGER'image(int_2) severity note;

  Output <= Input when rising_edge(Clock);
end;

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

XST 14.7:

Elaborating entity <Top_PhysicalTest_Simple> (architecture <top>) from library <work>.
Note: "16 - int_1 (natural(0.5)):  1"
Note: "17 - int_2 (natural(-0.5)): 0"

XST, кажется, использует режим round up и обрабатывает преобразование типа, включая проверку диапазона. Поэтому я должен использовать integer(-0.5) вместо natural(-0.5).

Вивадо 2014.4:

[Synth 8-63] RTL assertion: "16 - int_1 (natural(0.5)):  1" ["D:/Temp/PhysicalTest_Vivado2014.4/vhdl/Top_PhysicalTest_Simple.vhdl":80]
[Synth 8-63] RTL assertion: "17 - int_2 (natural(-0.5)): -1" ["D:/Temp/PhysicalTest_Vivado2014.4/vhdl/Top_PhysicalTest_Simple.vhdl":81]

Похоже, что Synth использует режим округление до бесконечности и обрабатывает преобразование типов без проверки диапазона. Так что, возможно, natural(..) — это просто псевдоним integer(..).
Строка с комментариями: constant int_2 : INTEGER := natural(-0.5); не выдает ошибок.

GHDL 0.29:

GHDL 0.29 не выполняет проверку диапазона в natural(..). Я знаю, что это устарело, но поскольку 0.31 меня ненавидит, я не могу сказать, исправлено ли это уже.

GHDL 0.31:

Я представлю результаты позже. GHDL отказывается анализировать мой код, потому что:
Top_PhysicalTest_Simple.vhdl:29:14: файл std_logic_1164.v93 изменился и должен быть проанализирован повторно

Мои вопросы:

  • Определяет ли VHDL режим округления? И если да, то какой?
  • Как мне обрабатывать округление, если режим не определен?

person Paebbels    schedule 07.01.2015    source источник
comment
похоже, вам удалось установить другую версию ghdl поверх 0.31? Чистая установка (возможно, в другое место) или make install, если вы собрали ее из исходного кода, должны исправить проблемы с версиями стандартных библиотек.   -  person user_1818839    schedule 07.01.2015
comment
ghdl-0.32 ... ./top_physicaltest_simple Top_PhysicalTest_Simple.vhd:18:3:@0ms:(примечание к утверждению): 16 - int_1 (натуральный (0.5)): 1 Top_PhysicalTest_Simple.vhd:19:3:@0ms:(примечание к утверждению ): 17 - int_2 (натуральный (-0,5)): -1   -  person user_1818839    schedule 07.01.2015
comment
Извините за путаницу: 0.29 тестировалась на Debian (стандартный пакет), 0.31 — на моей машине с Windows (версия mcode). Установка и компиляция 0.32 - та ещё задача :)   -  person Paebbels    schedule 07.01.2015
comment
ghdl -a top_phystest_simple.vhdl (завершает). ghdl --version GHDL 0.31 (20140108) [Dunoon edition] (в Mac OS X спросите Брайана, что означает Dunoon). Вы также можете найти загрузку для Debian — sourceforge.net/ проекты/ghdl-updates/files/Builds/ghdl-0.31/.   -  person    schedule 07.01.2015
comment
@DavidKoontz Вопрос в том, что выводит ghdl -e ... :) Я пытался установить ghdl 0.31 на свою виртуальную машину Linux, но версия пакета не соответствует. Debian 8.0 (тестирование) libgnat-4.9, ghdl требует 4.6, но это вопрос для другого дня...   -  person Paebbels    schedule 07.01.2015
comment
Поэтому я сообщил об этом другом поведении в Форум Xilinx. Давайте посмотрим, как они оправдывают разные результаты. Кроме того, если кто-то хочет узнать больше о ложных реализованных физических типах в Vivado Synth, вот второй отчет об ошибке   -  person Paebbels    schedule 07.01.2015
comment
гдл-0.31.ghdl -r Top_PhysicalTest_Simple - top_phystest_simple.vhdl:18:3:@0ms:(assertion note): 16 - int_1 (natural(0.5)): 1 top_phystest_simple.vhdl:19:3:@0ms:(assertion note): 17 - int_2 (natural(-0.5)): -1. Нужен флаг, re: Ответ Филиппа? Для натурального (-0,5) Если метка типа обозначает подтип, преобразование состоит из преобразования в целевой тип с последующей проверкой того, что результат преобразования принадлежит подтипу, ..., и целевой подтип преобразования типа тип или подтип, обозначенный знаком типа, сообщает об обновлениях ghdl.   -  person    schedule 08.01.2015


Ответы (2)


Из IEEE Std 1076-2002, раздел 7.3.5 «Преобразование типов».

The conversion of a floating point value to an integer type rounds to
the nearest integer; if the value is halfway between two integers,
rounding may be up or down.

Если вам нужно что-то еще, возможно, вам пригодятся функции в IEEE.MATH_REAL (особенно CEIL, FLOOR и/или TRUNC).

person Philippe Aubertin    schedule 07.01.2015

(отправляю это как ответ, потому что я не могу опубликовать встроенный комментарий...)

Вот результаты использования готового ghdl-0.31-mcode-win32:

  C:\brian\jobs\ghdl_test\paebbels>md work.ghd

  C:\brian\jobs\ghdl_test\paebbels>ghdl -a --workdir=work.ghd Top_PhysicalTest_Simple.vhd

  C:\brian\jobs\ghdl_test\paebbels>ghdl -r --workdir=work.ghd Top_PhysicalTest_Simple
  Top_PhysicalTest_Simple.vhd:18:3:@0ms:(assertion note): 16 - int_1 (natural(0.5)):  1
  Top_PhysicalTest_Simple.vhd:19:3:@0ms:(assertion note): 17 - int_2 (natural(-0.5)): -1

«0.31 — это моя машина с Windows (версия mcode)» «GHDL отказывается анализировать мой код»

Если у вас возникли проблемы с библиотеками в сборке mcode для Windows версии 0.31, попробуйте удалить все версии GHDL 0.29 или более ранние версии NSIS-установщика на этом компьютере. Также убедитесь, что вы выполнили весь процесс установки, как описано в 0.31 Windows INSTALL, особенно reanalyze_libraries.bat.

Вот версия, использованная для вышеуказанного теста:

  C:\brian\jobs\ghdl_test\paebbels>ghdl -v
  GHDL 0.31 (20140108) [Dunoon edition] + ghdl-0.31-mcode-win32.patch
  Compiled with GNAT Version: GPL 2013 (20130314)
  mcode code generator
  Written by Tristan Gingold.

  Copyright (C) 2003 - 2014 Tristan Gingold.
  GHDL is free software, covered by the GNU General Public License.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

И информация о пути к библиотеке:

  C:\brian\jobs\ghdl_test\paebbels>ghdl --dispconfig
  command line prefix (--PREFIX): (not set)
  environment prefix (GHDL_PREFIX): C:\Ghdl\ghdl-0.31-mcode-win32\lib
  default prefix: C:\Ghdl\ghdl-0.31-mcode-win32\lib
  actual prefix: C:\Ghdl\ghdl-0.31-mcode-win32\lib
  command_name: C:\Ghdl\ghdl-0.31-mcode-win32\bin\ghdl.exe
  default library pathes:
  C:\Ghdl\ghdl-0.31-mcode-win32\lib\v93\std\
  C:\Ghdl\ghdl-0.31-mcode-win32\lib\v93\ieee\
person Brian Davis    schedule 10.01.2015