VHDL测试平台报告错误

时间:2014-03-17 21:59:48

标签: indexing vhdl simulation

在一个项目上进行自我检查,并且遇到一个我不明白的问题。

以下代码的问题是模拟中的错误。我将在代码中指出错误的来源:

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的范围是什么?

非常感谢任何帮助。

由于

1 个答案:

答案 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的错误信息成为可能。