【问题标题】:VHDL self checking testbench Syntax error near process进程附近的 VHDL 自检测试台语法错误
【发布时间】:2014-03-17 12:33:20
【问题描述】:

正在处理一个需要自检测试台的项目,我之前编写过该测试台并且没有任何问题。

但是,这个错误在我看来甚至不存在。 错误就在底部,我写了一个箭头指示它在哪里。 如果有人能发现我显然不能非常感激的错误并且知道下次要寻找什么。

    LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;
    use IEEE.NUMERIC_STD.ALL;

    ENTITY TestBenchAutomated IS

    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;
                rst_in : IN  std_logic;
                LEDs : OUT  SIGNED((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0)
              );
         END COMPONENT;


        --Inputs
        signal clk : std_logic := '0';
        signal next_in : std_logic := '0';
        signal rst_in : std_logic := '0';

        --Outputs
        signal LEDs : SIGNED((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0);

        -- Clock period definitions
        constant clk_period : time := 10 ns;

     type Vector is record
            LEDs : SIGNED((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0);
     end record;

    type VectorArray is array
    (natural range <> ) of Vector;


    constant Vectors : VectorArray := (
    --  LEDs,       
        (X"30"), --48
        (X"f6"),--246
        (X"108"),--264
        (X"FFFFFFD3"),-- -45
        (X"FFFFFF4C"), -- -180
        (X"FFFFFFCF"),-- -49
        (X"ab"), -- 171
        (X"13"), -- 19
        (X"1B"), -- -27
        (X"45"), -- -69
        (X"45"), -- -69
        (X"2d"), -- 45
        (X"122"), -- -290
        (X"56"), -- 86
        (X"f2"), -- 242
        (X"7d"), -- 125
        (X"FFFFFFC9"), -- -55
        (X"115"), -- 277
        (X"FFFFFFE3"), -- -29
        (X"FFFFFF7D")); -- -131


    BEGIN

        -- Instantiate the Unit Under Test (UUT)
        uut: TopLevelM_M PORT MAP (
                 clk => clk,
                 next_in => next_in,
                 rst_in => rst_in,
                 LEDs => LEDs
              );

        -- Clock process definitions
    clk_process :process
    variable  i : integer;
        begin
        for i in Vectors'range loop
            LEDs <= Vectors(i).Test_LEDs;

            wait for clk_period*1;

            wait for 100 ns;
            rst_in <= '1';
            wait for clk_period*3;
            rst_in <= '0';

            for i in 0 to 50 loop --Loops through enough times to cover matrix and more to test what happens

                next_in <= '1';
                wait for clk_period*5;
                next_in <= '0';
                wait for clk_period*1;

                assert LEDs = Vectors(i).Test_LEDs
                report "The answers wrong mate" & integer'image(i)
                severity error;


            end loop;

            wait;

    end process; <------ SAYS THE ERROR IS HERE?!?
END;

感谢您的帮助。

【问题讨论】:

  • 我重新缩进了你的代码以使错误更清楚...
  • 顺便说一下,当编译器在一个简单的行上指出一个在语法上显然正确的假设错误时,它通常是该行之前的东西,通常是未闭合的循环、块等,或者丢失分号什么的。
  • 另一件事:您不需要在第 81 行声明变量 i。for 循环是一个隐式声明,并且 i 在 for 循环中表现为一个常量。此外,如果您在两个嵌套循环中重用名称 i ,可能会使人类读者感到困惑。最好写for i ... for j...

标签: syntax process vhdl


【解决方案1】:

至少,在带箭头的end process;之前,你必须添加另一个:

end loop;

合理的缩进更容易发现此类问题。

但是,这揭示了分配给constant Vectors : VectorArray 的另一个问题:

  • constant Vectors : VectorArray ... 中的元素大小不同, 因为例如X"30" 是 8 位,X"108" 是 12 位。这可以修复 通过调整大小。

  • 如果一条记录只包含一个元素,则不可能使 未命名的引用,甚至没有()。这在中明确表示 VHDL-2002 LRM 第 7.3.2 节聚合:“聚合包含单个 元素关联必须始终使用命名关联指定 将它们与带括号的表达式区分开来。”。这可以用 使用others,或命名引用。

因此声明可能会更新为:

subtype LEDs_t is signed((DATA_SIZE+DATA_SIZE)+(m-1)-1 downto 0);

type Vector is record
  LEDs : LEDs_t;
end record;

type VectorArray is array (natural range <>) of Vector;

constant Vectors : VectorArray := (
  --  LEDs,
  (LEDs => resize(signed'(X"30"), LEDs_t'length)),         --48
  (LEDs => resize(signed'(X"f6"), LEDs_t'length)),         --246
  (LEDs => resize(signed'(X"108"), LEDs_t'length)),        --264
  (LEDs => resize(signed'(X"FFFFFFD3"), LEDs_t'length)),   -- -45
  (LEDs => resize(signed'(X"FFFFFF4C"), LEDs_t'length)),   -- -180
  (LEDs => resize(signed'(X"FFFFFFCF"), LEDs_t'length)),   -- -49
  (LEDs => resize(signed'(X"ab"), LEDs_t'length)),         -- 171
  (LEDs => resize(signed'(X"13"), LEDs_t'length)),         -- 19
  (LEDs => resize(signed'(X"1B"), LEDs_t'length)),         -- -27
  (LEDs => resize(signed'(X"45"), LEDs_t'length)),         -- -69
  (LEDs => resize(signed'(X"45"), LEDs_t'length)),         -- -69
  (LEDs => resize(signed'(X"2d"), LEDs_t'length)),         -- 45
  (LEDs => resize(signed'(X"122"), LEDs_t'length)),        -- -290
  (LEDs => resize(signed'(X"56"), LEDs_t'length)),         -- 86
  (LEDs => resize(signed'(X"f2"), LEDs_t'length)),         -- 242
  (LEDs => resize(signed'(X"7d"), LEDs_t'length)),         -- 125
  (LEDs => resize(signed'(X"FFFFFFC9"), LEDs_t'length)),   -- -55
  (LEDs => resize(signed'(X"115"), LEDs_t'length)),        -- 277
  (LEDs => resize(signed'(X"FFFFFFE3"), LEDs_t'length)),   -- -29
  (LEDs => resize(signed'(X"FFFFFF7D"), LEDs_t'length)));  -- -131

在调整大小时不需要显式的signed'(...),因为在这种情况下,VHDL 将解析正确的调整大小,但我认为显式类型指示使意图明确。

作为未成年人,还有一些.Test_LEDs应该是.LEDs

【讨论】:

  • 谢谢,是的,我现在看到另一个循环有适当的缩进,它修复了这个错误!!!但是,下一个错误“类型向量与字符串文字不匹配”出现在以下行:(X"30")、--48 (X"f6")、--246 (X"108")、-- 264……等等。我知道这通常是因为我将诸如向量之类的东西分配给整数。但是我看不到我在哪里这样做?有任何想法吗?再次感谢
  • 哦,我明白了!是的,在注意到长度不正确后,我实际上将十六进制数字更改为 12 位二进制,但我不知道您必须引用向量本身内部的数字。我永远不会想到这一点。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多