一些verilog风格

自verilog coding style from belab

1.portiability

最基本的就是用`ifdef,还有要用相对路径不要用绝对路径,别人的IP尤其是memory用的时候打上一个wrapper,里面放上自己需要的功能比如bist和scan 什么的。

 

2.modularity & partitioning

比如top里面应该只有模块相连的关系,而不要有logic;datapath和Control logic应该分离在不同的module里面,data path是timing-optimized而Control logic是area-optimized。

在datapath里面应该所有模块都是n-bit的

Avoid snaking combinational paths across module boundarirs???

FSM要单独写一个模块里面

尽量每个模块里面只有一个时钟域

异步逻辑和同步逻辑分开

每个模块的控制逻辑控制在5K-10K gates

 

3.use of macros & parameters

尽量保留每个限制之间的关联。比如

`define DATA_WORD 8

`define DATA_LONG (4*`DATA_WORD)

最好在每个模块用完`define之后再 `undef掉用过的东西

每个工程都应该在top同级建立一个模块专门用来define这个project里面的define东西

define和parameter应该都用大写字母

所有的module名字都应该小写,和文件名一致

信号命名后缀_n表示低有效,_test表示test信号,_async表示异步信号,_sync表示同步信号,_dn表示pipeline 第n节,_gt表示gated clock

芯片级的输入输出信号都应该保持大写

声明的基本惯例

module test( … );

parameter BUS_WIDTH = 8;

input in1;

output out1;

inout inout1;

reg reg1;

wire wire1;

// logic region

endmodule

latch和三态门是不被允许的,最好只用positive edge 的D触发器

 

4.verilog rules

对寄存器使用非阻塞赋值,对组合逻辑使用阻塞赋值

所有的case都应该加入default,这里要注意一下,当已满足full-case的时候为什么还要default,这是由于在case解码的时候会出现未定的状态,所以需要加入default的情况,同时如果没有事情做的话可以赋值x给控制的信号。否则很容易出现latch

最好不要用casez和casex, 我理解为这个东西作用的时候会取决于你的仿真器或者是综合器,所以还是老老实实的用case

If a case statement is used as combinational logic, ensure that all variables are stated in each case item, otherwise latches will be inferred.这句话说的意思应该是当你在case语句里进行组合逻辑操作的时候要注意对每个赋值的变量在每个case分支里都对所有的变量赋值,不然就会出现latch。

组合逻辑不要出现feedback loop

begin/end块越短越好,不然很容易出现timing问题

所有数字都应该使用Width'BaseNumber的形式

不要用assigned给不同宽度的信号

不要用除号/和取模号%

posted @ 2012-03-01 11:36  poiu_elab  阅读(635)  评论(0编辑  收藏  举报