【问题标题】:IF syntax error in simple VHDL code简单 VHDL 代码中的 IF 语法错误
【发布时间】:2014-05-25 20:23:04
【问题描述】:

我对 vhdl 很陌生,我似乎无法在我的代码中找到错误,我不断收到这些错误。

alarm.vhdl (line 19, col 5):  (E10) Syntax error at/before reserved symbol 'if'.
Error occurred within 'ARCHITECTURE' at line 16, column 28 in alarm.vhdl.
alarm.vhdl (line 31, col 9):  (E56) Expected ;, but got IF
alarm.vhdl (line 31, col 9):  (E10) Syntax error at/before reserved symbol 'if'.
alarm.vhdl (line 33, col 4):  (E10) Syntax error at/before reserved symbol 'end'.

我的 if 语句有问题吗?

library IEEE;
use ieee.std_logic_1164.all;

entity alarm is
  port( master_switch:       in    std_logic;       
        door_sensor:         in    std_logic;
        wheel_sensor:        in    std_logic;
        clock:               in    std_logic;
        Z :                  out   std_logic;
        J :                  in    std_logic_vector(1 downto 0);
        K :                  in    std_logic_vector(1 downto 0);
        Q :                  inout std_logic_vector(1 downto 0);
       Qcomp :               inout std_logic_vector(1 downto 0) );
end alarm;

architecture behav of alarm is

begin
if clock='1' then

J(1) <= Qcomp(1) AND Q(0) AND master_switch AND door_sensor;
K(1) <= Q(0) OR Q(1);

J(0) <= Qcomp(0);
K(0) <= Qcomp(1) OR (Q(0) AND Q(1));

Q(1) <= ((NOT K(1)) AND Q(1)) OR (J(1) AND Qcomp(1));
Q(0) <= ((NOT K(0)) AND Q(0)) OR (J(0) AND Qcomp(0));

Z <= Q(1) AND Qcomp(0);
 end if;
end;
end behav;

【问题讨论】:

    标签: if-statement syntax vhdl


    【解决方案1】:

    这里的if 语句必须在一个进程中,clock 在它的敏感列表中。 (另外你想使用rising_edge(clock)而不是clock = '1'进行正确合成)

    【讨论】:

    • 我尝试使用进程,但我得到了 alarm.vhdl(第 18 行,第 8 列):(E56)预期的功能,但得到了进程
    • 我做了并且我使用了通常的符号,有什么理由让它期望一个函数吗?
    • 最后一条评论(现已删除的版本)中缺少一个“开始”。
    【解决方案2】:

    关于模糊的语法错误消息

    alarm.vhdl (line 19, col 5):  (E10) Syntax error at/before reserved symbol 'if'.
    Error occurred within 'ARCHITECTURE' at line 16, column 28 in alarm.vhdl.
    

    这是由于保留字 if 之前缺少标签造成的,推测是生成语句方案。

    问题是正如 Brian 所说,作为顺序语句的 if 语句只能出现在进程或子程序(函数或过程)中。

    错误消息的明显质量差来自解析器中错误的检测方式。

    架构语句部分中的语句是并发语句:

     architecture_statement_part ::=
          { concurrent_statement }
    

    大括号表示允许零个或多个并发语句(架构语句部分可以为空)。

     concurrent_statement ::=
           block_statement
         | process_statement
         | concurrent_procedure_call_statement
         | concurrent_assertion_statement
         | concurrent_signal_assignment_statement
         | component_instantiation_statement
         | generate_statement
    

    块语句以保留字 block 开头。

    以保留字 process 或 postponed 开头的流程声明。

    以过程名称或保留字推迟开头的并发过程调用语句。

    以保留字 assert 开头的并发断言语句。

    以信号名称或关键字推迟开头的并发信号赋值语句。

    以保留字component,或保留字entity,或保留字configuration,或名称开头的组件实例化语句一个实体。

    以上所有并发语句都可以选择标记,标签前面可以是保留字或名称(标识符,可以是选定的名称)。

    generate 语句的最后一个选项需要一个标签,并且可以有保留字 if。

     generate_statement ::=
         generate_label :
             generation_scheme generate
                 [ { block_declarative_item }
             begin ]
                 { concurrent_statement }
             end generate [ generate_label ] ;
    
     generation_scheme ::=
          for generate_parameter_specification
       | if condition
    
     label ::=  identifier
    

    我们看到,在强制标签之后,我们希望看到生成方案,由保留字 if 或保留字 for 指示。。 p>

    解析器按顺序测试这些。您可能会注意到 concurrent_statement 不是终端。各种并发语句之一将是终端生产。如果无法在非终端上挂起错误消息,一切都会在最后一个并发语句选择(生成语句)中被扫除。

    与其告诉你生成语句有问题:

    ghdl -a alarm.vhdl
    alarm.vhdl:19:1: a generate statement must have a label
    alarm.vhdl:19:14: 'generate' is expected instead of 'then'
    

    您使用的解析器告诉您保留字 if 周围有问题。虽然只有一个并发语句可以以 if“开始”,但除了缺少强制性标签之外。

    假设使用语义谓词(例如 entity_name),VHDL 解析器可以先行操作。

    有时可以使用更大的前瞻来避免回溯(这在最后一个并发语句选择中没有意义)。有一个表达式后跟保留字 then,它取消了当前并发语句作为生成语句的资格。

    有可能产生更好的错误信息:

    nvc -a alarm.vhdl
    ** Error: syntax error, unexpected if, expecting process
        File alarm.vhdl, Line 19
        if clock='1' then
        ^^
    

    这确定 if 是不合适的,而不是前面没有标签,并且在 nvc 的情况下注意到 if 语句是顺序语句,允许在这种情况下是过程语句。

    (注意 Brian 的回答说“这里的 if 声明必须在一个过程中,..”)。

    请注意,ghdl 和 nvc 都不会出现在此错误之前。 ghdl 将设计描述的当前部分视为生成语句(没有非终端错误消息),而 nvc 能够处理非终端错误消息(在这种情况下不使用 bison 构造)。您的工具供应商的解析器会更快地抛出它,但会尝试一个糟糕的非终端错误消息。

    但是,没有任何借口或需要进一步说明:

    alarm.vhdl (line 31, col 9):  (E56) Expected ;, but got IF
    alarm.vhdl (line 31, col 9):  (E10) Syntax error at/before reserved symbol 'if'.
    alarm.vhdl (line 33, col 4):  (E10) Syntax error at/before reserved symbol 'end'.
    

    当解析中的任何错误足以使输出无效时,为什么会尝试未知的并发语句选择?尝试提供更多上下文,但引用行和列以及保留字可能不是这样做的方法。

    您还可以注意到,nvc 的错误消息可能存在缺陷。标记 if 语句,你会得到:

    nvc -a alarm.vhdl
    ** Error: syntax error, unexpected then
        File alarm.vhdl, Line 20
        if clock='1' then
                     ^^^^
    

    这里的缺点是它没有告诉你它正在解析一条生成语句(你也不是工具供应商的解析器)。

    虽然 ghdl 变得更加具体:

    ghdl -a alarm.vhdl
    alarm.vhdl:20:14: 'generate' is expected instead of 'then'
    ghdl: compilation error
    

    这三个解析器的共同点之一是它们都需要 VHDL 语言专业知识来解释。

    在这些情况下,工具供应商可以选择性地提供扩展叙述来解释消息是如何产生的。

    例如,Modelsim 有一个 verror 工具,当提供错误编号时,它会生成叙述性描述。

    在您的情况下,您似乎正在直接综合 VHDL 设计描述。一般来说,综合工具假定您对 VHDL 有一定的了解,这可能表明您最好先对设计进行仿真,或者基于复杂性而失败,使用不同的分析器来根除语法错误。

    您的错误消息似乎来自 Cypress 的 WARP,Reference Manual (1996, PDF,1.4 MB) 告诉我们:

    E10:保留符号“%s”处/之前的语法错误。
    您以非法方式使用了保留字,例如,作为信号或变量名。

    而且您可以看到该消息没有什么帮助。

    WARP 被认为已过时,旨在支持已停产的 CPLD 产品线,并于 2012 年自行停产,否则缺乏支持。它强化了使用其他工具分析 VHDL 设计的概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      相关资源
      最近更新 更多