FPGA代码设计规范一些探讨

news2024/11/28 19:27:44

代码设计规范的重要性

        经过一段的工作积累已经慢慢进入了提高和进阶的阶段,在这篇博客里多聊一聊在现实工作中的话题,比如代码规范以及如何尽快接手前人代码,快速定位项目问题。

        显然每个FPGA工程师的设计理念和代码风格很多情况下有一些差别,比如有的FPGA工程师青睐于Gvim编辑器下的计数器和状态机模板,有的则用习惯了Notepad++、UE等其他编辑器,代码风格会存在一些不同;也有的模块划分理念很弱,一个.v文件吧啦吧啦写了好几千行,包括了底层协议实现、上游命令解析、数据计算处理等等很多内容,然后代码放了一段时间后,写代码的当事人自己再看都不知道哪里对哪里;还有的命名不规范,代码逻辑混乱,导致可读性差,透过代码可以感受到同事是想到哪里写到哪里,在编码之前脑子里没有个整体思路;最后崩溃的地方可能是前人代码逻辑也做了大量Testbench仿真测试,但是还有些隐形的问题没有暴露出来,而实际落地的时候又出现了问题,回头再去检查程序,如同看到一堆if else、flag、定时器的单片机裸机程序一样让人头疼,但是接手后因为情况紧急,还被指定在deadline前搞定,那么当时心情一定非常复杂的。

       一般比较大型项目按照模块划分可能会有很多个FPGA工程师一起完成,然后再对接好各个模块的信号;也有不少中小型企业为了降低用人成本,甚至写ARM和FPGA的都是同一个人;还有一些工程师利用业余时间和其他人创业,最后变成写程序和画板子都是一个人在做,那么不管与他人合作完成项目也好,还是自己独立承担项目也好,代码设计规范一定是非常重要的事情,优秀的代码风格会让大家事半功倍!

       笔者也在这里简单总结了下,抛砖引玉,其实说到底,不管怎么样的编程风格或者书写习惯,如果大家在编程的时候可以有意识地做到以下这几点都是非常棒的,满足了代码的设计规范同时也大大提高了工作效率。

一、代码简单化

        大部分初学者可能觉得代码写得越复杂越可以体现编程水平,笔者最开始学习Verilog的时候也是这样想的,看到逻辑复杂的代码虽然不明觉厉,但是仍然心生崇拜。可事实上却不是这样的,当项目复杂度越来越高,代码都需要经过多轮的审核等才能被应用在项目工程里,如果大家写得代码都非常复杂繁琐,那么后期带来重用的工作量是非常巨大的,也非常不容易理解当事人的想法,所以请大家编程的时候,尽量去使用常见的基本语法,也有利于工具的资源优化,对于复杂功能的模块理清楚逻辑,可以先用前面学习到的TimeGen绘制各个信号的波形图,分析明白后再动手编程,从而减少了语句之间的耦合带来程序设计上的二义性。

二、注释层次化

      项目工程中代码越复杂,注释的必要性也就越大,注释层次化可以提高其他人对整个代码的理解,让其很快能理解到各个模块以及信号名的意义,笔者建议朋友们,在编写代码的时候,如果可能的话可以把每个模块的具体功能逐一标注出来,然后每个子模块的子步骤也标注出来,这样既满足了FPGA设计中自顶向下的设计理念,也极大地增加了代码的可读性,让其他人接手后很快就能了解到你的设计意图。

三、交互清晰化

       交互清晰化主要是指模块和模块之间的接口信号、模块内子模块的交互清晰明了,容易理解没有歧义,不需要来回去猜想去验证,同时随着当前数字电路设计越来越复杂,一个项目里面每个人需要写的代码数量也越来越多,在不同人写的模块之间又需要彼此接口信号的配合,这里显然都需要理解对方的意图,否则就容易出问题。笔者建议最好由公司制定或者同事间多协商一些规则,接口处的信号名称最好都统一化,信号功能描述明确方便理解,比如din、din_vld、dout、dout_vld、rdy、sop、eop、req、ack等等,让大家一眼看去就明白什么意思。

四、模块最优化

        任何再复杂的系统也都是由一个个子模块组合在一起完成的,如果模块划分不合理,必然会出现很多后期让人头疼的问题,有很多血淋淋的教训,比如出现模块间耦合太多,导致系统健壮性不够;本应该多个模块实现的功能强行放到一个模块,导致代码可读性很差;前期考虑欠缺经验不足,导致代码稳定性很低等等。

五、方案精细化

      设计方案是编写代码的前提条件,越是功能复杂的项目,越需要在前期把方案明确化,把思路清晰化,可能大家在初学FPGA的时候,都希望多编写代码,多敲多练,这本身是很好的想法,但是当走到工作岗位后,这种思想就不合适了,磨刀不误砍柴工,想好再动手永远比一抹黑地生干生做要效率高很多。

      举个现实的例子,比如朋友们接手一个新项目,涉及到了数字信号处理、接口通信协议、控制外围器件、与ARM或者DSP建立通信机制等等实际需求,这时候就不要上来就写代码了,

       请多去对需求分析,多去画设计图纸,前期增加方案时间,后期减少返工时间。笔者曾自己独立完成过一个较为复杂的项目,前期方案验证花了3个半月包括核对工作量,核实可行性,查阅手册、了解细节等等,后期编程用2个月的时间一直在编写代码、仿真验证、上板调试,因为有些东西是第一次接触,所以做起来有时候会出现卡壳的情况,但是前期方案明确指导编程,后期几乎每周都可以看到实打实地进展。

      前期方案设计应该更细节化,需要达到指导编程的目的,同时也需要验证一些可行性。如果是大企业也会组织方案评审等,这时候就需要把方案写得更加明了易懂,其中包括了:功能描述、架构实施、模块划分、实现细节、时序波形、接口描述等等,甚至一些公司内部也有一套很细致的评审方案。

六、资源合理化

       方案设计的同时不可避免地要提到资源的使用程度,因为资源的使用程度最后决定了芯片选型和外围电路,就如嵌入式研发中那句经典的话一样:需求决定硬件,硬件决定软件,如果芯片选型不合适,那么后期FPGA工程师也巧妇难为无米之炊,导致项目延期等一系列的问题。

       资源占用情况是评估选用哪种器件的前提,这里也很关键,就如前面Xilinx Artix7硬件设计小节提到过的一样,嵌入式产品软件和硬件是紧密结合在一起的,在芯片选型的时候,请大家注意以下两点,也是在项目工程中积累到的经验:1.尝试去评估最恶劣情况下的资源使用量,很多新的项目在初期往往需求不算很多,但是随着产品的更新,对软件上面的需求也越来越大,这时候可以折中地选择性价比最高的芯片;2.增加一些裕量,在整体方案评估完成后,评估整个设计对FPGA芯片各种逻辑资源的使用率,适当增加一些使用裕量。

七、时序整洁化

        时序设计是Verilog代码编写的前提,优秀的时序逻辑是设计出来的,而不是后期生搬硬凑出来的。所以大家在学习实践过程中,需要有意识地多加积累一些优秀的时序设计思路,比如典型的有流水线处理的思想,流水线设计从某种角度来说,可以很大程度上提高整个系统设计的频率,常用于高速信号处理领域,如果一个设计可以细分为若干步骤进行处理,而且整个数据处理过程又是单向处理的,即没有反馈运算或者迭代运算等需要双向处理的,通俗地说前一个步骤的输出即为下一个步骤的输入,这时候就可以考虑采用流水线设计的方法来大大提高整个系统的工作频率。

       在很多高速信号处理领域都运用了流水线设计,如高速接口通信、多路信号采集、图像加速处理等系统。举个例子,在一个高速接口处理的系统中,可以设计第一个时钟周期进行数据接收、第二个时钟周期进行数据处理、第三个时钟周期进行数据拼接、第四个时钟周期进行数据校验等等。

FPGA代码设计规范

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 基于PHP+MySQL的学生成绩管理系统

学生成绩管理是每一个学校都会面临的一个问题,传统的管理模式已经明显到和时代不同步。通过我对当前学校成绩管理的需求和自己的实习经验整理出了一个能够满足大多数学校的学生成绩管理系统。本系统分为管理人员,教师和学生三种用户,每种用户各负责其一部分功能然后通过他们的整…

Web前端开发基础教程二

注释和特殊字符&#xff1a; 如果需要在html文档添加一些便于阅读和理解但又不需要显示在页面中的注释文字&#xff0c;就需要使用注释标签。 html中的注释以“<!--”开头&#xff0c;以“-->”结束或者快捷键&#xff1a;Ctrl/。 举例&#xff1a; <!-- 我想放假 …

【实战】Mysql 千万级数据表结构变更 、含脚本

一、实测结果 业务无感知&#xff0c;无死锁平滑 线上800万数据以下 直接使用 alter 新增字段 300ms左右 2000万数据&#xff0c;强制使用主键索引&#xff0c;每次查询50万数据 并插入新表 &#xff0c;耗时 20s &#xff0c;cpu 占45% 二、整体步骤 创建新表 biz_table_ne…

Vue-脚手架的创建

本篇vue3的脚手架主要是使用vue-cli进行创建&#xff0c;有网的情况下才能创建成功 文章目录一、下载node.js二、全局安装vue/cli三、使用vue-cli创建项目3.1 使用vscode打开终端3.2 创建项目3.3 创建成功四、注意事项一、下载node.js 1、打开node的官网 node官网 2、点击下方图…

Oxygen XML Editor 25.0.X Crack

XML 编辑器 Oxygen XML Editor 是完整的 XML 编辑解决方案&#xff0c;适用于 XML 开发人员和内容作者。它提供了必备的 XML 编辑工具&#xff0c;涵盖了大多数 XML 标准和技术。Oxygen XML Editor 包括 Oxygen XML Developer 和 Author 的所有功能。 特点与技术 单一来源出版 …

【树莓派不吃灰】使用frp内网穿透,实现远程访问树莓派

目录1. 前言2. frp内网穿透2.1 概述2.2 实现原理3. 开源frp项目4. 公网服务器选型5. 下载frp软件5.1 公网服务器下载frp服务器5.1.1 github选择适合服务端的版本5.1.2 公网服务器进行下载解压5.2 树莓派下载frp客户端5.2.1 github选择适合客户端的版本5.2.2 树莓派进行下载解压…

流形上的预积分(上)

预积分和流形 论文&#xff1a;IMU Preintegration on Manifold for Effificient Visual-Inertial Maximum-a-Posteriori Estimation 引言 Recent results in monocular visual-inertial navigation (VIN) have shown that optimization-based approaches outperform filteri…

免费体验CSDN云IDE使用指南

云IDE产品介绍 云IDE使用教程 免费使用地址&#xff1a;点击【云IDE】&#xff0c;即可开始创建工作空间啦~ 官方活动入口 文章目录1.免费体验CSDN云IDE使用指南1.1云IDE优点2.自己的代码在云IDE上跑起来看看如何操作2.1 克隆开源仓库2.2 创建一个空工作空间2.3 使用默认模板代…

Thread类中run和start的区别

一.认识 Thread类 中的 start() 和 run() 首先来看一张jdk-api中对于start 和 run 的描述. 二.方法的区别 下面我们简单看一下代码: // 继承Thread类 重写run() class MyThread extends Thread {Overridepublic void run() {while (true) {System.out.println("thread&q…

如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)

以下只是做简单的演示、大致实现的效果。页面效果需要进一步优化。目的是提供思路 视频效果&#xff1a; 首页商品跳转1、需求 1、首页的的商品来自接口数据2、在首页点击某一个商品跳转到更加详细的商品介绍页面&#xff08;可以购买、加入购物车、查看商品评价信息等&#x…

频频出现的DevOps到底是什么呢?浅浅了解下什么是DevOps吧

文章目录 &#x1f4d1;前言 &#x1f9e9;DevOps的概念和起源 &#x1f4f0;DevOps的概念 &#x1f4f0;DevOps的起源与发展 &#x1f4f0;总结 &#x1f9e9;DevOps的发展 &#x1f4f0;发展过程速览 &#x1f4f0;发展现状 &#x1f4f0;未来发展 &#x1f4c4;以…

【前端】JavaScript数据类型

目录 一、数据类型简介 二、简单数据类型 数字型Number 1.数字型进制 2.数字型范围 3.数字型三个特殊值 4.isNaN() 字符串型String 1.字符串引号嵌套 2.字符串转义符 3.字符串长度 4.字符串拼接 布尔型Boolean Undefined和Null 三、获取变量数据类型 四、数据类型…

res.add(new ArrayList<>(path))和res.add(path)的区别

一.问题描述 在链表path里面添加值&#xff0c;之后把path链表添加到res链表中&#xff0c;自己做的时候使用res.add(path)&#xff0c;结果发现出现解答错误。 题目链接&#xff1a;113. 路径总和 II - 力扣&#xff08;LeetCode&#xff09; 代码如下&#xff1a; class …

网络初始之网络协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 1.局域网&#xff1a; 概念&#xff1a; 构建方式 2.广域网&#xff1a; 3.IP地址&#xff1a; 4. 端口号&#xff1a; 常考点&#xff1a; 一、…

【单端S参数与差分S参数转化】

单端S参数与差分S参数转化 1 单端S参数说明 对于单端信号来说&#xff0c;用单端S参数来描述其传输特性&#xff0c;如常见的2端口网络&#xff0c;其S参数包括S11&#xff08;1端口回波损耗RL&#xff09;、S21&#xff08;插入损耗IL&#xff09;、S12&#xff08;插入损耗…

[JSON] JSON基础知识

JSON(JavaScript Object Notation&#xff0c;JavaScript对象表简谱)是一种轻量级的数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据 JSON文件的文件类型是.json JSON是纯文本&#xff0c;具有层级结构&#xff0c;易于阅读和编写&#xff0c;其本…

【愚公系列】2022年11月 微信小程序-优购电商项目-商品支付页面

文章目录前言1. 商品⽀付页面设计规范一、商品支付页面1.业务逻辑2.涉及的接口数据3. 关键技术二、商品购物车页面相关代码1.页面代码2.效果前言 1. 商品⽀付页面设计规范 第一、支付流程一定要简单。现代人的生活节奏是非常快速的&#xff0c;而且情绪比较浮躁。当用户在浏览…

深入理解Java内存区域(最新版面试题)

1、什么是JVM&#xff1f; JVM&#xff08;Java Virtual Machine&#xff09;是用于运行Java字节码的虚拟机&#xff0c;包括一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器。JVM运行在操作系统之上&#xff0c;不与硬件设备直接交…

微信小程序消息订阅Java

前言 编写日期 : 2022-11-04 写这篇文章原因 公司给政府做一个订餐系统&#xff0c;需要在员工在小程序上发起订餐后经过部门领导和书记的审批后&#xff0c;再由食堂确认订餐结果。在订餐审批单在各个节点流转的过程中&#xff0c;需要给每一个节点的审批人发送微信订阅消息…

Linux企业应用——Docker(三)之史上最简单,一篇学会Docker私有仓库Harbor的搭建

文章目录一、什么是Harbor二、搭建私有仓库1.安装docker-ce2.安装软件库包3.创建认证三、在另一台已安装docker的主机上四、搭建Harbor测试docker hub虽然方便&#xff0c;但是还是有限制&#xff1a;• 需要internet连接&#xff0c;速度慢• 所有人都可以访问• 由于安全原因…