良好的逻辑风格
主要参考了:华为Code Style;Verilog 基本电路设计指导书 华为;Qian's World;CSDN博客 Verilog代码风格;《Verilog 编程艺术》(魏家明 电子工业出版社)
总的规则
Rule No.1 永远不要稍后再调整代码,因为 Later equals never
Rule No.2 去除、合并冗余代码,如果一个代码会被用在多个地方(>=2),都应该提出来做成模块、函数或者Task——Less is more
一个 Tab = 4 个空格
代码要求
- 设计时要写好文档。在文档中记录设计思路、端口、数据通路和实现细节。在《Verilog 编程艺术》中,作者要求代码需要评审之后再开始编写,对于小型工程没有必要,但是设计文档还是需要的。
- 有 IP 可用的时候尽量使用 IP,对于 IP 可以使用原语的时候就使用原语,这样移植工程会更简单
- 每个模块单独放在一个文件里面,文件名和模块名要一致;top层模块名应该加上后缀 "_top";仿真文件加上后缀 "_tb";最 Top 层模块名为 FPGA_Top
- 不要使用 "/synopsys full_case parallel case" (参见这篇文章 Cummings, Clifford E. "" full_case parallel_case", the Evil Twins of Verilog Synthesis." Proc Synopsys Users Group (SNUG) (1999).)
代码划分
- 高内聚、低耦合的原则
- 每个模块只完成一个功能,隐藏内部细节提供一个干净的接口
- 也存在一个模块就需要做很多事的情况,否则会增加非常多的模块,这个时候就用一个模块反而更好
- 低耦合的意思是减少模块之间的连线,避免大量连线信号
- 关键路径逻辑和非关键路径逻辑放在不同的模块,分为速度优化和面积优化
- 提取公共代码或者常用的代码,形成模块、函数或任务
- 相关代码紧挨着,形成逻辑块,每个逻辑块上方写注释
命名
- 严格遵守本节最后的命名缩写规则
- 使用有意义的命名
- 不要使用 Pascal 命名,因为在 VHDL 中大小写不敏感!!!
- 模块中的变量使用小写,下划线分割。Pascal 命名是个好东西,写软件代码用这种命名方式。
- 即使非用大写不可,也要在一个模块里面统一,不要大小写混合,否则在 Verilog 中会引起阅读困难,在 VHDL 中会造成查找困难
- `define、parameter、localparam、const、enum 用大写字母
- 同一个信号在每个子模块中的名字要一致
- FPGA 的输入输出管脚要在后面加上_Pin 或者_Pout 表示输入或者输出;管脚名字全部用大写
- 输入输出信号要在后面加前缀_i或者_o:比如 usb_data_rden_o, usb_data_wren_o, usb_data_i
- 内部定义的寄存器要在后面加后缀_r 比如:trigger_sync_r
- 内部定义的 wire 在信号名后面加_w
- VHDL 中定义 SIGNAL 在信号名后面加_s
常用信号的缩写如下表所示
| name | short | name | short | name | short |
|---|---|---|---|---|---|
| acknowledge | ack | error | err | ready | rdy |
| adress | addr | enable | en | receive | rx |
| arbiter | arb | frame | frm | request | req |
| check | chk | generate | gen | resest | rst |
| clock | clk | grant | gnt | segment | seg |
| config | cfg | increase | inc | source | src |
| control | ctrl | input | in | statistic | stat |
| counter | cnt | length | len | switcher | sf |
| data in | din | output | out | timer | tmr |
| data out | dout | packet | pkt | tmporary | tmp |
| decode | de | priority | pri | transmit | tx |
| decrease | dec | pointer | ptr | valid | vld |
| delay | dly | read | rd | write enable | wren |
| disable | dis | read enbale | rden | write | wr |