VHDL仿真赢得';跑不动

VHDL仿真赢得';跑不动,vhdl,ghdl,Vhdl,Ghdl,我刚刚学习了VHDL设计指南,正在完成第一章中的练习。我遇到了一个问题,我的2位多路复用器,我不明白 我的多路复用器的代码: library ieee; use ieee.std_logic_1164.all; entity multi2 is port ( a,b : in bit; sel : in boolean; z : out bit

我刚刚学习了VHDL设计指南,正在完成第一章中的练习。我遇到了一个问题,我的2位多路复用器,我不明白

我的多路复用器的代码:

library ieee;
use ieee.std_logic_1164.all;

entity multi2 is
        port
        (
            a,b     : in bit;
            sel     : in boolean;
            z       : out bit   
        );
end multi2;

architecture behave of multi2 is

begin
    storage : process is
        variable stored_d0 : bit;
    begin
    wait for 1 ns;

    if sel then
        z <= a;
    else
        z <= b;
    end if;

    end process storage;
end architecture behave;
ieee库;
使用ieee.std_logic_1164.all;
实体2是
港口
(
a、 b:比特;
sel:布尔型;
z:出位了
);
末端多克隆2;
multi2的体系结构是
开始
存储:过程是
存储的变量\u d0:位;
开始
等待1ns;
如果是sel,那么

z@user1155120如果他没有等待,他需要一个敏感度列表,否则这个过程会让其他进程饿死。如果我删除模型中的等待语句,ghdl将不会成功执行,并且我永远不会在CMD窗口中获得“达到测试结束”输出。模型重复执行该过程时会被卡住。进程在wait语句中挂起和恢复。具有敏感度列表的进程有一个隐式wait语句
wait on sensitivity\u list作为最后一条语句。否则,该过程将继续执行第一条语句。VHDL标准不要求检测到这种情况,它可能具有有限的特定用途。正如Patrick指出的,您需要一个敏感度列表来让流程挂起。这篇文章是一个可以改进的“是/否”问题。不,您不需要在流程中使用明确的等待语句。是的,你需要一份等待声明。在提供过程敏感度列表时可以隐式提供。您可以注意到,使用所示的wait语句,您的进程将每纳秒执行一次,而不考虑正在评估的信号上的事件,并且您的模型将依赖于命令行停止时间来完成模拟,直到达到时间上限(GHDL有64位时间)。谢谢。这很有帮助。也许我会研究其他VHDL参考。
    library ieee;
use ieee.std_logic_1164.all;

entity multi2_tb is
end multi2_tb;

architecture test of multi2_tb is
component multi2
    port
    (
        a,b     : in bit;
        sel     : in boolean;
        z       : out bit
    );
end component;

signal a,b       : bit;
signal sel       : boolean;
signal z         : bit;

begin
multiplexer2: multi2 port map (a => a, b => b, sel => sel, z => z);

process begin

    a <= '0';
    b <= '1';
    sel <= false;
    wait for 3 ns;

    a <= '0';
    b <= '1';
    sel <= true;
    wait for 3 ns;

    a <= '0';
    b <= '1';
    sel <= false;
    wait for 3 ns;


    assert false report "Reached end of test";
    wait;

    end process;
end test;