Verilog always块敏感列表多信号同步变化及单时间步执行规则问询
Verilog Always块常见问题解答
1. 当Verilog always块敏感列表中的多个变量在同一时间步发生变化时,会产生何种行为?
- 同一时间步内,敏感列表里多个变量发生变化时,always块只会执行一次。
- 仿真器会先收集同一时间步内所有的信号变化,只要这些变化满足敏感列表的触发条件(比如电平敏感的
@*、边沿敏感的@(posedge clk or negedge rst)),就会调度一次always块的执行,不会因为多个信号变化而触发多次执行。 - 举个实际例子:如果有
always @(a or b)块,当a和b在同一个时间步同时从0跳变到1,这个always块只会执行一次,执行过程中会使用a、b变化后的最新值来完成逻辑计算。
2. always块是否可能在一个时间步内执行多次?即敏感列表中的信号每次变化时立即执行?若不能,该场景下的行为规则是什么?
- 正常设计中,一个时间步内always块最多执行一次,不会随敏感列表内信号的多次变化而重复执行。
- 仿真的时间步分为信号更新、事件调度、执行三个核心阶段:同一时间步内所有信号的变化会先完成更新,之后仿真器检查所有always块的敏感列表,将需要触发的块加入执行队列,最后按顺序执行队列里的任务,每个任务仅执行一次。
- 特殊情况:如果always块内部逻辑导致敏感列表中的信号再次变化(比如组合逻辑出现循环赋值,如
a = ~b; b = ~a;),这种错误设计可能会触发多次执行,甚至导致仿真进入无限循环,硬件实现中也会出现亚稳态或逻辑混乱,属于必须避免的设计问题。
内容的提问来源于stack exchange,提问作者chen zhang
相关产品推荐
相关产品推荐

