自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给不同宽度的信号
不要用除号/和取模号%