1

ROMモジュールを実装しようとしており、そのテストベンチを構築しています。rom.vhd のチェック構文は「正しい」と表示され、テスト ベンチ ファイルも「正しい」と表示されますが、simluate をクリックするとエラーが表示されます。

以下は、表示されるコードとエラーです。

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
----------------

entity rom is 
port ( clk : in std_logic ;
     address : in integer range 0 to 15 ;
     data_out : out std_logic_vector( 7 downto 0 )) ;
end entity ;

------------------
architecture arch of rom is 

signal reg_address : integer range 0 to 15 ;
type memory is array ( 0 to 15 ) of std_logic_vector( 7 downto 0 ) ;
constant myrom : memory := (
2 => "11111111" , --255
3 => "11010101" , 
4 => "01101000" , 
6 => "10011011" , 
8 => "01101101" , 
9 => "00110111" , 
others => "00000000" ) ;
begin 
process(clk)
begin 
if( clk'event and clk = '1' ) then
    reg_address <= address ;
end if ;
end process ;
---------------
data_out <= myrom(reg_address) ;
 end architecture ;

テストベンチ ファイル:

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
----------------

entity rom_tb is 
end entity ;

-----------------------
architecture tb of rom_tb is 
component rom is 
port ( clk : in std_logic ;
     address : in integer range 0 to 15 ;
     data_out : out std_logic_vector( 7 downto 0 )) ;
end component ;
--------------------------
signal clk_tb : std_logic := '0' ;
signal address_tb : integer := 0 ; 
signal data_out_tb : std_logic_vector( 7 downto 0 ) ;
--------------------------
begin 
dut : rom port map (
    clk => clk_tb ,
    address => address_tb ,
    data_out => data_out_tb ) ;
------------------
clk_tb <= not clk_tb after 20ns ;
address_tb <= 1 after 30ns ,
                 2 after 60ns ,
                 3 after 90ns ,
                  4 after 120ns ,
                 5 after 150ns ,
                 6 after 180ns ,
                 7 after 210ns ,
                 8 after 240ns ,
                 9 after 270ns ,
                10 after 300ns ,
                11 after 330ns ,
                12 after 360ns ,
                13 after 390ns ,
                14 after 420ns ,
                15 after 450ns ;
 end architecture ; 

エラーは:

ERROR:Simulator:29 - at 0 ns : in rom_tb(tb), file D:/VHDLPrograms/Tb/ROM/rom_tb.vhd: コンポーネント ROM へのエンティティ ROM のデフォルト ポート マップは、コンポーネントの INTEGER タイプのローカル ポート アドレスを std_logic_vector に接続しますエンティティのタイプ ポート。

4

1 に答える 1

3

上に投稿した (良い) テストベンチが、実際にシミュレートしているものであることを確認してください。

ザイリンクス ツールを使用して ROM などの VHDL エンティティのテストベンチを生成すると、すべてのポート データ型が自動的に std_logic[_vector] に変換されるため、結果のテストベンチは修正するまで機能しません。あなたが報告しているエラーは、プロジェクトに複数の "rom_tb" ファイルがあるように聞こえます。それが問題でない場合は、「すべて再実行」または「Project/Clean Project Files」を試してから「すべて再実行」して、すべてのファイルの古いコンパイル済みバージョンを削除してください。

編集: 配線後のシミュレーションには逆の問題があります。整数ポートは、synth/P&R プロセスによって std_logic_vector に変換されています。1 つの解決策は、「Rom」エンティティのように見えるが、アーキテクチャがアドレス ポートを「unsigned」、次に「std_logic_vector」に変換し、それを ROM のポスト PAR バージョンに渡すラッパー ファイルを作成することです。

ツールの信頼性を高めるために、PAR 後のシミュレーションを 1 回または 2 回実行することをお勧めしますが、定期的に行うべきではありません。通常、ツールのバグ (不適切な合成) または非同期ロジック (クロス クロック ドメイン) を追跡する場合を除き、ビヘイビアー シミュレーションと PAR 後のスタティック タイミング解析で十分です。

于 2013-07-10T20:26:41.183 に答える