VHDL中信号赋值为何在进程首次迭代时未执行更新?
VHDL信号赋值时序与仿真执行规则原理解答
核心规则前置
- 信号赋值的延迟特性:所有信号赋值语句(
<=)不会在执行时立刻修改信号值,仅会将最终赋值请求(同一信号多次赋值取最后一次)提交到仿真事件队列,等待当前进程全部执行完成、进入仿真时间点的信号更新阶段后,才会统一更新所有信号的取值。 - 进程内信号读值规则:进程执行过程中,所有读取信号的操作(包括
report语句、赋值语句右值的信号引用),取的都是本次进程唤醒前已经完成更新的信号旧值。 - 未显式初始化信号的默认值:整数类型信号未指定初始值时,默认取值为整数类型的最小值,即你输出中看到的
-2147483648。
逐轮迭代执行过程对应
你观察到的"首次迭代后temp未更新"是误解,实际上temp已经在首次迭代结束后完成更新,只是你无法在本次迭代的report中读到新值,只能在下一轮进程唤醒后读到:
第1轮(i=0,仿真时间0ns)
- 进程唤醒时,信号当前值:a=1、b=2、c=3、i=0、temp=默认最小值、temp2=默认最小值
- 所有
report语句读取的都是上述旧值,因此全部输出-2147483648 - 进程执行完成后,信号更新阶段生效赋值:temp=3(取最后一次赋值c=3)、temp2=temp的旧值(即默认最小值)、i=1
- 仿真时间推进10ns,进入下一轮迭代
第2轮(i=1,仿真时间10ns)
- 进程唤醒时,信号当前值已经更新为上一轮的结果:temp=3、temp2=默认最小值、i=1
- 前3条
report读取temp的当前值为3,因此输出3;后2条report读取temp2的当前值仍为默认最小值,因此输出-2147483648 - 进程执行完成后,信号更新阶段生效赋值:temp=3、temp2=temp的当前值3、i=2
- 仿真时间推进10ns,进入下一轮迭代
第3轮(i=2,仿真时间20ns)
- 进程唤醒时,temp和temp2都已经更新为3,因此所有
report输出均为3
补充说明
这个设计是VHDL为了保证硬件行为仿真确定性的核心规则,避免了软件编程里的赋值立即生效可能带来的逻辑竞争问题,完全匹配实际硬件电路的信号传输延迟特性。
内容的提问来源于stack exchange,提问作者GrandNecro
相关产品推荐
相关产品推荐

