always块
- 不要在不同的always块内为同一个变量赋值,在产生一个信号时,所有产生该信号的条件都应放在一个always块内考虑。
- 不要在同一个always块内同时使用阻塞赋值(=)和非阻塞赋值(<=)。
- 使用always块描述组合逻辑时使用阻塞赋值(=),在使用always块描述时序逻辑时使用非阻塞赋值(<=)。
简单理解可以是,在边沿敏感的always块内使用非阻塞赋值,在电平敏感的always块内使用阻塞赋值。 - 任何在always块内被赋值的变量都必须是寄存器型(reg)。
- always的敏感列表中可以同时包括多个电平敏感事件,也可以同时包括多个边沿敏感事件,但不能同时有电平和边沿敏感事件。另外,敏感列表中,同时包括一个信号的上升沿敏感事件和下降沿敏感事件也是不允许的,因为这两个事件可以合并为一个电平事件。
端口声明
- input 或 inout 端口只能被定义为 wire ;
- output 端口默认为 wire ,若要在always块中对其赋值,需要将其定义为reg,形式如下:
module xxx(
input a,
inout b,
output reg[7:0] c);
一般模块结构
- module xxx(xxxxxx);
输入输出端口 - parameter xxx = yyy
类似常量宏定义 - wire xxx;
内部端口、临时变量、缓存、中间变量,不与模块外的世界发生关系 - reg[x:0] xxx;
内部端口、临时变量、缓存、中间变量,不与模块外的世界发生关系 - always @ (posedge clock or negedge reset_n)
边沿敏感,时序逻辑,非阻塞赋值 - always @ (a or b or c or d)
电平敏感,组合逻辑,阻塞赋值
查看RTL原理图
Tool >> Netlist Viewers >> RTL Viewers