将测试平台添加到您的问题中提供了一个 最小,完整和可验证的例子 。
对于我们这些无法准确解释您的波形显示的人来说,彩色版本以及显示移动到波形关键部分的值的光标可能会有所帮助:
在这个波形显示中,我们看到标量信号(clk等)在你的莱迪思工具链中显示为'X',显示为'X'的红色矩形(上面的波形用gtkwave和ghdl完成)。
时钟在'X'和'0'之间变化告诉我们测试平台中有两个clk驱动程序,当两个驱动程序都驱动'0'时'0'显示。
通过分配进程中的信号来创建驱动程序。
并发信号分配详细说明为等效过程(IEEE Std 1076-2008 11.6并发信号分配语句 “并发信号赋值语句表示为信号赋值的等效进程语句。”其敏感性列表由10.2 Wait语句确定“此规则还用于在并发过程调用语句(11.4),并发断言语句(11.5)和并发信号赋值语句的等效过程语句中构造等待语句的敏感性集合(11.6)。“。
具有多个驱动器的信号的值根据14.7.3.2驱动值中的规定确定:
e)如果S是基本信号: ... 如果S是已解析的信号且具有一个或多个源,则检查S源的驱动值。如果这些驱动值中的任何一个是复合,其中一个或多个子元素值由空事务确定(参见10.5.2.2)并且一个或多个子元素值不由空事务确定,则会出错。如果S是信号种类寄存器并且S的所有源具有由空事务确定的值,则S的驱动值与其先前值不变。否则,通过执行与S相关联的分辨率函数来获得S的驱动值,其中使用由S的源的驱动值的级联组成的输入参数来调用该函数,除了任何源的值之外S的当前值由空事务确定。
e)如果S是基本信号:
... 如果S是已解析的信号且具有一个或多个源,则检查S源的驱动值。如果这些驱动值中的任何一个是复合,其中一个或多个子元素值由空事务确定(参见10.5.2.2)并且一个或多个子元素值不由空事务确定,则会出错。如果S是信号种类寄存器并且S的所有源具有由空事务确定的值,则S的驱动值与其先前值不变。否则,通过执行与S相关联的分辨率函数来获得S的驱动值,其中使用由S的源的驱动值的级联组成的输入参数来调用该函数,除了任何源的值之外S的当前值由空事务确定。
在IEEE软件包std_logic_1164中找到类型std_logic的解析函数。
那么clk(和clk64)的两个驱动程序在哪里?
En <= '0'; clk <= '0'; clk65 <= '0'; Ipin <= B"0000"; -- *** Test Bench - User Defined Section *** tb : PROCESS BEGIN wait for delay; clk <='1'; clk65 <='1'; wait for delay; clk <='0'; wait for delay; clk <='1'; clk65 <='0'; wait for delay; clk <='0'; --wait; -- will wait forever END PROCESS;
紧接在进程tb之上,有四个并发赋值语句。导致多个驱动程序的两个驱动程序可以被注释掉(clk和clk64)而不需要信号声明中的初始值,因为您在进程中强制它们的值。
如果我们注释掉clk和clk65的并发信号分配,那么您的测试平台可以工作: