为什么信号分配不在第一次迭代时执行?超高密度语言

Why does signal assignment not execute on the first iteration? VHDL

我是 VHDL 新手。我听说信号分配只在进程结束时更新,并且只会使用最近的分配,所以我想测试一下。为什么 temp 的值在第一个过程结束时没有更新(i=0),即使我已经有了 a、b、c 的初始值?它仅在第二次迭代 (i=1) 时才开始更新 temp 的值。

我用来测试的代码:

architecture Behavioral of test is
    signal a    : integer := 1;
    signal b    : integer := 2;
    signal c    : integer := 3;
    signal i    : integer := 0;
    signal temp, temp2  : integer;
begin
    process is
    begin
        report "-----Start Here-----(" & integer'image(i) & ")";
        temp <= a;      report "1:" & integer'image(temp);
        temp <= b;      report "2:" & integer'image(temp);
        temp <= c;      report "3:" & integer'image(temp);

        temp2 <= a;     report "4:" & integer'image(temp2);
        temp2 <= temp;  report "5:" & integer'image(temp2);
        report "-----End Here----------------------------";
        
        i <= i + 1;
        wait for 10ns;
    end process;
end architecture;

输出:

-----Start Here-----(0)
1: -2147483648                  
2: -2147483648
3: -2147483648
4: -2147483648
5: -2147483648
-----End Here----------------------------
-----Start Here-----(1)
1: 3
2: 3
3: 3
4: -2147483648
5: -2147483648
-----End Here----------------------------
-----Start Here-----(2)
1: 3
2: 3
3: 3
4: 3
5: 3
-----End Here----------------------------

发生信号分配时,它会安排在进程遇到等待语句(没有敏感列表时)或进程完成(有敏感列表时)时更新值。 在您的流程中,在时间 0,流程开始。 temp 具有初始值 integer'low。您分配 a,然后分配 b,最后分配 c(哪个获胜,temp 将被安排分配 c)。请记住,此时没有等待语句命中,因此信号分配还没有发生。因此,为什么 report 都报告 temp 的初始值。

如果将报告语句移到等待语句之后,您会看到更新后的值。