为什么**警告:NUMERIC_STD.TO_INTEGER:检测到元值,返回0?

时间:2017-02-11 20:52:52

标签: vhdl modelsim

为什么Modelsim会抱怨组件实例化i1?

  

时间:0 ps迭代次数:1实例:/ vhdl2_uppgift_1_extra_vhd_tst / i1
  **警告:NUMERIC_STD.TO_INTEGER:检测到元数据,返回0

.as-console-wrapper { max-height: 100% !important; top: 0; }

2 个答案:

答案 0 :(得分:1)

警告并不总是一个问题,例如在这种情况下。代码可能会模拟和合成等等。

在这种情况下,引发警告是因为numeric_std.to_integer()正在获得所谓的元值,这意味着它是一个无法转换为整数的输入。例如'X''U'

如果您不想要错误消息,可以执行评论中描述的user1155120:

  

...在modelsim.ini取消注释或设置NumericStdNoWarnings = 1

他还描述了IEEE1076标准允许修改numeric_std包,如IEEE1076-2008中所述:

  

16.8.5.2允许的修改   符合本标准的工具供应商不得修改包装声明。 [...]   NUMERIC_BIT和NUMERIC_STD包的包体声明了一个名为NO_WARNING的常量,其值为FALSE。用户可以将NO_WARNING设置为TRUE并重新分析包体以禁止通过调用这些包中的函数生成警告消息。[...]

另一种选择是使用xy的中间变量,并使用函数Is_X()来检测和阻止元值。但是,我不确定它是否会合成。例如:

x_nometa <= (others=>'0') when Is_X(x) else x;

我在你的代码中注意到的另一件事是你使用BUFFER - 类型的端口。你最好不要使用它们。例如FPGA供应商不能正确支持它们。例如。 Xilinx。有很多方法可以解决这个问题:How to stop using "buffer" ports in VHDL

答案 1 :(得分:0)

您可以通过为所有信号分配默认值来消除大部分信号

SIGNAL x           : STD_LOGIC_VECTOR(9 DOWNTO 0) := (others => '0');

在某些情况下,模拟分辨率可以从层次结构中较低的块开始,这些仍然可能是一个问题,例如,使用FPGA供应商的仿真模型,可以看到信号在时间0处未解决的值。因为不建议完全关闭警告,您可以在模拟文件中找到:

  

设置NumericStdNoWarnings 1
  运行0 ps
  设置NumericStdNoWarnings 0