我正在编写一个需要将输入值与零进行比较的VHDL过程。输入可能包含元值('U','X','L','H'等),在这种情况下不应声明零。
不幸的是,ModelSim会在每次比较时发出警告:
# ** Warning: NUMERIC_STD."=": metavalue detected, returning FALSE
# Time: 14 ns Iteration: 1 Instance: /tb/uut
有关如何编码以下内容的任何想法,以避免此类警告?全局关闭numeric_std警告不是一种选择。
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
entity Test is
port (
clk : in std_logic;
reset : in std_logic;
i_in_data : in unsigned(31 downto 0);
o_out_zero : out std_logic
);
end Test;
architecture rtl of Test is
begin
process(clk, reset) begin
if(reset='1') then
o_out_zero <= '0';
elsif(rising_edge(clk)) then
if(i_in_data = (i_in_data'range=>'0')) then
o_out_zero <= '1';
else
o_out_zero <= '0';
end if;
end if;
end process;
end architecture;
答案 0 :(得分:1)
如果o_out_zero
的输出在元值存在的情况下无关紧要,那么来自numeric_std的有用函数to_01
可用于在比较表达式中消除它们。另见to_01xz等用于类似目的......
替换
if(i_in_data = (i_in_data'range=>'0')) then
与
if to_01(i_in_data) = (i_in_data'range=>'0') then
它应该是好的。
你知道if语句中布尔表达式周围的括号是不必要的,对吧? VHDL看起来越少越好......