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