Vhdl 存储在内部变量(if语句)中的条件求值给出正确的结果,而(assert)中的直接求值给出错误的结果

Vhdl 存储在内部变量(if语句)中的条件求值给出正确的结果,而(assert)中的直接求值给出错误的结果,vhdl,vivado,Vhdl,Vivado,这是模拟结果,似乎是正确的: 我还注意到,它只发生在输出的更改边缘。否则,例如,如果输出保持较高,则不会产生错误。您有一个带有默认信号分配延迟的模型y取决于a和b,而这三者都在断言过程中进行评估y将在下一个增量模拟循环中更改。你能找出为什么不断言吗?移除其中一个等待0 ns语句。你明白为什么你得到第一个断言而没有得到其余的吗?你有一个带有默认信号分配延迟的模型y取决于a和b,而这三者都在断言过程中进行评估y将在下一个增量模拟循环中更改。你能找出为什么不断言吗?移除其中一个等待0 ns语句。你明白

这是模拟结果,似乎是正确的:


我还注意到,它只发生在输出的更改边缘。否则,例如,如果输出保持较高,则不会产生错误。

您有一个带有默认信号分配延迟的模型
y
取决于
a
b
,而这三者都在断言过程中进行评估<代码>y将在下一个增量模拟循环中更改。你能找出为什么不断言吗?移除其中一个
等待0 ns语句。你明白为什么你得到第一个断言而没有得到其余的吗?你有一个带有默认信号分配延迟的模型
y
取决于
a
b
,而这三者都在断言过程中进行评估<代码>y
将在下一个增量模拟循环中更改。你能找出为什么不断言吗?移除其中一个
等待0 ns语句。你明白为什么你得到的是第一个断言,而不是其余的吗?
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity EqTB is
end EqTB;

architecture Behavioral of EqTB is
    signal a_in, b_in: STD_LOGIC_VECTOR(1 DOWNTO 0);
    signal y_in: STD_LOGIC;
    component EqCmp is 
        port(
            a, b: in STD_LOGIC_VECTOR(1 DOWNTO 0);
            y: out STD_LOGIC
        );
    end component;
begin
    DUT: EqCmp port map(a => a_in, b => b_in, y => y_in);
    process
    begin
        a_in <= b"00";
        b_in <= b"01";
        wait for 100 ns;
        a_in <= b"11";
        b_in <= b"11";
        wait for 100 ns;
        a_in <= b"00";
        b_in <= b"00";
        wait for 100 ns;
        a_in <= b"11";
        b_in <= b"00";
        wait for 100 ns;
    end process;
    
    process (all)
        variable EQ: BOOLEAN := false;
    begin
--        if (((a_in = b_in) = true)  and y_in ='1')
--        or (((a_in = b_in) = false) and y_in = '0') then
--            EQ := true;
--        end if;
        EQ := (((a_in = b_in) = true)  and y_in ='1')
           or (((a_in = b_in) = false) and y_in = '0');
        assert (EQ)
            report "Fault occurred. " & std_logic'image(y_in) & boolean'image(EQ)
            severity ERROR;
    end process;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity EqCmp is
    Port(
        a: in STD_LOGIC_VECTOR(1 DOWNTO 0);
        b: in STD_LOGIC_VECTOR(1 DOWNTO 0);
        y: out STD_LOGIC
    );
end EqCmp;

architecture Behavioral of EqCmp is    
begin
    y <= '1' when (a = b) else '0';    
end Behavioral;
Error: Fault occurred. 'U' false
Time: 0 ps  Iteration: 0  Process: /EqTB/line__34 
Error: Fault occurred. '1' false
Time: 0 ps  Iteration: 1  Process: /EqTB/line__34  
Error: Fault occurred. '0' false
Time: 100 ns  Iteration: 1  Process: /EqTB/line__34
Error: Fault occurred. '1' false
Time: 300 ns  Iteration: 1  Process: /EqTB/line__34
Error: Fault occurred. '0' false
Time: 500 ns  Iteration: 1  Process: /EqTB/line__34
Error: Fault occurred. '1' false
Time: 700 ns  Iteration: 1  Process: /EqTB/line__34
Error: Fault occurred. '0' false
Time: 900 ns  Iteration: 1  Process: /EqTB/line__34