VHDL-2008初始化ufixed在modelsim中出现错误

VHDL-2008初始化ufixed在modelsim中出现错误,vhdl,Vhdl,我正在尝试初始化(VHDL-2008)ufixed。但以下代码在Modelsim 10.5b中给出了一个错误 entity test_e is end entity; library ieee; architecture test_a of test_e is use ieee.fixed_pkg.all; constant value : ufixed(3 downto 0) := "0001"; begin end architecture; 错误消息是: 错误:[文件

我正在尝试初始化(VHDL-2008)ufixed。但以下代码在Modelsim 10.5b中给出了一个错误

entity test_e is
end entity;

library ieee;

architecture test_a of test_e is
    use ieee.fixed_pkg.all;
    constant value : ufixed(3 downto 0) := "0001";
begin
end architecture;
错误消息是:

错误:[文件].vhd(8):ieee.std_logic_1164.std_ULOGIC类型的字符文字“0”在此字符串文字的位置不可见

我可以通过将定义行更改为

constant value : ufixed(3 downto 0) := to_ufixed(1,3,0);
然后当我运行模拟时,值保持为“0001”


我不知道我做错了什么。我一直在网上寻找答案,但找不到。有人知道我做错了什么吗?

添加一个额外的
use
语句可以修复它:

entity test_e is
end entity;

library ieee;

architecture test_a of test_e is
    use ieee.std_logic_1164.all;                     -- HERE !
    use ieee.fixed_pkg.all;
    constant value : ufixed(3 downto 0) := "0001";
begin
end architecture;
这是错误还是正确的?我认为这是正确的<代码>ufixed声明如下:

type ufixed is array (integer range <>) of std_logic;
ufixed类型是std_逻辑的数组(整数范围);

我相信你会同意,仅仅因为你输入了
使用ieee.fixed\u pkg.all
,并不意味着你就可以免费获得
标准逻辑的定义。嗯,我想仅仅因为你输入了
使用ieee.fixed\u pkg.all
就意味着你也不能免费获得
std\u逻辑的定义。

Hmm有趣。我想这和
numeric_std
的问题是一样的。这可能不是一个bug,因为确实有一些方法可以让它在不加载
std_logic_1164
的情况下工作。最大的问题是modelsim的错误不明确。我会看看ghdl告诉我的。@J.H.Bonarius这与
numeric_std
完全相同-我刚刚试过。(我想我从来没有使用过没有
std\u逻辑1164
numeric\u std
。一般来说,我喜欢所有的输入和输出都是
std\u logic\u vector
,并在输入和输出的过程中进行类型转换)。请参阅问题的注释,std\u-ulogic的声明需要直接可见。(最近构建的一个)ghdl将告诉您单个字符的文字不直接可见,例如test_e.vhdl:8:44:错误:std_ulogic类型的字符“0”不可见。Modelsim错误消息准确且具有描述性。如果允许的话,您应该对每个标准逻辑字符文本都有一个错误。@user1155120我不同意:我认为它不够描述性(否则我自己会找到答案)。该错误似乎表明编译器知道字符的类型应该是
std\u ulogic
。然而,这并不表明应明确包括
std\u逻辑\u 1164
,以允许从字符串到
std\u逻辑\u向量的隐式转换。它只说了一些模糊的东西,比如“看不见”。。。这是什么意思?IMHO描述性是“没有可用于将字符串转换为ufixed的函数原型”或“声明时未定义std_ulogic类型”之类。您的混淆可能表明问题可能是“描述性给谁?”可见性在VHDL中有特定含义,标准中有一整个子项(IEEE Std 1076-2008 12.3可见性,整条被命名为12.范围和可见性)。涉及的概念有枚举名称,以位置表示类型的值(5.2.2枚举类型),枚举文本可以重载。“函数原型”未出现在标准中。标准逻辑的声明在此不直接可见。IEEE std 1076-2008 9.2.2 Literals第5段-…字符串或位字符串文字的类型只能从文字出现的上下文中确定,不包括文字本身,但使用文字类型应为1的事实-字符类型的维度数组…,第8段-与字符串文字或位字符串文字中包含的图形字符相对应的字符文字应在字符串文字的位置可见。另请参见5.2.2枚举类型。@user1155120是的,这是错误说明的。但是“可见”是什么意思?我应该如何从这个描述中推断出我需要显式地包含
std\u logic\u 1164
以进行隐式类型转换(string->std\u ulogic\u vector)要工作吗?对于构思它的人来说,描述必须是合乎逻辑的。但是对于普通用户来说,它没有足够的信息来解决问题。如果您寻求Modelsim帮助,您可能会发现(还有一个标签)任何文档都会使用VHDL标准中的术语并提供参考。您可能低估了有效使用VHDL语言所需的VHDL知识量。可见性在IEEE Std 1076-2008 12.3中有定义。还有一个术语表。它不是隐式类型转换,而是重载解析-没有字符文字表示类型的值?如果声明不可见,分析器就无法判断。如果一种语言变得如此复杂,以至于您经常需要参考最新的IEEE标准,这显然是在付费墙后面,而IMHO目前有640页难以理解的语言,我想这超出了它的目标。我很抱歉我已经使用VHDL 18年了,但仍然要与这些不清楚的例外情况作斗争。我们应该如何教我们的学生(我在一所大学工作):他们应该背诵IEEE标准吗?