VHDL中的类型转换:实数到整数 - 是否指定了舍入模式?

时间:2015-01-07 16:17:15

标签: type-conversion vhdl xilinx xilinx-ise vivado

在调试Vivado(read more)中用户定义的物理类型的处理时,我发现了从真实到整数的类型转换的不同行为。

这是我的示例代码:

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似乎使用模式向上舍入,它处理类型转换包括范围检查。 因此,我必须使用integer(-0.5)代替natural(-0.5)

Vivado 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似乎使用模式 round to infinity 并且它在没有范围检查的情况下处理类型转换。因此,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是否定义了舍入模式?如果是这样的话?
  • 如果没有定义模式,我该如何处理舍入?

2 个答案:

答案 0 :(得分:7)

来自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中的功能可能会有所帮助(尤其是CEILFLOOR和/或TRUNC)。

答案 1 :(得分:0)

(将此作为答案发布,因为我无法在内容发布评论......)

以下是使用预建的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

&#34; 0.31是我的Windows机器(mcode版本)&#34; &#34; GHDL拒绝分析我的代码&#34;

如果您在Windows mcode版本为0.31的库中遇到问题,请尝试在该计算机上卸载任何0.29或更早版本的GHDL安装程序版本的GHDL。 还要确保按照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\