(1)reg和wire的区别:
reg型数据保持最后一次的赋值,而wire型数据需要持续的驱动。wire用在连续赋值语句assign中;reg用于always过程赋值语句中。
wire对应于连续赋值,主要起信号间连接作用,用以构成信号的传递或者形成组合逻辑,如assign;reg对应于过程赋值,是寄存器的抽象表达,作用类似通常编程语言中的变量,可以储存数值,作为参与表达式的运算,通常负责时序逻辑,如always,initial。
Verilog中使用reg型,并不表示综合出来就是暂存器register:在组合电路中使用reg,组合后只是net;在时序电路中使用reg,合成后才是以Flip-Flop形式表示的register触发器。
(2)阻塞赋值和非阻塞赋值:
非阻塞(non-blocking) 赋值语句(b<= a):
1)块内的赋值语句同时赋值;
2)b的值被赋成新值a的操作, 是与块内其他赋值语句同时完成的;
3)建议在可综合风格的模块中使用非阻塞赋值。
阻塞(blocking) 赋值语句(b = a):
1)完成该赋值语句后才能做下一句的操作;
2)b的值立刻被赋成新值a;
3)硬件没有对应的电路,因而综合结果未知。
阻塞赋值和非阻塞赋值如果使用不当会存在冒险和竞争现象,必须按照下面两条准则:
1)在描述组合逻辑的always块中使用阻塞赋值,则综合组合逻辑的电路结构。
2) 在描述时序逻辑的always