state_type
不是已解析的子类型。在精化过程中识别后,在模型执行之前的加载过程中会检测到多个驱动程序。
IEEE 标准 1076-2008
14.5 声明部分的阐述
14.5.5 其他并发语句
所有其他并发语句要么是过程语句,要么是具有等效过程语句的语句。
流程说明的详细说明如下:
a) 流程声明部分进行了阐述。
b) 确定流程声明所需的驱动因素。
6.4.2.3 信号声明
...如果在详细描述之后,一个信号有多个源并且不是一个已解析的信号,则这是一个错误。 ...
有驱动程序next_state
在进程 SYNC_PROC 和 NEXT_STATE_DECODE 中
14.7 模型的执行
14.7.2 驱动程序
进程语句中的每个信号赋值语句都定义了一组drivers对于某些标量信号。进程语句中给定标量信号 S 有一个驱动程序,前提是该进程语句中至少有一个信号赋值语句,并且该信号赋值语句的目标信号的最长静态前缀表示 S 或表示其中 S 是其子元素的复合信号。每个这样的信号分配语句都与该驱动程序相关联。信号分配语句的执行仅影响关联的驱动程序。
state_type
枚举类型并且是标量类型:
5.2 标量类型
5.2.1 概述
标量类型包括枚举类型, 整数类型, 物理类型, and 浮点类型. ...
解决方案似乎是重置state
在 SYNC_PROC 而不是next_state
.
如果删除两个无关的重音符号(“`”,15.2 字符集),您的代码将是最小、完整且可验证的示例 https://stackoverflow.com/help/mcve尽管Tricky表达了怀疑。我从您的代码示例中删除了它们,之后您的代码分析并详细说明了处理 SYNC_PROC 的更改:
if(r='1') then
state <= SA; -- WAS next_state
(请注意,条件周围的括号(此处 r='1')是多余的。在 VHDL 中,已知条件是具有 BOOLEAN 值的表达式。)
如果您的模拟器允许使用顶级端口执行,它将报告多个驱动程序。对于那些不需要的模拟器,您需要实例化测试平台simpfsm
:
14.2 设计层次结构的阐述
实现可以允许(但不要求允许)位于设计层次结构根部的设计实体具有泛型和端口。如果实现允许这些顶层接口对象,它可以限制它们允许的形式(即,是否允许它们是接口类型、子程序、包或对象),并且对于接口对象,以实现定义的方式限制它们允许的类型和模式。
正如您可能收集到的那样,这代表了在没有测试平台或依赖于脚本驱动模拟器的交互的情况下检测错误的可移植性问题。在信号分配目标更改之前可以使用 ghdl 演示该错误:
ghdl -r simpfsm
对于信号:.simpfsm(behavioral).next_state
./simpfsm:error: 未解析信号的几个来源
./simpfsm:error: 阐述期间出错
将详细设计规范加载到内存中会延迟到基于编译器的 VHDL 模拟器中的“程序”执行:
14.2 设计层次结构的阐述
设计层次结构的阐述完成如下:
— 创建在制定过程陈述(见 14.5.5)期间确定的驱动因素。
— 由与流程语句驱动的每个标量信号关联的默认值定义的初始事务被插入到相应的驱动程序中。
next_state
and state
两者都有默认值 state_type'LEFT (SA
).
6.4.2.3 信号声明
在没有显式默认表达式的情况下,将为标量子类型的信号或复合信号的每个标量子元素假定隐式默认值,其中每个标量子元素本身就是标量子类型的信号。标量子类型 T 的信号的隐式默认值定义为由 T'LEFT 给出的值。
这意味着在识别每个网络时,在详细说明的加载部分期间会检测多个驱动程序:
14.7.3.4 信号更新
A net是驱动程序、信号(包括端口和隐式信号)、转换函数和分辨率函数的集合,它们共同确定网络上每个信号的有效值和驱动值。
我们看到在执行期间(ghdl 的 -r 命令)发生了详细阐述(此处加载)的部分:
14.2 设计层次结构的阐述
设计层次结构的阐述创建了通过网络互连的过程集合;然后可以执行该进程和网络的集合来模拟设计的行为。
Tricky的怀疑有些道理,重音会在分析过程中导致错误,而你提供的错误则发生在阐述过程中。通过首先调查您报告的错误,可以将它们假定为转录错误。