VHDL并发过程调用仿真时间异常原因咨询
VHDL并发过程调用的时序异常分析
结论:这确实属于VHDL仿真中的竞争条件,根源在于非阻塞信号赋值特性与并发过程触发逻辑的交互。
现象拆解
当进程中WAIT FOR 10 ns;放在cnt <= i;之前时,仿真时间点为0ns、20ns、30ns、40ns,而非预期的0ns、10ns、20ns、30ns;将WAIT语句移到赋值之后,时序恢复正常。
原因分析
初始状态与并发过程触发逻辑
- 仿真启动时(0ns),
cnt初始值为0,并发调用的test(cnt, str)立即执行,输出str为"zero "。 - VHDL中,并发过程调用仅在输入信号发生变化时才会重新执行。
- 仿真启动时(0ns),
WAIT在前的时序问题
- 进程第一次循环:先执行
WAIT FOR 10 ns;,仿真推进到10ns,随后执行cnt <= 0;。 - 这里用的是非阻塞赋值,
cnt的更新会被安排在当前仿真时间点(10ns)的Δ延迟周期中完成。但由于新值(0)和旧值(0)完全相同,cnt并没有发生实际变化,因此并发的test过程不会被触发重新执行。 - 进程第二次循环:再次
WAIT FOR 10 ns;,仿真推进到20ns,执行cnt <= 1;。这次cnt从0变为1,触发test执行,str更新为"one ",此时时间点为20ns。 - 后续循环中,每次赋值都会改变
cnt的值,因此仿真时间依次推进到30ns、40ns,导致整体时序比预期晚了10ns。
- 进程第一次循环:先执行
WAIT在后的正常时序
- 进程第一次循环:先执行
cnt <= 0;,虽然值未变化,但随后WAIT FOR 10 ns;将仿真推进到10ns。 - 第二次循环:执行
cnt <= 1;,cnt发生变化,触发test在10ns的Δ周期执行,随后WAIT FOR 10 ns;推进到20ns。 - 后续循环以此类推,每次赋值都能触发
test在对应的10ns间隔点执行,时序符合预期。
- 进程第一次循环:先执行
核心本质
这个问题的竞争点在于:当非阻塞赋值的新值与旧值相同时,信号不会产生事件,导致并发过程的触发被延迟。这种因信号事件触发时机与赋值逻辑不匹配导致的时序偏差,属于VHDL仿真中典型的竞争条件场景。
内容的提问来源于stack exchange,提问作者user24973442
相关产品推荐
相关产品推荐

