verilog always的用法

目录

简介:

应用场景:

语法简介:

敏感列表的定义与作用:


简介:

    always语句块从仿真0时刻开始执行其中的行为语句;最后一条执行完成后,再开始执行其中的第一条语句,如此往复循环,直到整个仿真结束。因此,always语句块常用于对数字电路中一组反复执行的活动进行建模。

应用场景:

always块是Verilog中用来描述组合逻辑以及时序逻辑的语法。

在这上面的语法小节中也说过了。

需要补充的是一个设计中可以有多个always块,或者说一定有很多个always块。

这些硬件块都是相互独立同时工作的。每个块之间的连接是决定数据流的原因。为了模拟这种行为,一个always块被做成一个连续的过程(硬件不可能断断续续工作),当敏感列表中的一个信号变化时,它就会被触发并执行一些动作(always块内的语句)

语法简介:

always 和 always@(*) 的区别

有@时,是每次执行语句时,必须满足括号内的条件才能继续执行语句,否则不执行。

always@(敏感事件列表) 用于描述时序逻辑;

敏感事件(上升沿 posedge、下降沿 negedge);always @ (posedge clk)

或电平。Always@(a)

verilog规定,always@()中的是指该always块内的所有输入信号的变化为敏感列表,也就是仿真时只有当always@(*)块内的输入信号产生变化,该块内描述的信号才会产生变化。

若没有@,则是一般在testbench 中产生时钟信号,指不会满足特定的条件,执行完一次后立马继续执行下一次,一直重复执行。always #5 CLK=~CLK;

有@时,是每次执行语句时,必须满足括号内的条件才能继续执行语句,否则不执行

always@()语句的意思是always模块中的任何一个输入信号或电平发生变化时,

always语句在仿真过程中不断的运行着。initial语句只执行一次,而always语句则不断重复的活动着,直到仿真结束。
但always块语句后面跟着的过程快是否运行,满足则运行一次,满足则运行一次,直到程序结束。

该语句下方的模块将被执行。
1、always语句有两种触发方式。第一种是电平触发,例如always @(a or b or c),a、b、c均为变量,当其中一个发生变化时,下方的语句将被执行。
2、第二种是沿触发,例如always @(posedge clk or negedge rstn),即当时钟处在上升沿或下降沿时,语句被执行。
3、而对于always@(),意思是以上两种触发方式都包含在内,任意一种发生变化都会触发该语句。

  1. always @(A or B or Cin) begin
  2.     Sum = (A^B)^Cin;
  3.     T1 = A & Cin;
  4.     T2 = B & Cin;
  5.     T3 = A & B;
  6.     Cout=(T1 | T2) | T3;
  7.  end

敏感列表的定义与作用:

触发always块内部语句的条件。

只有一条语句,不需要使用begin -end;第二种是有多条语法,需要使用begin end包裹起来。推荐全部都用begin end包裹起来,这样形式比较固定,比较方面阅读以及形成固定风格。

只要敏感信号列表内的信号发生电平变化,则always模块中的语句就执行一次,因此设计人员必须将所有的输入信号和条件判断信号都列在信号列表中。

有时不完整的信号列表会造成不同的仿真和综合结果,因此需要保证敏感信号的完备性。

当敏感信号不完备时,会使得仿真结果不一样,这是因为仿真器在工作时不会自动补充敏感信号表。

猜你喜欢

转载自blog.csdn.net/whm128/article/details/131600534