0

我正在编写一个需要将输入值与零进行比较的 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;
4

1 回答 1

1

如果o_out_zero存在元值的情况下 的输出无关紧要,则to_01可以使用 numeric_std 中的有用函数在比较表达式中消除它们。另见 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 看起来越不像 C,越好...

于 2012-11-27T15:59:48.807 回答