Verilog初学建议 (墙裂推荐!!!感动到哭泣!)
1.=和<=(类似vhdl:=和<=)
=为阻塞赋值,类似vhdl的:=。<=为非阻塞赋值。
建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。
建议同一个变量单一地使用阻塞或者非阻塞赋值。
2.tips
1、不使用初始化语句;
2、不使用延时语句;
3、不使用循环次数不确定的语句,如:forever,while等;
4、尽量采用同步方式设计电路;
5、尽量采用行为语句完成设计;
6、always过程块描述组合逻辑,应在敏感信号表中列出所有的输入信号;
7、所有的内部寄存器都应该可以被复位;
8、用户自定义原件(UDP元件)是不能被综合的。
3.赋值
连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因此连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。
过程性赋值只出现在always语句中。
4.进位:
通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:
Wire [3:0] A,B;
Wire [4:0] C;
Assign C=A+B;
C的最高位用来存放进位。
5.循环:
只有for-loop语句是可以综合的。
6.异步复位:
建议不要在异步时对变量读取,即异步复位时,对信号赋以常数值。
7.块
一.顺序块
顺序块有以下特点:
1) 块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。
2) 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
3) 直到最后一条语句执行完,程序流程控制才跳出该语句块。
顺序块的格式如下:
begin
语句1;
语句2;
......
语句n;
end
其中:
块名即该块的名字,一个标识名。其作用后面再详细介绍。
块内声明语句可以是参数声明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句。
二. 并行块
并行块有以下四个特点:
1) 块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。
2) 块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的。
3) 延迟时间是用来给赋值语句提供执行时序的。
4) 当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。
并行块的格式如下:
fork
语句1;
语句2;
.......
语句n;
join
其中:
• 块名即标识该块的一个名字,相当于一个标识符。
• 块内说明语句可以是参数说明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句、time型变量声明语句、事件(event)说明语句。
在fork_join块内,各条语句不必按顺序给出,因此在并行块里,各条语句在前还是在后是无关紧要的。
8.易错:
注意指定wire或者reg数组数!!!
9.数组定义顺序
[0:6]~=[6:0]区别注意
10.不等于 !=
11.output是属于wire型的,只能用于组合逻辑,你此处用于时序逻辑应该同时声明为reg型,如下:output reg [7:0] dout
12.this signal is connected to multiple drivers
错误原因: wire型变量赋初值
此类错误系将某同一个reg变量在多个个always块中进行了赋值操作,此类程序是不可综合的,因此须修改程序。
切记,对于同一个reg型变量只能在一个always块中对其值进行修改,当然在其它块中可以引用其值!