Always块是Verilog中的过程块之一。 Always块中的语句按顺序执行。
always @ (event) [statement] always @ (event) begin [multiple statements]end
Always块在某些特定事件处执行。该事件由敏感度列表定义。
敏感性列表是一个表达式,它定义了何时应该执行always块,并在括号()中的@运算符之后指定。 该列表可以包含一个或一组信号,其值更改将执行always块。
在下面显示的代码中,只要信号a或b的值发生变化,始终执行块中的所有语句。
// 每当“ a”或“ b”的值更改时,执行always块always @ (a or b) begin [statements]end
在下面的示例中,always块中的所有语句在信号clk的每个上升沿执行。
// Execute always block at positive edge of signal "clk"always @ (posedge clk) begin [statements]end
在整个仿真过程中,always块将连续重复执行。 只要灵敏度列表中的任何信号发生变化,便会触发always块。 如果always块中没有时序控制语句,则由于零延迟无限循环,仿真将挂起!
下面显示的示例是一个Always块,它试图反转信号clk的值。 该语句每0个时间单位执行一次。 因此,由于语句中没有延迟,因此它将永远执行。
// always block is started at time 0 units// But when is it supposed to be repeated ?// There is no time control, and hence it will stay and// be repeated at 0 time units only. This continues// in a loop and simulation will hang !always clk = ~clk;
即使灵敏度列表为空,也应该有其他形式的时间延迟。 如下所示,在always结构中,通过延迟语句可以添加仿真时间。 现在,每10个时间单位完成一次时钟反转。
always #10 clk = ~clk;
注意:显式延迟不能合成为逻辑门!
因此,真正的Verilog设计代码始终需要一个敏感度列表。
联系客服