always
always语句块从仿真0时刻开始执行其中的行为语句;最后一条执行完成后,再开始执行其中的第一条语句,如此往复循环,直到整个仿真结束。因此,always语句块常用于对数字电路中一组反复执行的活动进行建模。
always 和 always@(*) 的区别
- 有@时,是每次执行语句时,必须满足括号内的条件才能继续执行语句,否则不执行。
- always@(敏感事件列表) 用于描述时序逻辑;敏感事件(上升沿 posedge、下降沿 negedge);或电平。
- verilog规定,always@()中的是指该always块内的所有输入信号的变化为敏感列表,也就是仿真时只有当always@(*)块内的输入信号产生变化,该块内描述的信号才会产生变化。
- 若没有@,则是一般在teastbench 中产生时钟信号,指不会满足特定的条件,执行完一次后立马继续执行下一次,一直重复执行。
always #10 CLK=~CLK;
- 有@时,是每次执行语句时,必须满足括号内的条件才能继续执行语句,否则不执行。
3种模式
always@()语句的意思是always模块中的任何一个输入信号或电平发生变化时,该语句下方的模块将被执行。
1、always语句有两种触发方式。第一种是电平触发,例如always @(a or b or c),a、b、c均为变量,当其中一个发生变化时,下方的语句将被执行。
2、第二种是沿触发,例如always @(posedge clk or negedge rstn),即当时钟处在上升沿或下降沿时,语句被执行。
3、而对于always@(),意思是以上两种触发方式都包含在内,任意一种发生变化都会触发该语句。
补充initial
Verilog语言中的两种过程:always过程和initial过程(执行一次)。
补充assign
assign 用于描述组合逻辑,所有的assign 和 always 块都是并行发生。