2014-09-10 38 views
2

在VHDL中,當模擬測試臺時,我有一個過程和一個靈敏度列表。 是否有可能看到靈敏度列表中的哪個信號觸發了該過程?我知道這可能取決於工具。 即時通訊使用Xilinx ISE。模擬器是否提供這些信息?靈敏度列表中的哪個信號觸發過程

回答

4

可以結合使用'transaction屬性與'event,以確定哪些信號不得不在當前的增量週期一個事務:

process(a, b) is 
begin 
    if a'transaction'event then 
    report "Transaction on a"; 
    end if; 

    if b'transaction'event then 
    report "Transaction on b"; 
    end if; 
end process; 

'transaction屬性創建類型比特的一個新的信號,關於每個事務切換。該信號上的'event屬性標識何時在父信號上發生任何事務。

您還可以使用not <signal name>'quiet(0 ns)能夠確定由敏感列表這標誌着曾在上次一步一個交易:

process(a, b) is 
begin 
    if not a'quiet(0 ns) then 
    report "Transaction on a"; 
    end if; 

    if not b'quiet(0 ns) then 
    report "Transaction on b"; 
    end if; 
end process; 

後者可能是更有益的,如果你不想處理測序發生在不同的三角洲週期的事件。

+0

謝謝!看起來屬性是檢測這些的最好方法。 – Jun 2014-09-13 08:06:06

+0

您的代碼將(正確)報告A或B上是否有交易,但單純的交易不會觸發敏感列表。當然,要回答這個問題,你需要:「如果一個事件發生了」,那麼這個問題實際上就是這樣提出的。 – 2016-05-26 08:55:14

0

兩個VHDL概念是與此有關:

  • 交易:交易(:在一個仿真週期(時間和△循環)

  • 事件一個值的信號的分配賦值)導致信號值改變

因此,在每個分配給該信號的信號上都會發生交易,但只有在該分配實際上改變了信號的值時纔會發生 。

VHDL具有以下方面的屬性:

  • S'active:布爾在模擬週期發生TRUE當且僅當交易

  • S'event:布爾這是真的當且僅當事件發生在目前的模擬週期

的方法是在任何的感光度表的信號的事件恢復, 所以要確定導致恢復過程的哪一個信號(S),此 代碼可用於:

alfa: process (a, b) is 
begin 
    report "Process alfa was resumed"; 
    if a'event then 
    report "- Event on a"; 
    end if; 
    if b'event then 
    report "- Event on b"; 
    end if; 
end process; 

如果ab被賦予當前值,則不會發生。

然而,VHDL具有能夠生成在每一個交易 的變化,從而有效的交易轉換爲 事件隱式信號,由此處理可以恢復一個屬性:

  • S'transaction:當交易發生

由事務恢復了ab的方法,改變位因此,可以與由:

bravo: process (a'transaction, b'transaction) is 
begin 
    report "Process bravo was resumed"; 
    if a'active then 
    report "- Transaction on a"; 
    end if; 
    if a'event then 
    report "- Event on a"; 
    end if; 
    if b'active then 
    report "- Transaction on b"; 
    end if; 
    if b'event then 
    report "- Event on b"; 
    end if; 
end process; 

行爲可以與測試臺過程產生的刺激被示出爲:

process is 
begin 
    a <= 0;   -- Declared as natural 
    b <= 0;   -- --||-- 
    wait for 1 ns; 
    a <= 1;   -- Both transaction and event @ 1 ns 1 delta 
    wait for 0 sec; -- Delta delay 
    a <= 1;   -- Only transaction, but no event @ 1 ns 2 delta 
    wait for 0 sec; -- Delta delay 
    b <= 2;   -- Both transaction and event @ 1 ns 3 delta 
    wait for 0 sec; -- Delta delay 
    a <= 3;   -- Both transaction and event @ 1 ns 4 delta 
    b <= 3;   -- Both transaction and event @ 1 ns 4 delta 
    wait for 1 ns; 
    wait; 
end process; 

這將驅動信號,如下所示。需要注意的是ModelSims「膨脹時間 德爾塔模式」已經被用於在所述增量週期來顯示的信號變化:從處理的阿爾法

enter image description here

報告輸出(除了在0 ps的初始運行)是:

Time: 1 ns Iteration: 1 Instance: /tb # ** Note: Process alfa was resumed 
Time: 1 ns Iteration: 1 Instance: /tb # ** Note: - Event on a 

Time: 1 ns Iteration: 3 Instance: /tb # ** Note: Process alfa was resumed 
Time: 1 ns Iteration: 3 Instance: /tb # ** Note: - Event on b 

Time: 1 ns Iteration: 4 Instance: /tb # ** Note: Process alfa was resumed 
Time: 1 ns Iteration: 4 Instance: /tb # ** Note: - Event on a 
Time: 1 ns Iteration: 4 Instance: /tb # ** Note: - Event on b 
從過程喝彩

報告輸出(除了在0 ps的初始運行)是:

Time: 1 ns Iteration: 1 Instance: /tb # ** Note: Process bravo was resumed 
Time: 1 ns Iteration: 1 Instance: /tb # ** Note: - Transaction on a 
Time: 1 ns Iteration: 1 Instance: /tb # ** Note: - Event on a 

Time: 1 ns Iteration: 2 Instance: /tb # ** Note: Process bravo was resumed 
Time: 1 ns Iteration: 2 Instance: /tb # ** Note: - Transaction on a 

Time: 1 ns Iteration: 3 Instance: /tb # ** Note: Process bravo was resumed 
Time: 1 ns Iteration: 3 Instance: /tb # ** Note: - Transaction on b 
Time: 1 ns Iteration: 3 Instance: /tb # ** Note: - Event on b 

Time: 1 ns Iteration: 4 Instance: /tb # ** Note: Process bravo was resumed 
Time: 1 ns Iteration: 4 Instance: /tb # ** Note: - Transaction on a 
Time: 1 ns Iteration: 4 Instance: /tb # ** Note: - Event on a 
Time: 1 ns Iteration: 4 Instance: /tb # ** Note: - Transaction on b 
Time: 1 ns Iteration: 4 Instance: /tb # ** Note: - Event on b 

所以,可以看出,反式僅在1 ns處動作,僅針對a的動作信號變化delta 2僅由進程中的事務檢查bravo報告,並且沒有與此相關的事件 this。

0

@Morten,所以使用事件和事務我甚至可以捕獲我發送相同的值的信號連續的實例。 如示例中那樣:

a < = 0; - 聲明爲天然

b < = 0;
等待1納秒;

a < = 1; - 交易和事件@ 1納秒1德爾塔

等待0秒; - 三角延遲

a < = 1; - 只有交易,但沒有事件@ 1 ns 2 delta

等待0秒; - 德爾塔延遲

在該行,其中分配相同的值的信號 'A'

一個< = 1; - 只有交易,但沒有事件@ 1納秒2增量

我的假設是,您可以捕獲此事務,事務= 1,事件= 0。

然而,如果在FPGA中進行合成,這仍然很棒嗎?

+0

只有交易(沒有價值變化)和「等待0秒」僅用於模擬,因爲硬件需要信號發生變化以便發生任何通信(因此不是隻有交易),並且不存在delta循環的概念硬件中等待0秒)。 – 2014-09-20 05:52:55

+1

感謝您的答覆和澄清。非常感激。 – Jun 2014-09-21 06:15:05