我收到以下错误:警告:NUMERIC_STD。"< =":检测到metavalue,在我运行代码时在Modelsim中返回FALSE。
只有在使用reg_go和reg_n寄存器时才会发生错误。如果不使用寄存器,代码工作正常。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.config_pkg.all;
use work.user_pkg.all;
entity memory_map is
port (
clk : in std_logic;
rst : in std_logic;
wr_en : in std_logic;
wr_addr : in std_logic_vector(MMAP_ADDR_RANGE);
wr_data : in std_logic_vector(MMAP_DATA_RANGE);
rd_en : in std_logic;
rd_addr : in std_logic_vector(MMAP_ADDR_RANGE);
rd_data : out std_logic_vector(MMAP_DATA_RANGE);
-- application-specific I/O
go : out std_logic;
n : out std_logic_vector(31 downto 0);
result : in std_logic_vector(31 downto 0);
done : in std_logic
);
end memory_map;
architecture BHV of memory_map is
signal reg_go, reg_go1 : std_logic;
signal reg_n : std_logic_vector(31 downto 0);
begin
process(clk,rst)
begin
if(rst = '1') then
reg_go <= '0';
reg_go <= '0';
reg_n <= (others => '0');
rd_data <= (others => '0');
elsif(clk'event and clk = '1') then
if(wr_en='1') then
if(wr_addr=std_logic_vector(to_unsigned(C_GO_ADDR,C_MMAP_ADDR_WIDTH))) then
reg_go <= wr_data(0);
reg_go1 <= '1';
elsif(wr_addr=std_logic_vector(to_unsigned(C_N_ADDR,C_MMAP_ADDR_WIDTH))) then
reg_n <=wr_data;
end if;
end if;
reg_go1 <= '0';
if(rd_en='1') then
if(rd_addr=std_logic_vector(to_unsigned( C_RESULT_ADDR,C_MMAP_ADDR_WIDTH))) then
rd_data <= result;
elsif(rd_addr=std_logic_vector(to_unsigned(C_DONE_ADDR,C_MMAP_ADDR_WIDTH))) then
rd_data(0) <= done;
end if;
end if;
end if;
end process;
go <= reg_go and reg_go1;
n <= reg_n;
end BHV;
答案 0 :(得分:0)
我在提供的代码中找不到<=
或reg_go
的比较reg_n
我怀疑会发出警告“NUMERIC_STD。”&lt; =“:检测到metavalue,返回FALSE“。
但是,元值是std_logic
中不代表'0'
和'1'
的额外值,例如'X'
。那么警告意味着有一个比较<=
,其中一个参数包含例如'X'
或'U'
,从而无法进行有意义的比较,因此函数返回{ {1}}。
在报告警告时查看模拟器,并检查相关参数的值,检查参数的值。