为了账号安全,请及时绑定邮箱和手机立即绑定

请问VHDL中的过程是可重入的吗?

请问VHDL中的过程是可重入的吗?

有只小跳蛙 2019-11-06 09:05:15
VHDL中的过程是可重入的吗?中的进程是否可能连续运行两次或更多次。VHDL?如果在进程的顺序执行未完成时发生另一个事件(在敏感信号列表上),会发生什么情况?是可能的还是我的VHDL模型中的过程是完全错误的吗?
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

进程运行时不会发生任何事件!

当一个进程被事件唤醒时,它会运行到完成(“结束进程”)或显式的“等待”语句,然后进入休眠状态。从理论上讲,这需要零时间。这意味着,如果您在流程中有循环,它们实际上是完全展开的,当您进行综合时,您将生成足够多的硬件来并行运行每一个迭代。此外,任何过程、函数等都不需要任何时间-除非它们包含一个显式的“等待”语句(在这种情况下,进程在“等待”处挂起,就好像该过程是内联的)。

在整个过程中,所有信号都具有它们在进程醒来时的原始值,并且任何信号分配都会被存储起来,以后才会发生。(变量立即更新;流程中稍后的语句见新值)。

当进程挂起(在“等待”或“结束进程”)时,在所有其他进程也暂停之前什么都不会发生。(但请记住,他们都不需要任何时间!)如果一个进程在“结束进程”处挂起,当它的敏感性列表唤醒它时,它将从一开始就重新启动。如果它在显式“等待”处挂起,则“等待”将指定一个事件或未来时间,该事件或时间将在“等待”之后重新启动。(注意:1:不要将敏感列表和等待样式混合在同一个进程中!2:等待某个事件可以合成(尽管有些工具可能反对);等待一段时间才是模拟)

然后执行所有的信号分配。由于所有进程都处于休眠状态,这消除了所有竞赛条件和计时风险。其中一些分配(比如“1”到一个时钟)将导致事件被安排在对它们敏感的进程上。

在完成所有信号分配之后,时间向前迈进一个无限短的滴答(称为增量周期),然后所有计划事件的进程都会被唤醒。

这种情况一直持续到增量周期发生,在这种循环中没有新事件被调度,最后模拟可以一个实时步骤向前推进。

因此

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

在VHDL中是无危害的。

如果您需要使用Verilog,请注意,在那里发生的某些事情是不同的,而且您不能在仿真结果中依赖相同级别的可预测性。


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

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



查看完整回答
反对 回复 2019-11-07
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

在开始使用VHDL(或其他任何HDL)时,非常重要的是要抛弃顺序代码的所有概念,而要专注于通过硬件的数据流。在硬件中,所有东西本质上都是并行的(一切同时发生),但是使用不断变化的数据(输入信号)来计算不断变化的结果(输出信号)!

如果不深入到诸如变量、等待命令等更高级的主题,进程中的所有内容都会同时发生。如果在同一进程中发生冲突的事情(对同一信号多次写入),则流程中的最后一条语句将获胜,这通常是VHDL中关于“顺序”代码的混淆的地方。

这是由于将值分配给信号的方式而产生的。当给信号赋值时,信号的值不会立即改变!相反,赋值将被记住,并将在以后作为实际信号值提交(为下一个δ周期做准备,这实际上是下一个时间量程)。

由于下一个增量周期将在上一个增量周期的所有进程完成后才开始,因此信号值只有在没有进程运行时才会更改。一旦所有信号都改变了,下一个增量循环就开始了,任何对一个变化信号敏感的进程都将被执行。

如果一个进程对它所写的信号很敏感,你就有一个所谓的组合回路,例如,输出输入的一个门。这几乎总是你的电路中的一个错误,并且通常会导致模拟器进入无限的三角循环。

这就是我现在要写的全部内容,因为BrianDrummond的回答只是在我写这篇文章的时候弹出来的,但是请尽管留下评论,我会添加一些更多的细节。



查看完整回答
反对 回复 2019-11-07
  • 3 回答
  • 0 关注
  • 347 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信