Verilog⾥⾯,always,assign和always@(×)区别
来源:⽹络素材
1.always@后⾯内容是敏感变量,always@(*)⾥⾯的敏感变量为*,意思是说敏感变量由综合器根据always⾥⾯的输⼊变量⾃动添加,也就是所有变量都是敏感列表,不⽤⾃⼰考虑。
2.如果没有@,那就是不会满⾜特定条件才执⾏,⽽是执⾏完⼀次后⽴马执⾏下⼀次,⼀直重复执⾏,⽐如testbench⾥⾯产⽣50Mhz的时钟就(假设时间尺度是1ns)可以写成
⼀般always@(*)是指⾥⾯的语句是组合逻辑的。*代替了敏感变量。
⽽⼀般时序逻辑要写成
时钟信号clk上升沿或者复位信号rst下降沿的时候执⾏always块内的代码。
assign ⽤于描述组合逻辑
always@(敏感事件列表) ⽤于描述时序逻辑
敏感事件上升沿 podge,下降沿 negedge,或电平
敏感事件列表中可以包含多个敏感事件,但不可以同时包括电平敏感事件和边沿敏感事件,也不可以同时包括同⼀个信号的上升沿和下降沿,这两个事件可以合并为⼀个电平敏感事件。
在新的verilog2001中“,”和“or”都可以⽤来分割敏感事件了,可以⽤“*”代表所有输⼊信号,这可以防⽌遗漏。
合法的写法:
所有的assign 和 always 块都是并⾏发⽣的!
并⾏块、顺序块
将要并⾏执⾏的语句写在
将要顺序执⾏的语句写在
并⾏块和顺序块都可以写在
initial 或 always@ 之后,也就是说写在块中的语句是时序逻辑的
对assign之后不能加块,实现组合逻辑只能⽤逐句的使⽤assign