Verilog 调度语义17 Mar 2025 | 4 分钟阅读 Verilog 设计和测试平台通常包含许多代码行,包括 always 或 initial 块、连续赋值和其他在仿真过程中不同时间激活的程序语句。 Verilog 模型中信号值的每次更改都被视为一个 更新事件。 而诸如 always 和 assign 块等对这些更新事件敏感的进程以任意顺序进行评估,称为 评估 事件。 由于这些事件可能发生在不同的时间,因此通过将它们调度到按仿真时间排列的 事件队列 中,可以更好地管理它们并确保它们正确的执行顺序。 事件队列仿真步骤可以分为四个不同的区域。 活动事件队列只是一组需要在当前时间执行的进程,导致更多进程被调度到活动或其他事件队列中。 事件可以添加到任何区域,但总是从 活动 区域中移除。
当当前时间步长的活动队列中的所有事件都已执行完毕时。 仿真器将时间推进到下一个时间步并执行其活动队列。 仿真从时间 0 开始,第一个语句被调度在仿真时间达到 1 时间单位时执行,此时它将 x 和 y 赋值为 1。 这是当前时间(即 1 个时间单位)的活动队列。 然后,仿真器将下一条语句调度在 1 个时间单位后执行,此时 z 被赋值为 0。 不确定性在仿真过程中,可能存在竞争条件,最终导致相同设计和测试平台的输出结果不同。 不确定行为的原因之一是,活动 事件可以从队列中删除并以任何顺序处理。 当多个进程同时触发时,电气和电子工程师协会 (IEEE) 标准并未规定进程执行的顺序。 这是任意的,并且因仿真器而异。 这称为不确定性。 有两种由相同根本原因引起但以不同方式表现的不确定性的常见情况。 情况 1:当多个语句在零时间内执行时,它们的执行顺序会影响结果。 因此,不同的执行顺序会给出不同的但正确的结果。 在零时间内执行意味着这些语句在没有推进仿真时间的情况下被评估。 这两个进程,一个程序块和一个连续赋值,被调度为在变量 d 改变时同时执行。 如果先评估 always 块,则变量 q 被 always 块赋值为 d 的新值。 然后执行连续赋值。 它将 d 的新值的补码赋值给变量 q。 如果先评估连续赋值,q 将获得 d 的新值的补码。 然后,程序赋值将新值(未补码)赋值给 q。 因此,这两种顺序产生相反的结果。 情况 2:当块中的交错程序语句同时执行时,会考虑这种情况。 当同时调度两个程序块时,不能保证一个块中的所有语句在另一个块中的语句开始之前完成。 来自这两个块的语句可以以交错顺序执行。 当 clk 的上升沿到达时,两个 always 块都被触发。一种交错顺序是 在这种情况下,y 得到 0。另一种交错顺序是 在这种情况下,y 得到 1。 |
我们请求您订阅我们的新闻通讯以获取最新更新。