Vhdl 等待上升沿(clk)和if上升沿(clk)

Vhdl 等待上升沿(clk)和if上升沿(clk),vhdl,Vhdl,我在VHDL中遇到了两种类型的过程语句 process(clk) begin if rising_edge(clk) ....do something.... 另一个是 process begin wait until rising_edge(clk) ....do something.... 每种方法的优缺点是什么。假设第二个示例的..部分没有任何wait语句,这两种形式在语义上是等价的 它们在模拟中的行为相同 然而,第一种形式是推荐的合成风格,许多人认为它

我在VHDL中遇到了两种类型的过程语句

process(clk)
begin
    if rising_edge(clk)
....do something....
另一个是

process
begin    
    wait until rising_edge(clk)
    ....do something....

每种方法的优缺点是什么。

假设第二个示例的
..
部分没有任何
wait
语句,这两种形式在语义上是等价的

它们在模拟中的行为相同


然而,第一种形式是推荐的合成风格,许多人认为它更具可读性。

基本上,第二种形式只在模拟中有用。wait语句需要时间在进程内的不同语句之间流动,这与硬件合成进程不同。它通常出现在模拟刺激或诊断过程中。在第一种形式中,进程由时钟事件触发,并在单个步骤中运行,表示同步逻辑

这两种形式在Vivado中的合成是等效的。第二个
wait
表单可以被认为更紧凑,因为它“保存”了一个缩进级别。

我一般同意@wap26的答案,只是增加了一个

我有时喜欢编写一个顶级arch,它既可以作为可合成的顶级设计,也可以作为模拟测试台——通常用于较小的设计

在此类设计中,您经常在模拟期间使用等待语句自行驱动时钟,如:

如果是模拟,那么
等待模拟时钟周期/2;

我不完全同意你回答的第二部分。
wait
确实可以用来产生复杂/异步刺激,但也可以用来模拟完全同步的行为,例如触发器。这是不正确的。就“时间流”而言,两者基本相同,只有一个微小的(不相关的)区别。我希望大多数合成工具(如果不是全部的话)都能接受这两种形式。但是,几乎每个人都使用第一个。你的信息是错误的。在上一个项目中,我们使用了
等待上升边(clk)
,因为它“保存”了缩进级别,而且更紧凑。例如Vivado这样的合成工具认为这两种形式是等效的。由谁推荐?支持这两种形式,请参阅撤销的IEEE Std 1076.6-2004、6.1.3.1边缘敏感存储器,该存储器来自一个具有灵敏度列表和一个时钟的进程,以及使用单个等待语句的6.1.3.2边缘敏感存储器。区别在于流程是否有一个敏感度列表,该列表意味着
等待clk作为过程的最后顺序声明(IEEE Std 1076-2008 11.3过程声明)。哪种形式是纯粹的编码风格选择。@user我手头没有任何参考资料,但有一些合成工具无法使用
wait
语法推断出正确的FF。而且它们不符合1076.6。@user Yes,但是合成工具无论如何都不意味着实现完整的标准。@Wap26它们不是100%等效的:根据LRM,灵敏度列表等效于没有灵敏度列表且带有
等待的相同过程添加为流程的最后一条语句,而不是第一条。因此,您几乎正确地认为它们是等效的:在模拟过程中,初始化是不同的。根据
的不同,差异可能是可见的或不可见的。IMHO,保存缩进级别是没有意义的,除非编辑器只显示80列。我不是说它有巨大的价值。与任何编码标准一样,这种选择大多是任意的,取决于个人偏好。这些工具并不关心。此外,如果您的文本编辑器或IDE确实“折叠”了代码,那么
等待直到…
将被隐藏,但合成列表仍然可见,假设它与流程关键字在同一行。vs
等待直到clk='1'
密切相关-。