我已经开始尝试让我的测试台为我做一些错误检查。在下面的模型中,我使用一个过程来检查两个值是否相等,如果是,则将布尔表达式更改为true。 问题在于它根本没有变化。它检查的整数值似乎没有在模拟中更新,但我在架构模型中添加了一个多路复用器以进行双重检查,它似乎响应了HOW_MANY的整数值的变化。模型和模拟如下
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY rt IS
PORT (oranges, apples : IN std_logic_vector(3 DOWNTO 0);
number : IN integer;
pears : OUT std_logic);
END ENTITY rt;
ARCHITECTURE struct OF rt IS
SIGNAL HOW_MANY : integer;
BEGIN
HOW_MANY <= to_integer(unsigned(apples) + unsigned(oranges));
pears <= '1' WHEN how_many = 2 ELSE
'0';
END ARCHITECTURE struct;
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
ENTITY test IS
END ENTITY test;
ARCHITECTURE io OF test IS
SIGNAL oranges, apples : std_logic_vector(3 DOWNTO 0);
SIGNAL number : integer;
SIGNAL pears : std_logic;
SIGNAL ERROR : boolean := FALSE;
SIGNAL HOW_MANY : integer;
SIGNAL int_oranges : natural;
BEGIN
H1 : ENTITY work.rt(struct)
PORT MAP (oranges, apples, number, pears);
oranges <= std_logic_vector(to_unsigned(int_oranges,4));
TESTER : PROCESS IS
BEGIN
int_oranges <= 3;
apples <= "0001";
number <= 4;
WAIT FOR 1 ns;
int_oranges <= 7;
apples <= "0001";
number <= 4;
WAIT FOR 1 ns;
int_oranges <= 1;
apples <= "0001";
number <= 2;
WAIT FOR 1 ns;
END PROCESS TESTER;
E_C : PROCESS (apples, int_oranges, number) IS
BEGIN
ERROR <= number = HOW_MANY;
END PROCESS E_C;
END ARCHITECTURE io;
模拟
你可以看到HOW_MANY整数永远不会改变值和布尔值,但是梨的值std_logic值确实会改变。
干杯 d
答案 0 :(得分:2)
您不会将how_many
传递给实体rt的架构结构。
实体测试的架构io中的信号how_many
未分配,并且没有提供初始值。
对于标量类型,这意味着默认初始值为T'LEFT或-2147483648,如波形上所示,显示test / HOW_MANY的值。
答案 1 :(得分:2)
@ User1155120已经回答了具体细节。
更多背景知识:VHDL是一种比通常所假设的语言更高级的语言,不仅是强类型语言,而且它以包和实体的形式为抽象和封装提供了非常好的工具。
具体来说,这里是&#34;实体&#34;是rt
的公共接口,而体系结构是私有的:没有其他东西可以检查内部。在&#34; C&#34;术语就像它HOW_MANY
信号被声明为static
一样。在测试平台中声明的HOW_MANY
信号是一个完全独立的信号,与rt.HOW_MANY
没有连接。请注意,无法从顶层访问限定名称rt.HOW_MANY
- 这会破坏抽象。
那么这对测试平台意味着什么呢?
传统上,测试一直在&#34;黑盒子&#34;每个实体的基础:设置其输入端口,检查其输出端口,即测试其公共接口,这是验证它是否符合其规范所需要做的全部工作。 (并使用经过单元测试的组件组装更大的设计)。
在VHDL-2008之前,没有能力打破抽象 - 并观察内部细节(可能在同一实体的不同架构之间有所不同),尽管您可以检查模拟器中的所有内部信号。波形输出。
VHDL-2008引入了语法,允许测试平台打破抽象,并允许通过&#34;外部名称&#34;直接访问内部信号。 ...请参阅此introduction from Doulos和此StackExchange Q&A。
很明显,这很脆弱:更改架构中的一些内部细节,通常需要重写测试平台才能匹配。
我还没有找到它的好用...
您的模拟器是否支持VHDL-2008外部名称是另一回事:可能需要启用VHDL-2008编译,或者您可能需要联系工具供应商并提供添加功能的增强请求(或找到一个更好的工具。)