RTL设计指南---verilog

来源:互联网 发布:厦门btn广电网络 编辑:程序博客网 时间:2024/05/04 00:17


按照本章给出的设计指南进行编码,可使HDL代码具有良好的可读性、可修改性,并且利于DFT、仿真和综合。

(一)命名规则

在开始进行RTL设计前, 要统一命名规则, 最好以文档的形式给出。使用一致的命名规则有利于理解。下面给出一些命名规则:

1)在对模块、寄存器、wire进行命名时,要使用有意义的名称,例如,对于一个数据宽度为100位的乘法器, 可命名为mult-100x100

2) 寄存器、端口、wire用小写。

3) 定义的常量使用大写字母。

4) 对时钟采用一致的命名方式。

5)对于复位信号,采用相同的命名方式。例如,对于高电平有效的复位信号,用rst表示;对于低电平有效的复位信号,用rst-n表示。

6)描述总线时,使用统一的总线排列顺序。例如,都使用从高到低的排列。如下所示:wire3:0test

7)对同一信号,在不同的层次中要尽量保持相同的名称。

8) IO PAD使用大写字母。

(二)设计风格

1)在每个源文件的开始,要注明模块名称、作者、功能描述、日期、修改记录等。

2)尽量多加注释。

3)每行只写一条代码,每行代码长度最好不超过72个字符。 这个规定是为了保证代码具有较好的可读性。

4)使用缩进格式书写条件和循环部分代码,以增加代码可读性。

5)不要使用HDL的保留字来命名信号或变量。

6)使用显式的方式来映射端口和常量,保持端口名称之间的对应。如下所示:

decoder decoder-u(

.slice-err (slicer-err1 ),

.loopback (loopback ),

.clk (clk ),

.rst-n-i (rst-RCLK-n-I ),

.data-o (data-o )

);

    7)对于某个模块, 如果需要为ASICFPGA写两套代码, 则应将代码写在一个文件中,通过′ifdef来区分,如下所示:

ifdef ASIC

//code for ASIC

else

//code for FPGA

endif

8)敏感列表写完整。

9)当编写具有优先级的编码器时,尽量采用ifelse结构。对于无优先级的结构,采用case语句。

10)避免产生组合逻辑反馈。

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

12)将组合逻辑和时序逻辑分开写。

13)采用双进程方式来描述状态机。

14)在设计中加入足够的冗余逻辑(spare gates)。这样,如果流片后发现芯片有问题,可以进行metal fix

15)在设计中,尽量避免用分频时钟。否则在做DFT、静态时序分析、PR时都会带来麻烦。但在特定场合,例如低功耗应用中, 有时不得不采用分频时钟。

16)对于FPGA设计,尽量采用独热编码;对于ASIC设计, 为节省面积, 可以采用其他编码方式。

17)尽量不要采用三态总线。总线可以采用双总线,也可以采用三态总线。下图是采用三态buf进行总线访问:


芯片内部最好不要用三态总线。虽然三态总线可节省布线面积,但有如下缺点:逻辑不清晰;有许多假的时序违例,给综合和静态时序分析带来困难;控制逻辑设计复杂。一般来说,采用MUX方式更容易控制,缺点是增加了布线的难度。 但考虑到现在的工艺中布线资源非常丰富,因此这种缺点一般可以被忽略。在设计中建议采用MUX的方式来连接总线。如下图所示:


18)将时钟生成逻辑、复位生成逻辑与其他部分的逻辑分离开。

19)所有模块的输出最好都采用寄存器输出。这样做会增加一些寄存器,但增加的寄存器几乎不会对产品成本产生什么影响。而且,这种方式会给综合和物理设计带来极大益处。逻辑综合器都采用基于路径的优化技术。在逻辑综合中,路径的起点可以是模块端口,也可以是寄存器;终点可以是寄存器,也可以是端口。如果模块的输出不是寄存器的输出,则一个模块的输出逻辑与下一模块的接收逻辑无法统一进行优化,这样就得不到最佳的综合结果。而且,采用寄存器输出方式,写综合脚本会变得容易许多。在布局布线时,如果所有模块的输出都是寄存器输出,则对模块分配物理位置时具有更大的自由度。

原创粉丝点击