2016-01-22 16 views
0

我已經開始嘗試讓我的測試臺爲我做一些錯誤檢查。在下面的模型中,我使用一個進程來檢查兩個值是否相等,如果是這樣,請將布爾表達式更改爲true。 問題在於它根本沒有改變。它檢查的整數值在仿真中似乎沒有更新,但我在體系結構模型中添加了一個多路複用器來進行仔細檢查,並且它似乎響應HOW_MANY整數值的變化。模型和仿真下面VHDL - 更新錯誤檢查的整數值

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.numeric_std.ALL; 

ENTITY rt IS 
PORT (oranges, apples : IN std_logic_vector(3 DOWNTO 0); 
     number    : IN integer; 
     pears     : OUT std_logic); 
END ENTITY rt; 

ARCHITECTURE struct OF rt IS 
SIGNAL HOW_MANY : integer; 
BEGIN 
HOW_MANY <= to_integer(unsigned(apples) + unsigned(oranges)); 
pears <= '1' WHEN how_many = 2 ELSE 
      '0'; 
END ARCHITECTURE struct; 

LIBRARY IEEE; 
USE IEEE.std_logic_1164.ALL; 
USE IEEE.numeric_std.ALL; 

ENTITY test IS 
END ENTITY test; 

ARCHITECTURE io OF test IS 
SIGNAL oranges, apples  : std_logic_vector(3 DOWNTO 0); 
SIGNAL number     :  integer; 
SIGNAL pears     : std_logic; 
SIGNAL ERROR     : boolean := FALSE; 
SIGNAL HOW_MANY   : integer; 
SIGNAL int_oranges  : natural; 
BEGIN 
H1 : ENTITY work.rt(struct) 
     PORT MAP (oranges, apples, number, pears); 

oranges <= std_logic_vector(to_unsigned(int_oranges,4)); 
TESTER : PROCESS IS 
BEGIN 
    int_oranges <= 3; 
    apples <= "0001"; 
    number <= 4; 
     WAIT FOR 1 ns; 
    int_oranges <= 7; 
    apples <= "0001"; 
    number <= 4; 
     WAIT FOR 1 ns; 
    int_oranges <= 1; 
    apples <= "0001"; 
    number <= 2; 
     WAIT FOR 1 ns; 
END PROCESS TESTER; 

E_C : PROCESS (apples, int_oranges, number) IS 
BEGIN 
    ERROR <= number = HOW_MANY; 
END PROCESS E_C; 
END ARCHITECTURE io; 

模擬

enter image description here

你可以看到HOW_MANY整數從不與布爾值一起變化值,但梨值STD_LOGIC值確實發生了改變。

乾杯 d

回答

2

你不及格how_many出實體RT的建築結構體。

在實體測試的體系結構的IO信號how_many未分配和它沒有提供一個初始值。

這意味着爲一個標量類型所見波形上顯示測試/ HOW_MANY的值與爲T'LEFT或-2147483648默認初值。

enter image description here

+0

嗨,感謝您的回覆,我需要將以下語句添加到io體系結構中嗎? \t HOW_MANY <= to_integer(unsigned(apple)+ unsigned(oranges)); – hoboBob

+0

從實例化的RT中傳遞它不是更容易嗎? – user1155120

2

@ User1155120已回答的具體細節。

更多背景:VHDL是一種比通常假設的更高級別的語言,它不僅是強類型的,而且它以封裝和實體的形式提供了非常好的抽象和封裝功能。

具體來說,這裏的「實體」是rt公共接口,而架構是私人:沒有別的可以檢查內部。以「C」的形式,它好像其HOW_MANY信號被宣佈爲static。在測試臺中聲明的HOW_MANY信號是完全獨立的信號,沒有連接到rt.HOW_MANY。請注意,合格名稱rt.HOW_MANY無法從頂層訪問 - 這會打破抽象。

那麼,是什麼暗示的測試平臺?

傳統上,對於每個實體,測試一直處於「黑匣子」的基礎上:設置其輸入端口,檢查其輸出端口,即測試其公共接口的干擾,這就是您需要驗證的一切它符合其規格。 (並且從單元測試的組件中組裝更大的設計)。儘管您可以檢查仿真器波形輸出中的所有內部信號,但在VHDL-2008之前,沒有能力打破抽象 - 並觀察內部細節(對於同一個實體可能會在不同架構之間有所不同)。

VHDL-2008引入了語法來允許測試平臺打破抽象,並允許通過「外部名稱」直接訪問內部信號......見introduction from DoulosStackExchange Q&A

很明顯,這是很脆弱的:改變體系結構中的一些內部細節,你通常必須重寫測試平臺來匹配。

我還沒有找到一個很好的利用它尚未...

無論您的仿真器支持VHDL-2008外部名稱則是另一回事:這可能是開啓VHDL-2008編譯的問題,或者您可能必須聯繫工具供應商,以提供增強請求以添加該功能(或查找更好的工具)。