2017-02-11 13 views
0

なぜModelSimはコンポーネントのインスタンス化i1について文句を言いますか?なぜ**警告:NUMERIC_STD.TO_INTEGER:メタバールが検出され、0を返しますか?

時間:0 psの反復:1インスタンス:/ 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ナノ秒で、そのため、無効な値(おそらく "UUUU")でto_integerを実行しています。デザインをリセットして間違っていることを示すまで、これらの警告のいくつかは予期されます。しかし、リセット後にそれらを取得した場合、あなたは問題があります。 –

+0

しかし、私はreset_n <= '0'をやっています! 変更する必要はありますか? –

+0

同じタイプの後続の警告を停止する必要があります。 –

答えて

0

警告は、常に問題ではありません戻って、検出されました例えば、この場合には。コードは、おそらくシミュレートし、合成します。

この場合、警告は、numeric_std.to_integer()がいわゆるメタデータを取得しているために発生します。つまり、入力になり、整数に変換できません。例えば、'X'または'U'です。

あなたはuser1155120はコメントで説明し何ができるのエラーメッセージをしたくない場合は、次のmodelsim.iniコメント解除に...

または彼はまたことを説明しNumericStdNoWarnings = 1

を設定例えば、IEEE1076-2008に記載されているように、IEEE1076規格によってnumeric_stdパッケージを修正することが許されている:

16.8.5.2許容される変更 この規格に準拠したツールのベンダーは、パッケージ宣言を変更してはならない。 [...] NUMERIC_BITおよびNUMERIC_STDパッケージのパッケージ本体は、値FALSEを持つNO_WARNINGという名前の定数を宣言します。ユーザーがTRUEにNO_WARNING設定し、これらのパッケージ内の関数の呼び出しによって生成された警告メッセージを抑制するために、パッケージ本体を再解析することがあります。[...]

代替オプションが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

明示的にメタ値をフィルタリングするために 'Is_X'を使うことを強くお勧めします。彼らは理由のためにそこにあり、0 ns以外の任意の時間のために、あなたはおそらく本当に生成された警告が欲しいです。 – rainer

+0

私は同意しますが、TSは一見混乱してしまい、それらが消えたがっていると思っています。 – JHBonarius

+0

まったくありません:彼は彼らが0 nsで行ってもらいたいと思っています。このようなものが本当に必要な場合は、Is_X(x)とnow = 0のときに 'x_nometa <= (others=> '0'というよりむしろx('警告、私のVHDLはEmacsなしでかなり錆びています。 – rainer

0

あなたはすべての信号

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

にデフォルト値を割り当てることによって、これらのほとんどを取り除くことができますいくつかのケースでは、シミュレーションの解像度がさらに下にあるブロックから開始することができますにこれらは依然として問題となる可能性があります。 FPGAベンダーのシミュレーションモデルでは、時間0の信号の未解決の値が表示されます。それは警告をオフにすることをお勧めしませんよう完全にあなたのシミュレーションで持つことができ、ファイルを実行します。

セットNumericStdNoWarnings 1
ラン0 PS
セットNumericStdNoWarnings 0

関連する問題