搜索
查看: 570|回复: 3
收起左侧

FPGA设计干净的代码是程序员的核心技能

[复制链接]

签到天数: 2 天

连续签到: 2 天

[LV.1]初来乍到

4

帖子

2

魅力

22

积分

实习生

发表于 2019-7-25 10:00:53 | 显示全部楼层 |阅读模式
在正式开始之前,我们先看看一位FPGA工程师的工作日常:
开始设计代码
开始写第一个always代码
发现要增加一个信号,因此写第二个always,设计这个新增的信号
回到第一个always上,继续完善这个代码
开始写第三个always代码
感觉第一个always有情况没考虑到
一阵重新思考
回去修改第一个always的代码
写完后,得了,不检查代码了,仿真再说吧。

仿真过程:
每个时钟上升沿一个一个检查
发现这时某信号没有变高
检查代码,把BUG补上
继续检查波形,继续补BUG
发现信号A和B时序对不齐
思考是打补丁呢还是打补丁呢
是改这个信号呢,还是改那个信号,还是加一个信号
一番折腾后,终于对齐了
修改测试文件,再测试
还是有BUG,继续打补丁

该上板调试了
系统跑一会没问题,长时间跑就出BUG
用调试工具各种分析各种定位
一番折腾后,终于找到BUG
一个corner没想到/粗心大意漏了个条件/
早知道,要没这BUG,我早就做完了

又出现BUG了,又要来折腾啦。
这个场景是不是觉得很熟悉?还有下面这些情形也许都遇到过:一个项目看上去很简单,精心设置了架构,结果越做发现冲突越多,直到整个逻辑完全混乱。本来一天可以的完成的事不知道怎么搞的一个星期还没有完成;本来只需要做一行更改,结果却涉及到N个模块;出现了一个非常小的BUG打了一个补丁,然后补丁越来越多,到最后无法解决。诸如此类等等情况不一而足,究其原因,总离不开“混乱”两个字。这些混乱的根源是什么?又该如何解决呢?
一个好的FPGA项目的设计作品,不仅依赖于架构设计,优秀的代码也是必不可少的关键因素。而好的代码最基本的就是清晰整洁。整洁的代码运行稳定,也是后期维护和升级的基础。正如C++语言发明者Bjarne  Stroustrup说的那样:“代码逻辑应当直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,避免其他人优化时不知所措从而出现混乱状态。整洁的代码只做好一件事。”
首先,我们建立一个通用的计数器模板,命名为jsq。每次遇到计数器,只需要输入JSq,即可调入该模板。(注:关于模板的设置以后章节介绍)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)
            cnt <= 0;
        else
            cnt <= cnt + 1;
    end
end
assign add_cnt = ;      
assign end_cnt = add_cnt && cnt== ;
接下来设置什么时候个位+1,分为两种情况:1、按键按下去;2、自然计数+1;(第13行)
采用变量法设置X-1;即先不用去管数多少下,反正数完就清零;(第14行)
最后我们设置数多少下。20:00时数4下;其它时候数10下;(16~21行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)
            cnt <= 0;
        else
            cnt <= cnt + 1;
    end
end
assign add_cnt =((set_flag == 1'b1 && set_sel == 4)&& (key_vld == 1 && key_num == 4'b0010)) || shi_ge_add ;      
assign end_cnt = add_cnt && cnt== x-1 ;
always  @(*)begin
    if(shi_s == 2)
        x = 4 ;
    else
        x = 10 ;
end
现在我们来回顾一下这段代码,从中不难发现,设计的总体思路有着严密的逻辑和步骤,并采取了便捷工具(模板)来规范了代码编写,减少了设计量。最重要的是设计者的意图清晰了然,控制语句直截了当,代码之间相互依赖性非常低,作者之外的开发者阅读和增补非常轻松。

签到天数: 28 天

连续签到: 2 天

[LV.4]偶尔看看III

381

帖子

3

魅力

698

积分

助理工程师

社区QQ达人

发表于 2020-5-28 13:42:51 | 显示全部楼层
支持EDACEO拿分走人呵呵,楼下继续!
高兴 高兴
回复 支持 反对

使用道具 举报

签到天数: 386 天

连续签到: 4 天

[LV.9]以坛为家II

458

帖子

2

魅力

2521

积分

高级工程师

发表于 2020-6-6 10:44:20 | 显示全部楼层
支持EDACEO拿分走人呵呵,楼下继续!
哈...今天好开心,签到来了1...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

edaceo论坛网:创建于2011年05月17日,力成专注于免费的EDA设计交流论坛网,经过6年多时间的发展,迄今为止论坛积累了超过90多万份EDA方面资源资料,为全国各地区约11万多位EDA爱好者提供了优质EDA设计学习交流免费平台服务。官方技术交流学习QQ群:91719738 二群:15613897

论坛通告

EDACEO无偿特约管理QQ:81377025
(特约管理只负责本站一些商务合作事务)

010-86462543(服务时间:9:00-18:00)

edaceo@edaceo.com   QQ

关于本站免责申明隐私保护联系我们网站地图闽ICP备11017193号-1
快速回复 返回顶部 返回列表