verilog基本语法之always和assign
always和assign的作⽤
⼀、语法定义
assign,连续赋值。always,敏感赋值。连续赋值,就是⽆条件全等。敏感赋值,就是有条件相等。assign的对象是wire,always的对象是reg。这就是语法约束。
⼆、功能差异
assign对应电路下连线操作。always对应插⼊敏感控制连线。这⾥容易混淆的就是assign综合的⼀定是组合电路,但是always综合的不⼀定是时序电路。always的敏感列表使⽤*号就可以等效综合为组合电路。如果使⽤的是电平触发,也使会综合成相应的组合电路。只有出现边沿触发时,才会综合成时序电路。⽽时序电路,基础就是时钟和使能两个关键信号。时钟在always模块中不再出现(时钟信号在敏感信号作⽤下的值⼀直相等,没有使⽤在内部的意义,当然可以转化后使⽤)。⽽对于使能信号,则是会有⼀个if判断语句,⽽且处于第⼀优先级。这就是异步复位。如果不在敏感列表⽽处于第⼀优先级,则是同步复位信号。
从上⾯的描述可以看到:always可以实现两种电路,是不是可以不⽤assign来实现设计?理论上可以,
但是会加⼤设计的难度。⾸先要明确的是,always只能对reg变量赋值,这导致wire变量赋值困难。如果没有assign,每个wire变量都要加⼊⼀个reg缓冲。可以简单理解:开始时只有always,可以实现基本的功能,然后将其中的组合逻辑提取出来构成assign。同时引⼊了wire。也就是assign是always的补充(只是⽅便理解,没有根据)。
三、实际应⽤
使⽤assign和always构建加法器:
always@(*)begin
a<=b+c;
end
assign a=b+c;
四。拓展
在上⾯的学习中可以看到,reg和wire的作⽤也是语法的重要区别。以后有时间可以去区别。