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