Always块是Verilog中的过程块之一。 Always块中的语句按顺序执行。
Syntax
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设计代码始终需要一个敏感度列表。
菜鸟-求指导 发布了123 篇原创文章 · 获赞 8 · 访问量 6640 私信 关注