Verilog 调度语义
Verilog 设计和测试平台通常有很多行代码,包括 always
或 initial
块、连续赋值和其他在模拟过程中在不同时间变得活跃的程序语句。
Verilog 模型中信号值的每一次变化都被视为一个更新事件 .以及always
等流程 和 assign
对这些更新事件敏感的块以任意顺序进行评估,称为评估事件 .由于这些事件可能发生在不同的时间,因此可以通过将它们安排到 事件队列 来更好地管理它们并确保它们的正确执行顺序 按模拟时间排列。
module tb;
reg a, b, c;
wire d;
// 'always' is a process that gets evaluated when either 'a' or 'b' is updated.
// When 'a' or 'b' changes in value it is called an 'update event'. When 'always'
// block is triggered because of a change in 'a' or 'b' it is called an evaluation
// event
always @ (a or b) begin
c = a & b;
end
// Here 'assign' is a process which is evaluated when either 'a' or 'b' or 'c'
// gets updated
assign d = a | b ^ c;
endmodule
事件队列
一个模拟步骤可以分为四个不同的区域。活动事件队列只是需要在当前时间执行的一组进程,这可能导致更多进程被调度到活动或其他事件队列中。事件可以添加到任何区域,但总是从 active 中删除 地区。
- 活跃 事件发生在当前模拟时间,可以按任何顺序处理。
- 不活动 事件在当前模拟时间发生,但在处理完所有活动事件后处理
- 非阻塞分配 之前评估的事件将在处理完所有活动和非活动事件后分配。
- 监控 在完成所有活动、非活动和非阻塞分配后处理事件。
当当前时间步的活动队列中的所有事件 执行完毕后,模拟器将时间提前到下一个时间步并执行其活动队列。
module tb;
reg x, y, z
initial begin
#1 x = 1;
y = 1;
#1 z = 0;
end
endmodule
模拟从时间 0 开始,第一个语句计划在模拟时间达到 1 个时间单位时执行,在该时间单位将 x 和 y 分配为 1。这是当前时间的活动队列,即 1 个时间单位。然后模拟器在 z 被分配为 0 的 1 个时间单位之后调度下一条语句。
是什么让模拟具有不确定性?
仿真过程中可能存在竞争条件,最终会为相同的设计和测试平台提供不同的输出。非确定性行为的原因之一是因为 active 事件可以从队列中移除并按任意顺序处理。
Verilog