来源:数字逻辑与Verilog设计实验课讲解,个人做的笔记与整理。

00 规范的重要性

  1. 良好的编程风格有利于减少消耗的硬件资源,提高设计的工作频率 。

  2. 提高系统的可移植性和可维护性。

  3. 程序的格式化能体现程序员的基本素质和整个团队的风貌。

01 命名规则

有C语言基础的这部分可以简单略过,看看即可。无基础的可以跳过,有一定编程经验后再来总结提高。

01-00 命名字符集

用于命名的字符集为:字母A~Z和a~z, 数字0~9以及下划线组成。

例如:

1 data_bus
2 data_width
3 clk_48M
4 //使用用意义的名字,利于望文生义,便于维护
5 ​
6 48M_clk//名称不能以数字开头
7 data__bus//不能连续使用下划线
8 data*bus//不能包含非字母符号

01-01 命名大小写规则

  • 参数(parameter)、常量(constant)和块标号(block label)名必须一致采用大写;

  • 而信号,变量和结构名(construct)以及实例标号(instance)必须一致采用小写。

  • 有利于在仿真时,区分不变和变化的 数据。

例子:

 1 module display_led(     //模块标号小写
2 clk_48M, //时钟
3 ledout //LED输出
4 );
5 input clk_48M; //48M系统时钟
6 output [7:0]ledout;//LED输出控制
7 reg [22:0]count; //计数器
8 reg [7:0]led_reg; //LED输出缓存区
9 wire led_clk; //LED显示时钟控制
10 parameter COUNTER=100;
11 assign led_clk = count[22]; //LED显示时间控制

01-02 名字必须唯一

不区分大小写的情况下,名字必须唯一。例如,名字state和State不能同时出现在同一设计中。因为有的EDA工具不区分大小写。

01-03 不同类型的信号的命名习惯

  • 如果一个名字由多个字组成,则使用下划线连接,用以增加名字的可读性。

  • 为了使信号的名字有意义,可以根据信号类型选取相应的后缀。

具体示例如下:

命名 信号类型 实例
xx_r 寄存器类型 Data_out_r
xx_a 异步信号 Addr_strobe_a
xx_clk 时钟信号 Sys_clk
xx_nc 不连续信号 Stata_nc
xx_n 低电平有效信号 Reset_n
xx_pn 有n个相位的信号 Enable_p2
xx_z 三态信号 Data_out_z
xx_next 状态机信号 Transmit_next
xx_test 测试模式信号 Parallel_clk_test
sys_xxx 系统信号 sys_dout,sys_din
clk_xxx 时钟信号(也可这样写) clk_768MHZ
rst_xxx reset_xxx 复位信号  
st_xxx set_xxx 置位信号  

01-04 多后缀的优先权

这个确实有点抽象...

顺序:

1 //例子
2 ram_1_clk_z_n
3 //结构
4 操作对象序号_数据类型(_clk/_next)_三态信号(_z)_低电平有效信号(_n)

01-05 模块命名习惯

  • 将模块英文名称的各个单词的首字母组合起来,形成3~5个符号的缩写。

    Arithmatic logical unit —— ALU

  • 若模块的英文名只有一个单词,可取该单词的前3个字母

    Decider —— DEC

01-06 模块间接口命名

  • 所有的变量命名分为两个部分:

    • 第一部分表明数据方向,其中数据发出方在前,数据接收方在后;

      • 第一部分全部大写,

    • 第二部分为数据名称。

      • 第二部分中所有具有明确意义的英文名全部拼写或者缩写的第一个字母大写,其余部分小写。

    • 两个部分用下划线隔离开。

  • 例:CPUMMU_WrReq (CPU发送给MMU的写请求信号)

01-07 模块内部信号

模块内部的信号由几个单词连接而成,缩写要求能基本表明本单词的含义。

02 注释

主要有三点:

  1. 普通描述注释“//”就可以

  2. 文件头注释有一点麻烦,但是显得很标准。

  3. 模块之间(always)的注释参照文件头注释

    1 //****************************************
    2 //模块名称:
    3 //功能描述:
    4 //****************************************

03 代码格式

03-00 端口

1 module buzzer (
2 clk_48M, //时钟输入
3 beep, //蜂鸣器控制输出
4 key, //按键输入
5 ledout //LED显示控制信号
6 );
7 //个人感觉对于复杂电路比较有用,而实验代码就不必如此,直接类似函数参数一样声明即可。可配注释理解。

03-01 连线

1     input clk_48M;
2 input rst;
3 output lcd_en;
4 output [7:0]data_bus;
5 wire clk_lcd;
6 //紧跟module声明,一个Tab键
7 //标准要求是一行声明一个端口

03-02 正文

正文书写要求与C语言类似。

03-03 其他

  1. 用四个空格代替TAB键;因为不同的编辑系统的Tab制表符间距可能不同。

  2. 每行只有一个Verilog语句;对于长的语句可以使用回车和缩进方法,表示成连续的语句行。

  3. 避免使用硬编码;建议使用宏或则参数来定义常数,避免使用硬编码数值。例如:

     1 //硬编码方式:
    2 input [31:0] data_a; // 输入比较数据A
    3 input [31:0] data_b; // 输入比较数据B
    4
    5 //参数定义方式:
    6 parameter DATA_WIDTH = 32; //总线数据宽度
    7 input [DATA_WIDTH-1:0] data_a;
    8 // 输入比较数据A
    9 input [DATA_WIDTH-1:0] data_b;
    10 // 输入比较数据B

    下面是更多出于美观的考虑:

  4. 各节之间加1行或者多行空格

  5. 不同变量,变量与符号,变量与括号之间都应该保留一个空格 alwaya @ ( … )

  6. 逻辑运算符、算术运算符、比较运算符等运算符两侧各留一个空格。(单数操作运算符例外)

  7. 使用”//” 注释时,在”//”后应当有一个空格

数字逻辑实践2->Verilog编写规范的更多相关文章

  1. Verilog 编写规范

    在学习Python时,作者有一句话对我影响很大.作者希望我们在学习编写程序的时候注意一些业内约定的规范.在内行人眼中,你的编写格式,就已经暴露了你的程度.学习verilog也是一样的道理,一段好的ve ...

  2. 数字逻辑实践6-> 从数字逻辑到计算机组成 | 逻辑元件总结与注意事项

    00 一些前言 数字逻辑是计算机组成与体系结构的前导课,但是在两者的衔接之间并没有那么流畅,比如对面向硬件电路的设计思路缺乏.这篇总结是在数字逻辑和计组体系结构的衔接阶段进行的. 虽然这篇文是两门课的 ...

  3. 数字逻辑实践4->面向硬件电路的设计思维--FPGA设计总述

    本文是对实验课上讲解的"面向硬件电路的设计思维"的总结,结合数字逻辑课本,进行提炼和整理. 主要来源是课件与本人整理,部分参考了网络大佬的博客. 本文主要介绍不同于之前软件设计思维 ...

  4. 数字逻辑实践5->Verilog语法 | wire 与 reg 的选择与特性

    问题起因:最初学习数字逻辑设计理论的时候还没有注意到,在实验课上写代码的时候发现了一个问题: 对于源码模块的变量定义,何时定义为reg.何时定义为wire?它们各自又有什么特性和物理意义? 1. wi ...

  5. 数字逻辑实践3->EDA技术与Verilog设计

    本文属于EDA技术概述类文章 1 EDA技术及其发展 概念 EDA(Electronic Design Automation),指的是以计算机为工作平台,以EDA软件工具为开发环境,以PLD期间或者A ...

  6. css编写规范最佳实践

    最初,在编写CSS的时候,我们往往想到哪儿就写到哪儿,它们之间的关联性和有序性并不在考虑之中.但随着代码量的增加,亦或是多人共同开发,CSS的编写规范变得重要起来了.本文通过三个方面,总结出CSS编写 ...

  7. Verilog代码规范I

    Verilog代码规范I "规范"这问题 "规范"这个富含专业气息的词汇(个人感觉),其实规范这种东西,就是大家都约定熟成的东西,一旦你不遵守这个东西,专业人士 ...

  8. 代码编写规范说明书(c#.net与asp.net)

    代码编写规范说明书(c#.net与asp.net) 目 录1 目的2 范围3 注释规范3.1 概述3.2 自建代码文件注释3.3 模块(类)注释3.4 类属性注释3.5 方法注释3.6 代码间注释4 ...

  9. 【转】python编写规范——中标软件有限公司测试中心

    [转]python编写规范 一.说明 二.内容 1. 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行... 1.5 编码... 2. 语句... 2.1 标准 ...

随机推荐

  1. 15-ThreadLocalRandom类剖析

    ThraedLocalRandom类是JDK7在JUC包下新增的随机数生成器,它弥补了Random类在多线程下的缺陷. Random类及其缺陷 下面看一下java.util.Random的使用方法. ...

  2. 洛谷4719 【模板】动态dp 学习笔记(ddp 动态dp)

    qwq大概是混乱的一个题. 首先,还是从一个比较基础的想法开始想起. 如果每次暴力修改的话,那么每次就可以暴力树形dp 令\(dp[x][0/1]\)表示\(x\)的子树中,是否选择\(x\)这个点的 ...

  3. 2020.10.10--pta阶梯赛练习2补题

    7-3.N个数求和 本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(≤100).随后 ...

  4. Probius+Prometheus通过API集成POD监控

    上一篇文章Probius+Kubernetes任务系统如虎添翼讲了我们把Kubernetes集成进了任务系统Probius,上线后小伙伴反馈虽然摆脱了Kubernetes-Dashboard,但还是得 ...

  5. Java(33)IO流的介绍&字节流

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228446.html 博客主页:https://www.cnblogs.com/testero ...

  6. dubbo注册中心占位符无法解析问题

    dubbo注册中心占位符无法解析问题 1.背景 最近搞了2个老项目,想把他们融合到一起.这俩项目情况简介如下: 项目一:基于SpringMVC + dubbo,配置读取本地properties文件,少 ...

  7. TCC分布式事务的实现原理

    目录 一.写在前面 二.业务场景介绍 三.进一步思考 四.落地实现TCC分布式事务 (1)TCC实现阶段一:Try (2)TCC实现阶段二:Confirm (3)TCC实现阶段三:Cancel 五.总 ...

  8. SpringBoot打包到docker(idea+传统方式)

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 1. 方式1.通过idea 远程发布 1.1 修改docker.service文件 1. 进入服务器 2. 修改ExecStart行为下面内容 ...

  9. 梦开始的地方(Noip模拟3) 2021.5.24

    T1 景区路线规划(期望dp/记忆化搜索) 一看题目发现肯定是概率期望题,再仔细想想这三天做的题,就知道是个期望dp. 考试思路(错): 因为聪聪与可可的10分打法根深蒂固,导致在考试时想到了用深搜( ...

  10. 关于QGIS的插件开发(C++)

    关于C++插件的开发材料较少,根据网上的指导,我采用了早期版本的插件模板生成的方法来创建QGIS的插件,其方法是从以前版本(2.18.25)里面拷贝插件模板的方法进行,具体的执行步骤为 1.拷贝文件 ...