Verilog LRM不确定性

Verilog LRM不确定性,verilog,hdl,Verilog,Hdl,对于Verilog LRM中提到的Verilog调度语义的不确定性,我面临一些疑问。以下是我无法理解的摘录: “不确定性的另一个来源是,在行为块中没有时间控制结构的语句不必 作为一个事件执行。时间控制语句是#表达式 和@expression构造(见9.7)。在计算 行为声明时,模拟器可能会暂停执行并放置 部分完成的事件作为事件上的挂起活动事件 队列。其效果是允许进程的交错 执行。请注意,交错执行的顺序是 不确定且不受用户控制。” 我能做出的唯一推断是,行为块中的语句可能会暂停以执行其他行为块(它

对于Verilog LRM中提到的Verilog调度语义的不确定性,我面临一些疑问。以下是我无法理解的摘录:

“不确定性的另一个来源是,在行为块中没有时间控制结构的语句不必 作为一个事件执行。时间控制语句是#表达式 和@expression构造(见9.7)。在计算 行为声明时,模拟器可能会暂停执行并放置 部分完成的事件作为事件上的挂起活动事件 队列。其效果是允许进程的交错 执行。请注意,交错执行的顺序是 不确定且不受用户控制。”

我能做出的唯一推断是,行为块中的语句可能会暂停以执行其他行为块(它们在同一时间段中处于活动状态),以便交错进程执行,尽管我不确定

此外,我不理解行为语言中没有时间控制结构的“行”语句 块不必作为一个事件执行”。LRM说它不作为一个事件执行是什么意思?如果行为块包含所有时间控制语句,会发生什么


有人能举例说明一下吗?提前感谢。

模拟所保证的唯一一件事是always块中的所有语句都将按顺序执行。假设,如以下方框所示:

always @(b,c,e,f) begin
   a = b | c;
   d = e & f;
   g = a ^ d ^ x;
   ...
end
但是,模拟器可以决定执行一行中的前2条语句,但在最后一条语句之前停止执行该块,并让其他块继续执行。然后它将返回到最后一条语句。从这个意义上讲,语句的执行顺序是不确定的

你猜怎么着?!
x
的值在等待时肯定会改变<代码>a和
d
在执行其他语句时也可能发生更改。因此,
g
的结果可能是不确定的。良好的编程将有助于消除这种不确定性:列出灵敏度列表中的所有事件,不要将驱动信号相乘。。。然后模拟器将尽最大努力避免这些情况

这种交织模拟的需要是为了让模拟器出于性能原因进行更好的优化,并在出现非常长和循环语句的情况下允许其他块继续进行

回答有关时间和事件控制的评论

在上面的模块中,模拟器可以决定何时中断执行。从程序员的角度来看,它是不确定的。你不知道什么时候会发生。唯一已知的是,它会在同一个模拟(时间)周期内发生。一个好的模拟器将尽最大努力避免任何副作用

定时和延迟控制提供确定性停止。比如说,

always @(b,c,e,f) begin
   a = b | c;
   d = e & f;
   #1 g = a ^ d ^ x;
   ...
end
在上面带有
#1
的语句中,您实际上告诉模拟器停止执行这些语句,并等待下一次

always @(b,c,e,f) begin
   a = b | c;
   d = e & f;
   @(posedge clk)
   g = a ^ d ^ x;
   ...
end
在这里,它将停止执行并等待
posedge clk
事件


请注意,上述示例不可合成,只能在行为代码(测试台)中使用。对于合成,您必须坚持第一个示例,并确保您的代码是按照良好的Verilog编码实践编写的

谢谢你的回答。我完全理解你的回答。请详细说明LRM中提到的时间或事件控制声明的意义。我不明白时间或事件控制如何在停止或恢复块的执行时起作用。