繁体   English   中英

VHDL中的过程可重入吗?

[英]Is process in VHDL reentrant?

VHDL的流程是否可以连续运行两个或多个?

如果未完成过程的顺序执行而又发生另一事件(在灵敏度信号列表上),将会发生什么?

是否有可能或者我将VHDL模型记入过程中是完全错误的?

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

当某个进程被事件唤醒时,它会运行到完成(“结束进程”)或显式的“ wait”语句,然后进入睡眠状态。 从概念上讲,这需要零时间。 这意味着,如果您的流程中存在循环,则循环将完全展开,并且在您进行综合时,您将生成足够的硬件来并行运行每个迭代。 同样,任何过程,函数等都需要零时间-除非它们包含显式的“ wait”语句(在这种情况下,过程在“ wait”处挂起,就像过程已被内联一样)。

在整个过程中,所有信号都具有其在唤醒过程中所具有的原始值,并且所有信号分配都被存储起来,以备以后使用。 (变量将立即更新;过程中的后续语句将看到新值)。

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

然后执行所有信号分配。 由于所有过程都处于睡眠状态,因此消除了所有比赛条件和计时危险。 其中一些分配(例如时钟为“ 1”)将导致事件在对它们敏感的进程上进行调度。

完成所有信号分配后,时间将向前移动一个无限短的滴答声(称为增量周期),然后唤醒所有具有计划事件的进程。

这一直持续到发生增量周期(在该周期中未安排任何新事件),最后模拟可以实时进行。

从而

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

在VHDL中是无害的。

如果您需要使用Verilog,请注意,其中某些情况会以不同的方式发生,并且您不能在模拟结果中依赖相同级别的可预测性。


当然,综合而言,我们生成的硬件将需要一些实时时间才能执行此过程。 但是,综合和后端工具(布局和布线)保证可以忠实地遵循此模型,或者失败并报告失败的原因。 例如,他们将累加所有实际延迟,并验证总和小于您指定的时钟周期。 (除非您将时钟速度设置得太高!)。

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

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

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

这是由于将值分配给信号的方式而起作用。 为信号分配值时,信号的值不会立即改变! 取而代之的是,将记住分配的值,并在以后将其提交为实际信号值(为下一个增量周期做准备,这实际上是下一个时间量)。

由于下一个增量周期要等到上一个增量周期的所有进程完成后才能开始,因此信号值仅在没有进程在运行时才会更改。 一旦所有信号都已更改,下一个增量周期就会开始,任何对更改后的信号之一敏感的过程都将执行。

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

这就是我现在要写的全部内容,因为在撰写本文时,Brian Drummond的答案刚刚弹出,但是请随时发表评论,我将添加更多详细信息。

流程一旦开始运行(由于事件),它将在允许任何其他事件触发其他事件之前运行至完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM