VHDL中的进程是可重入的吗?

VHDL是否有两个或多个顺序运行的进程?

如果另一个事件发生(在灵敏度信号列表中),而顺序执行一个过程没有完成,会发生什么?

是否有可能或者我的VHDL模型考虑过程是完全错误的?

运行过程中不会发生任何事件!

当一个进程被一个事件唤醒时,它会运行到完成(“结束进程”)或显式的“等待”语句,然后进入hibernate状态。 这从理论上来说是零时间。 这意味着如果你的程序中有循环,那么它们就会被完全展开,当你合成时,你将会产生足够的硬件来并行运行每一次迭代。 另外,任何程序,函数等都需要零时间 – 除非它们包含一个明确的“等待”语句(在这种情况下,进程在“等待”中挂起,就像过程已经被内联了一样)。

在整个过程中,所有的信号都具有它们在过程醒来时所具有的价值,并且任何信号分配都被存储起来,以后再发生。 (variables立即更新;后面的语句在过程中看到新的值)。

当进程挂起时(在“等待”或“结束进程”),没有任何反应,直到所有其他进程也暂停。 (但请记住,他们都需要零时间!)。 如果一个进程在“结束进程”中挂起,它将在其敏感列表被唤醒时从头开始重新启动。 如果在明确的“等待”中挂起,则“等待”将指定事件或将来的时间,在“等待”之后将重新启动它。 (注意:1:不要在同一个进程中混合敏感列表和等待样式!2)等待某个事件可以合成(尽pipe有些工具可能会反对);等待一段时间只是模拟)

那么所有的信号分配都被执行。 由于所有的过程都是睡着的,这消除了所有的竞争条件和时间危害。 这些分配中的一些(如“1”到时钟)将导致事件安排在对其敏感的进程上。

在所有的信号分配完成之后,时间步进一个无限短的时间间隔(称为增量循环),然后所有具有预定事件的进程被唤醒。

这一直持续到发生没有新的事件被调度的增量循环,最后仿真可以实时地前进。

从而

 process(clk) begin if rising_edge(clk) then A <= B; B <= A; end if; end process; 

在VHDL中是无危害的。

如果您需要使用Verilog,请注意,其中的一些发生在不同的地方,您不能依靠仿真结果中的相同级别的可预测性。


在综合当然,我们生成的硬件将需要一些实时的执行这个过程。 然而,合成和后端工具(地点和路线)保证要么忠实地服从这个模型,要么失败并报告为什么失败。 例如,他们将加起来所有的实际延迟,并validation总和小于您指定的时钟周期。 (除非你把时钟速度设得太高!)。

所以结果是,只要工具报告成功(并且正在设置时钟速度正确的时钟速度),您就可以假装上述“零时间”模型是真实的,真实的硬件行为将与模拟相匹配。 保证,禁止工具错误!

当开始使用VHDL(或者其他任何HDL)时,丢弃所有连续代码的概念是非常重要的,而不是集中在通过硬件的数据stream上。 在硬件中,所有东西本质上是平行的(一切都是同时发生的),但是使用不断变化的数据(input信号)来计算不断变化的结果(输出信号)!

不需要进入更高级的主题,比如variables,等待命令等,一个进程中的所有内容都会同时发生。 如果在同一个进程中发生冲突(对相同信号进行多次写入),则进程中的最后一个语句会胜出,这通常是VHDL中“顺序”代码混淆的原因。

这是由于值被分配给信号的方式。 当为信号赋值时,信号的值不会立即改变! 取而代之的是,分配的值被记住,并且将在之后作为实际信号值被提交(准备下一个delta循环,这实际上是下一个时间量)。

由于下一个增量循环在上一个增量循环的所有过程完成之前不会开始,所以只有当没有过程正在运行时,信号值才会改变。 一旦所有信号都发生变化,下一个增量循环开始,任何对一个变化信号敏感的处理都将被执行。

如果一个进程对一个信号很敏感,那么它也会写入,就是所谓的组合循环,例如输出馈送input的门。 这在您的电路中(几乎)总是一个错误,并且通常会导致模拟器进入一个无限的增量循环循环。

这就是我现在要写的,因为Brian Drummond的回答刚刚出现在我写这篇文章的时候,但是随时留下评论,我会添加更多的细节。

你应该阅读这个博客文章: http : //www.sigasi.com/content/vhdls-crown-jewel

一旦一个进程开始运行(由于一个事件),它会在任何其他事件被允许触发其他事件之前运行到完成。

Interesting Posts