2017-02-11 3 views
0

Почему Modelim жалуется на экземпляр компонента i1?Почему ** Предупреждение: NUMERIC_STD.TO_INTEGER: обнаружен metavalue, возвращая 0?

Время: 0 пс итерация: 1 Instance:/vhdl2_uppgift_1_extra_vhd_tst/i1
** Внимание: NUMERIC_STD.TO_INTEGER: обнаружен metavalue, возвращая 0

LIBRARY ieee;            
USE ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
LIBRARY work; 

--Add in do-file 
--set StdArithNoWarnings 1 
---run 0 ns; 
---set StdArithNoWarnings 0 
---run 20 ms;        

ENTITY vhdl2_uppgift_1_extra_vhd_tst IS 
END vhdl2_uppgift_1_extra_vhd_tst; 
ARCHITECTURE vhdl2_uppgift_1_extra_arch OF vhdl2_uppgift_1_extra_vhd_tst IS 
-- constants  
constant sys_clk_period: TIME:=20 ns;            
-- signals             
SIGNAL CLOCK_50 : STD_LOGIC; 
SIGNAL KEY   : STD_LOGIC_VECTOR(2 DOWNTO 0); 
SIGNAL reset_n  : STD_LOGIC; 
SIGNAL VGA_B  : STD_LOGIC_VECTOR(7 DOWNTO 0); 
SIGNAL VGA_BLANK_N : STD_LOGIC; 
SIGNAL VGA_CLK  : STD_LOGIC; 
SIGNAL VGA_G  : STD_LOGIC_VECTOR(7 DOWNTO 0); 
SIGNAL VGA_HS  : STD_LOGIC; 
SIGNAL VGA_R  : STD_LOGIC_VECTOR(7 DOWNTO 0); 
SIGNAL VGA_VS  : STD_LOGIC; 
SIGNAL x   : STD_LOGIC_VECTOR(9 DOWNTO 0); 
SIGNAL y   : STD_LOGIC_VECTOR(9 DOWNTO 0); 
COMPONENT vhdl2_uppgift_1_extra 
PORT (
    CLOCK_50 : IN STD_LOGIC; 
    KEY : IN STD_LOGIC_VECTOR(2 DOWNTO 0); 
    reset_n : IN STD_LOGIC; 
    VGA_B : BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0); 
    VGA_BLANK_N : BUFFER STD_LOGIC; 
    VGA_CLK : BUFFER STD_LOGIC; 
    VGA_G : BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0); 
    VGA_HS : BUFFER STD_LOGIC; 
    VGA_R : BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0); 
    VGA_VS : BUFFER STD_LOGIC; 
    x : BUFFER STD_LOGIC_VECTOR(9 DOWNTO 0); 
    y : BUFFER STD_LOGIC_VECTOR(9 DOWNTO 0) 
    ); 
END COMPONENT; 
BEGIN 

i1 : vhdl2_uppgift_1_extra 
PORT MAP (
-- list connections between master ports and signals 
CLOCK_50 => CLOCK_50, 
KEY => KEY, 
reset_n => reset_n, 
VGA_B => VGA_B, 
VGA_BLANK_N => VGA_BLANK_N, 
VGA_CLK => VGA_CLK, 
VGA_G => VGA_G, 
VGA_HS => VGA_HS, 
VGA_R => VGA_R, 
VGA_VS => VGA_VS, 
x => x, 
y => y 
); 



clock : PROCESS            
-- variable declarations          
BEGIN               
    CLOCK_50 <= '0'; 
    wait for sys_clk_period/2; 
    CLOCK_50 <= '1'; 
    wait for sys_clk_period/2; 
END PROCESS clock; 
----------------------- 

reset_n <= '0', '1' after 10*sys_clk_period; 

----------------------- 

always : PROCESS                     
BEGIN               
    -- code executes for every event on sensitivity list 
    KEY <= "110"; 
    wait for 20 ms; 
WAIT;               
END PROCESS always; 

----------------------- 

compare: PROCESS(x,y) 
    VARIABLE VGA_HS_error    : BOOLEAN := FALSE; 
    VARIABLE VGA_VS_error    : BOOLEAN := FALSE; 
    VARIABLE VGA_BLANK_error   : BOOLEAN := FALSE; 
    VARIABLE VGA_CLK_PHASE_error  : BOOLEAN := FALSE; 
    VARIABLE VGA_CLK_COUNTER   : INTEGER :=0; 
    VARIABLE CLOCK_50_COUNTER   : INTEGER :=0; 
    VARIABLE VGA_CLK_FREQUENCY_ERROR : BOOLEAN := FALSE; 
BEGIN 
--VGA_HS 
if TO_INTEGER(unsigned(x)) >= 659 AND TO_INTEGER(unsigned(x)) < 756 then 

      if VGA_HS /= '0' then 
       VGA_HS_error:= true; 
      end if; 

      ASSERT VGA_HS = '0' 
      REPORT "FAIL on VGA_HS" 
      SEVERITY ERROR; -- eller stanna simulatorn: SEVERITY FAILURE; 
      -- eller REPORT "FAIL on VGA_HS signal on horizontal position " & integer'image(x); 
     end if; 

--VGA_VS 
     if TO_INTEGER(unsigned(y)) = 493 then 

      if VGA_VS = '1' then 
       VGA_VS_error:= true; 
      end if; 

      ASSERT VGA_VS = '0' 
      REPORT "FAIL on VGA_VS" 
      SEVERITY ERROR; -- eller stanna simulatorn: SEVERITY FAILURE; 

     end if; 

--VGA_BLANK_N 
    if TO_INTEGER(unsigned(x)) < 640 and TO_INTEGER(unsigned(y)) < 480 then 

      if VGA_BLANK_N /= '1' then 
       VGA_BLANK_error:= true; 
      end if; 

      ASSERT VGA_BLANK_N = '1' 
      REPORT "VGA_BLANK_N" 
      SEVERITY ERROR; -- eller stanna simulatorn: SEVERITY FAILURE; 

     end if; 

--VGA_CLK 
    if rising_edge(VGA_CLK)AND NOT rising_edge(CLOCK_50) then 
      VGA_CLK_PHASE_error :=true; 
      ASSERT rising_edge(CLOCK_50) 
      REPORT "FAIL on VGA_CLK" 
      SEVERITY ERROR; -- eller stanna simulatorn: SEVERITY FAILURE; 

     end if; 


END PROCESS compare; 

vga_clk_test:process 

    VARIABLE TIME_VGA_CLK_RISING  : TIME; 
    VARIABLE TIME_VGA_CLK_FALLING : TIME; 
    VARIABLE TIME_DIFF     : TIME; 
    begin 
     WAIT UNTIL rising_edge(VGA_CLK); 
     TIME_VGA_CLK_RISING := now; 

     WAIT UNTIL falling_edge(VGA_CLK); 
     TIME_VGA_CLK_FALLING := now; 

     TIME_DIFF := TIME_VGA_CLK_FALLING - TIME_VGA_CLK_RISING; 

     REPORT "TEST 11: Half-periodtime : " & time'image(TIME_DIFF); 

     IF TIME_DIFF = 20000 ps THEN 
      REPORT "TEST 11: OK VGA_CLK "; 
     ELSE 
      REPORT "TEST 11: ERROR VGA_CLK"; 

     END IF; 

     wait; 
    end process vga_clk_test;           
END vhdl2_uppgift_1_extra_arch; 
+0

Потому что, на 0 нс, вы выполняете to_integer по недопустимому значению (возможно, «UUUU»). Ожидаются некоторые из этих предупреждений, пока вы не сбросите свой дизайн и не укажете ничего плохого. Но если вы их получите после сброса, у вас возникнет проблема. –

+0

Но я делаю reset_n <= '0'! Что я должен изменить? –

+0

Это должно остановить последующие предупреждения одного типа. –

ответ

0

предупреждения не всегда проблема, например, в этом случае. Код, вероятно, имитирует и синтезирует и т.п.

В этом случае предупреждение вызвано тем, что 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 ИСТИНА и повторно проанализировать тело пакета для подавления предупреждающих сообщений, генерируемых вызовов функций в этих пакетах. [...]

Альтернативным вариантом является использование промежуточной переменной для x и y и использовал функцию Is_X() для обнаружения и предотвращения метаобработки. Тем не менее, я не уверен, будет ли он правильно синтезироваться. Пример:

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

Еще одна вещь, которую я заметил в вас код, что вы использует BUFFER типа портов. Вам лучше не использовать их. Они не поддерживаются должным образом, например, поставщиками FPGA. Например. Xilinx. Есть способы обойти это: How to stop using "buffer" ports in VHDL

+1

Я настоятельно рекомендую использовать 'Is_X' для явного фильтра метаданных; они существуют по какой-то причине, и в любое время, отличное от 0 нс, вы, вероятно, действительно хотите получить предупреждение. – rainer

+0

Я согласен, но TS, похоже, смущается ими и хочет, чтобы они ушли ... – JHBonarius

+0

Не совсем: он хочет, чтобы они ушли в 0 нс, что отличает их от того, что они прошли всецело. Если вы действительно хотите что-то подобное, я бы скорее сказал «x_nometa <= (others=> '0»), когда Is_X (x) и теперь = 0 ns else x; '(предупреждение, мой VHDL довольно ржавый без Emacs;)). – rainer

0

Вы можете избавиться от большинства из них путем присвоения значения по умолчанию для всех сигналов

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

В некоторых случаях разрешение моделирование может начаться из блока, который далее вниз иерархия, и они все еще могут быть проблемой, например с имитационной моделью поставщика FPGA, которая увидит неразрешенное значение сигнала в момент времени 0.Как это не рекомендуется, чтобы отключить предупреждения в целом вы можете иметь в своем делать-файл моделирования:

набор NumericStdNoWarnings 1
пробег 0 пс
набор NumericStdNoWarnings 0

Смежные вопросы