Verilog always block

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 · 访问量 6629

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104572222