在一个项目上进行自我检查,并且遇到一个我不明白的问题。
以下代码的问题是模拟中的错误。我将在代码中指出错误的来源:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
ENTITY TestBenchAutomated IS
-- Generics passed in
generic (m: integer := 3; n: integer := 5; h: integer := 4; DATA_SIZE: integer :=5);
END TestBenchAutomated;
ARCHITECTURE behavior OF TestBenchAutomated IS
-- Component Declaration for the Unit Under Test (UUT)
COMPONENT TopLevelM_M
generic (m: integer := 3; n: integer := 5; h: integer := 4; DATA_SIZE: integer :=5);
PORT(
clk : IN std_logic;
next_in : IN std_logic; --User input
rst_in : IN std_logic; --User input
OUTPUT : OUT SIGNED((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0) --Calculated DATA output
);
END COMPONENT;
--Inputs
signal clk : std_logic := '0';
signal next_in : std_logic := '0';
signal rst_in : std_logic := '0';
--Outputs
signal OUTPUT : SIGNED((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0);
-- Clock period definitions
constant clk_period : time := 10 ns;
--Variable to be used in assert section
type Vector is record
OUTPUT_test : SIGNED((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0);
end record;
type VectorArray is array (natural range <>) of Vector;
constant Vectors : VectorArray := (
-- Values to be compaired to calculated output
(OUTPUT_test =>"000000110000"), -- 48
(OUTPUT_test =>"000011110110"), -- 246
(OUTPUT_test =>"000101001000"), -- 382 <--- Purposefully incorrect value, Should be '000100001000' = 264
(OUTPUT_test =>"111111010011"), -- -45
(OUTPUT_test =>"111101001100"), -- -180
(OUTPUT_test =>"111111001111"), -- -49
(OUTPUT_test =>"000000101011"), -- 43 Purposefully incorrect value, Should be '000010101011' = 171
(OUTPUT_test =>"000000010011"), -- 19
(OUTPUT_test =>"111111100101"), -- -27
(OUTPUT_test =>"111110111011"), -- -69
(OUTPUT_test =>"111110111011"), -- -69
(OUTPUT_test =>"000000101101"), -- 45
(OUTPUT_test =>"111011011110"), -- -290
(OUTPUT_test =>"000001010110"), -- 86
(OUTPUT_test =>"000011110010"), -- 242
(OUTPUT_test =>"00000111110"), -- 125
(OUTPUT_test =>"111111001001"), -- -55
(OUTPUT_test =>"000100010101"), -- 277
(OUTPUT_test =>"111111100011"), -- -29
(OUTPUT_test =>"111101111101"));-- -131
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: TopLevelM_M PORT MAP (
clk => clk,
next_in => next_in,
rst_in => rst_in,
OUTPUT => OUTPUT
);
-- Clock process definitions
clk_process :process
begin
clk <= '0';
wait for clk_period/2;
clk <= '1';
wait for clk_period/2;
end process;
-- Process to simulate user input and to check output is correct
Test :process
variable i : integer;
begin
wait for 100 ns;
rst_in <= '1';
wait for clk_period*3;
rst_in <= '0';
--Loops through enough times to cover matrix and more to show it freezes in S_Wait state
for i in 0 to 50 loop
for i in Vectors'range loop
next_in <= '1';
wait for clk_period*5;
next_in <= '0';
wait for clk_period*4; --Appropriate amount of clock cycles needed for calculations to be displayed at output
--Check the output is the same as expected
assert OUTPUT = Vectors(i).OUTPUT_test
report "Incorrect Output on vector line" & integer'image(i) &
lf & "Expected:" & integer'image(i)(to_integer((Vectors(i).OUTPUT_test))) --& lf &
--"But got" & integer'image(i)(to_integer(signed(OUTPUT)))
severity error;
end loop;
end loop;
wait;
end process;
END;
正如您在向量中看到的,我插入了两个不正确的值以确保代码有效。我在那里期待模拟中的错误,告诉我向量的地址2有错误,它是什么整数。然而,模拟停止了,我明白了:
错误:索引328超出范围1对1。 错误:正在处理TestBenchAutomated.vhd:测试
信息:模拟器已停止。
显然,由向量中的二进制数表示的整数328会导致此错误,但我不明白为什么它会导致此错误而不是我编码的错误。这个指数超出了OF的范围是什么?
非常感谢任何帮助。
由于
答案 0 :(得分:0)
此:
report "Incorrect Output on vector line" & integer'image(i) &
lf & "Expected:" & integer'image(i)(to_integer((Vectors(i).OUTPUT_test)))
应该是:
report "Incorrect Output on vector line" & integer'image(i) &
lf & "Expected:" & integer'image(to_integer((Vectors(i).OUTPUT_test)))
它抱怨值(to_integer((Vectors(i).OUTPUT_test)))
超出了某个字符的范围,因为它应该被用作'IMAGE
的参数,您已将其作为i
提供。
对于简化的测试用例:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity foo is
constant m: integer := 3;
constant n: integer := 5;
constant h: integer := 4;
constant DATA_SIZE: integer :=5;
end entity;
architecture fum of foo is
signal OUTPUT : SIGNED((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0) := "000011110110" ;
type Vector is record
OUTPUT_test : SIGNED((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0);
end record;
type VectorArray is array (natural range <>) of Vector;
constant Vectors : VectorArray := (
-- Values to be compaired to calculated output
(OUTPUT_test =>"000011110110"), -- 246 (CORRECT)
(OUTPUT_test =>"000101001000") -- 382 (INCORRECT)
);
begin
TEST:
process
begin
for i in Vectors'RANGE loop
assert OUTPUT = Vectors(i).OUTPUT_test
report "Incorrect Output on vector line " & integer'image(i) &
-- lf & "Expected:" & integer'image(i)(to_integer((Vectors(i).OUTPUT_test)))
lf & "Expected:" & integer'image(to_integer((Vectors(i).OUTPUT_test)))
severity error;
end loop;
wait;
end process;
end architecture;
不正确的用法,Nick Gasson的nvc给出了:
david_koontz @ Macbook:nvc -a foo.vhdl
**错误:预期属性IMAGE有2个参数,但有3个 文件foo.vhdl,第34行 lf&amp; &#34;预期:&#34; &安培;整数&#39; image(i)(to_integer((Vectors(i).OUTPUT_t ...^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
使用正确数量的参数`&#39; IMAGE&#39; (如例子所示):
david_koontz @ Macbook:nvc -r foo
**致命:0ms + 0:断言错误:矢量线1上的输出不正确 预计:328
过程:foo:测试
文件foo.vhdl,第32行
发现一个ghdl错误,在可能的情况下不报告此问题。它以任何一种方式工作(这应该是运行时错误)。整数值382不是符合连接条件的字符。
Tristan Gingold(ghdl作者)指出表达式是'IMAGE
函数的字符串输出的元素索引。
进一步分析揭示了问题原始代码的错误消息的基础:
& integer'image(i)(to_integer((Vectors(i).OUTPUT_test)))
T&#39; IMAGE(X)
种类:功能。 前缀:任何标量类型或子类型T.
参数:类型为T的基本类型的表达式。
结果类型:类型字符串 结果:参数值的字符串表示形式,没有
领先或尾随空格。
没有连接运算符。
(to_integer((Vectors(i).OUTPUT)))返回记录元素OUTPUT的整数值,类型为signed。 (除了多余的括号)。
向量(i).OUTPUT的内容是
constant Vectors : VectorArray := (
(OUTPUT_test =>"000011110110"), -- 246 (CORRECT)
(OUTPUT_test =>"000101001000") -- 382 (INCORRECT)
);
382应为328,其为0x148。阅读障碍很难拼写。
在这种情况下,对于i = 1(向量&#39; RANGE是(0到1),是 &#34; 000101001000&#34;其中to_integer为328,超出了字符串元素的范围(元素类型字符)。
整数,值328或不是记录的元素索引类型(当OUTPUT为时)。
&#39; IMAGE的未命名字符串输出的子类型是i的字符串长度,其值为1,长度为1,范围为1到1. 328超出范围。
请注意,ISIM消息在原始模型中完全相同:
错误:索引328超出范围1到1.错误:正在处理TestBenchAutomated.vhd:测试
这仍然看起来像ghdl错误。但它确实使nvc的错误信息成为可能。