Verilog
代码编写注意事项
1
、
for
循环
:
虽然
for
是可以综合的,但是在写代码时一般不用,因为会占用很多硬件
资源,而且一般我们设计的是时序逻辑设计,用到
for
循环的地方很少。
2
、
代码风格:
代码风格不是一层不变的,要具体逻辑具体分析。对于同一个逻辑问题,
if
…
else
和
case
只不过是形式上的不同,综合工具优化功能足够强的话,就会看穿这
个形式上的不同,实现逻辑上的相同。
3
、
inout
端口的使用
:
当
inout
作为输入端口使用时,一定要把它置为高阻态,当
inout
端口作为输出口使用时,直接对输出信号赋值即可。
例如:
inout
wire
io_data ;
//inout
端口。
input
reg
out_data
;
//
需要向
io_data
输出的数据。
input
reg
io_link
;
//inout
口方向控制。
Assign
io_data = io_link ? out_data : 1
’
bz ;
/*
这步是关键,
inout
作为输
入端口使用时,
io_link=0
,
必须把
io_data
置为高阻态。当
inout
端口作为输出口使用时,
将
io_link=1 ,
将
out_data
赋值给
io_data
就可以了。
*/
4
、
注释:代码注释时一个最大的共同错误是,注释描述的只是代码本身所实现的功能。正
确的注释写法是,
应该假定读者是一个有经验的工程师,
他熟悉
verilog
语言本身,
但对
于该工程并不熟悉。注释的最高境界是:抛开源代码,单从注释就明白设计者所要实现
的功能。
例如:
错误的注释
:
addr <= addr + 1
’
b1 ;
//addr
自增
1.
这句注释不会给读者提供任何有用的信息。
正确的注释
,(
假定该工程是
FPGA
与
MCU
通信
)
addr<= addr + 1
’
b1 ; //
在
MCU
写入一个字节数据后,
addr
自增
1
,以供
MCU
读取下一个字节数据。
5
、
状态机
:
verilog
描述的电路大都是并行实现的,但是对实际的工程应用,往往需要让
硬件来实现一定具有一定顺序的工作,这就要用到状态机的思想,构成状态机的基本要
素是状态机的输入(如
SRAM
的
wr_req
,rd_req
)
、输出(状态变化后引起的变化)
、状
态(如
SRAM
的
IDLE
、
WR_S1
、
RD_S1
等等)
,状态机分为有限状态机和无限状态机,
实际设计中一般都指有限状态机。
6
、
Moore
和
Mealy
:
Moore
型状态机的状态变化仅和当前状态有关,
而与输入条件无关,
Mealy
型状态机的状态变化不仅与当前状态有关,还取决于当前的输入条件。
7
、
状态机的写法:一段式、两段式、三段式,它们在速度、面积、代码可维护性等各个方
面互有优劣,对三种写法在不同项目应用中进行不同的分析。
8
、
异步复位
/
同步复位的亚稳态状况
:
每个寄存器都有一个端口是
clr
异步清零端,亚稳
态出现的概率大。
同步复位需要消耗额外的
FPGA
的内部资源,
无法充分利用
FPGA
内
部专用的清零端口
CLR
,但是出现亚稳态的概率大大降低了(只是降低,不能避免)
。
9
、
亚稳态:
0
或
1
的状态不稳定。解决亚稳态的方法就是:异步复位、同步释放的双缓
冲电路。该电路由两个同一时钟沿触发的层叠寄存器组成,该始终必须和目标寄存器是
一个时钟域。
例如:
input
clk ;
//
系统时钟信号。
input
rst_n ;
//
输入复位信号,低电平有效。
output
rst_n2 ;
//
异步复位、同步释放输出。