zl程序教程

您现在的位置是:首页 >  其他

当前栏目

00 大厂的verilog代码风格与规范

代码 规范 大厂 风格 Verilog 00
2023-09-14 09:16:17 时间

  1. 所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;常量名和用户定义的类型则用大写。
  2. 使用有意义的信号名、端口名、函数名和参数名。例如模块端口名用 a2b_data、a2c_ctrl,而不是直接用 data1、ctrl1 等。
  3. 信号名长度不要太长。对于超过 28 个字符的信号名,有些 EDA 工具不能够识别,太长的信号名也不容易记忆。因此,在描述清楚的前提下,尽可能采用较短的信号名。
  4. 对于时钟信号,通常使用 clk 作为信号名。如果设计中存在多个时钟,则使用 clk 作为时钟信号的前缀,如 clk1、clk2、clk_interface 等
  5. 对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号也尽可能采用相同的名字。

  1. 对于低电平有效的信号,应该以一个下划线跟一个小写字母 b 或 n 表示(如 a2b_req_n、a2b_req_b)。注意,在同一个设计中要使用同一个小写字母表示低电平有效。对于复位信号,使用 rst 作为信号名。如果复位信号是低电平有效,建议使用 rst_n。
  2. 当描述多比特总线时,要使用一致的定义顺序。对于 Verilog HDL,建议采用 bus_signal[x:0]的表示形式。
  3. 尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,_a 表示异步信号,_pn 表示多周期路径第 n 个周期使用的信号,_nxt 表示锁存器信号,_z 表示三态信号等。
  4. 在源文件、批处理文件的开始应该包含一个文件头。文件头一般包含如下内容:文件名,作者,模块的时间功能概述和关键特性描述,文件创建和修改的记录(包括修改时间、修改的内容)等。
  5. 使用适当的注释来解释所有的 always 进程、函数、端口含义、信号含义、变量含义和信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,足够说明设计意图即可,避免过于复杂。

  1. 建议采用缩进来提高续行和嵌套语句的可读性。缩进一般采用两个空格,如果空格太多,则在深层嵌套时要限制行长。同时避免使用 Tab 键,以防不同的机器 Tab 键设置不同限制了代码的可移植能力。
  2. 在 RTL 源码的设计中,任何元素(包括端口、信号、变量、函数、任务、模块等)的命名都不能与 Verilog HDL 和 VHDL 语言的保留字相同。
  3. 在进行模块的端口声明时,每行只声明一个端口,并建议采用以下顺序:输入信号的 clk、rst、enables other control signals、data signals。
  4. 在实例化模块时,尽量采用名字相关的显示映射而不要采用位置相关的映射,这样可以提高代码的可读性,方便调试连线错误。
  5. 如果同一段代码需要重复多次,尽可能使用函数实现。如果有可能,还可以将函数通用化,使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以调高代码的可读性。

  1. 尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效减少代码行数。
  2. 对一些重要的 always 语句块定义一个有意义的标号,将有助于调试。注意标号名不要与信号名、变量名重复。
  3. 在设计中不要直接使用数字,作为例外,可以使用 0 和 1。建议采用参数定义代替直接使用数字。同时,在定义常量时,如果一个常量依赖于另一个常量,建议在定义该常量时用表达式表示出这种关系。
  4. 在设计中避免实例化具体的门级电路,门级电路可读性差,而且难于理解和维护,如果使用特定工艺的门电路,设计将变得不可移植。
  5. 避免冗长的逻辑和子表达式。如 z=ac+ad+bc+bd 应该改写为 z=(a+b)*(c+d)。

  1. 避免采用内部三态电路,建议采用多路选择电路代替内部三态电路。
  2. 在 always 组合逻辑块中,每一个 if 都对应一个 else,每一个 case 都对应一个 default。
  3. 对于组合逻辑,采用 if…else 或 case 语句,其综合的结果将有所不同。如果电路不需要有优先级的设计,则应优先采用 case 语句。因为在一般情况下,case 语句实现的电路的设计路径延迟要小于 if…else 语句实现的电路。
  4. 时钟与复位
      避免在设计中既用时钟的上升沿又用时钟的下降沿。尽可能将上升沿和下降沿触发的触发器分别放到不同的模块中实现。避免在 RTL 级放入时钟 buffer。时钟 buffer 一般在综合完成后的物理设计阶段才插入。在综合阶段,时钟网络通常被认为是没有延迟的理想网络,而在布局、布线阶段,有专门的时钟树插入工具来布局时钟网络。避免使用组合逻辑控制的时钟。其时序关系往往依赖于具体的实现工艺。如果在设计中必须使用组合逻辑控制的时钟,则应将时钟电路作为一个单独的模块(一般在顶层模块)来实现。
      复位信号的设计,要采用单一的全局复位信号,避免使用模块内部产生的条件复位信号,模块内部产生的条件复位信号可以转换为同步输入的使能信号处理。芯片内部信号、软件写寄存器提供的全局复位信号、针对某些功能的局部模块复位信号都应该采用同步复位策略。所有的时钟信号和复位信号在芯片的最顶层都必须是可控制和可观测的。

作者:xlinxdu
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。