首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

《玩转IP core》之十八:磨刀不误砍柴工,程序的风格

《玩转IP core》之十八:磨刀不误砍柴工,程序的风格

有诗曰:“百亩庭中半是苔,桃花净尽菜花开。种桃道士归何处?前度刘郎今又来。”

老衲我又来讨人嫌了,大家多担待啊。这次真的是最后一讲了,留位下周可以准备好臭鸡蛋、烂番茄什么的,砸说书的人----反正和贫僧无关了。京戏里面唱得好:“我本是卧龙冈上散淡的人,…且在这沙陀住几年,落得个清闲。”(串词了,不过估计没人看得出来,哈哈哈!)

这一次唠扯的是老生常谈的“代码风格和规则”的问题。这个话题估计是和某家的“测试向量”一讲一样,不受待见的。(提起那一讲,就伤心啊,这是为什么呢?老僧从不说无用之语,一般材料就是教你写写简单的验证,没几个说如何与仿真联合测试的。不说了,也不讲吕洞宾的成语了。相信:公道自在人心。)

“代码风格和规则”这个问题,很多人看来不是十分重要。但是,我问问大伙儿几个现象,看看是否遇到过?过了三个月,读不懂自己的程序的,有木有?看别人代码,赶脚不如自己重写的,有木有?做C代码的,竟然能看懂你的程序的,有木有?调试的时候,感觉是老虎吃天----无从下口,有木有?如果有,以老衲的经验,多多少少和“代码风格和规则”有些瓜葛。

贫僧认真的唠唠这个话题,大家姑且听之。

变量与参数命名
1.不用语言的关键词命名变量与参数
这是废话,就是我同意您老这么变态,编译也不会教您好受的。
2.命名尽量体现信号的特点
很多人不喜欢长的名字,不是到是键盘输入不好还是懒。贫僧建议还是长点的名字更利于以后的阅读。例如,一个同步信号名字叫“syn”看起来简单呢,还是“synchronization_1sec”看起来容易理解?
3.常数,尤其是状态机的状态面,用宏表示
代码里面的常数,在后期阅读中绝对是埋下的地雷,需要专门的注释或者处理。在做状态机的时候的状态名称是自己规定的,这时候宏就是一个很好的机制。“if state == STATE_IDLE”远比“state= = 4’b0000”容易理解。
4.所有定义必须有说明
这些说明内容需要尽可能详细,尤其是位宽、速度这些信息一定要有,以方便以后重用。我们前面各讲都说了,系统内部参数的位宽,会影响结构的设计。很多程序员为了以后的重用,又喜欢吧位宽定义为参数。这样问题来了,原来8比特的代码,到了128比特能重用的可能性有多少呢?所以,一定要好好说明,防止被误用。
5.宏、参数和变量等通过名称里面的大小写区别,并且严格执行
这是防止例如给宏赋值之类的错误,也方便代码的阅读。
代码与注释
1.模块开头必须加详细说明,介绍输入、输出、功能以及参考文件
2.注释必须有一定的比例
很多人不重视写注释,认为不是有效代码,敲起来还老长。实际上,很大程度上,注释就是你为以后自己阅读代码留下的指路标记,用来防止后面你自己都不认识自己的代码了。
3.首格缩进一定要对齐
这也是为了方便阅读,首格缩进不一致很容易造成阅读困难。
4.一个always模块里面只操作一个寄存器
以前强调过,我们设计是“看图说话”,所以这个要求不难达到。那些说“臣妾做不到”的,肯定是不自信、心急的,不画图就写代码了。这个风格实在是问题多多。
5.“if”语句层次不能太多
“if”就是比较器,多层的“if”就是串联的比较器,这或造成组合逻辑在时间上的灾难。
6.分层设计,每个模块的功能必须单一
自顶向下,分层设计是被实践证明最有效的工程流程,需要遵守。
调试与纪录
1.在修改程序时,不要直接修改原来部分,最好注释掉原来语句,在重写修改部分
一般规律,改错比改正容易。所以保留原来的部分,实在不成还能恢复,否则可能是欲哭无泪。
2.认真纪录模块注释的“历史”部分
列宁说:“忘记历史就意味着背叛”,贫僧曰:“纪录历史,防止二过”。
3.如果有很多函数要修正,请一个一个地作,修正一个函数检查一个函数
一次修改多处,出了问题都不知道到底是哪里的问题了。
设计风格
1.严格采用同步设计,异步部分必须隔离。所有模块中触发一致
2.所有寄存器的输出信号都能被复位/置位;
3.遵守先写后读,否则要清醒地剔除掉无效数据
4.每个模块寄存器入寄存器出
5.相信综合工具,bug绝对是自己搞的,别瞎怀疑
6.嵌入式存储器中使用BIST
7.如果时间充裕,通过时钟做一个多锁存器来取代用MUX
8.芯片内部无需“三态”
9.一定要做时序仿真
10.一个计算式中,排列每个信号的位数
11.不要使用语言里面的复杂逻辑。例如:乘法器和触发器

常言道:“天下没有不散的筵席”,和诸位就此别过了。(下面的小妞,别哭啊----YY一下下。)有希望进一步交流的,请加老衲的微博:“与非网说书人加菲”,sina的。

片尾曲:“将身儿来至在大街口,尊一声过往宾朋听从头:一不是响马并贼寇,二不是歹人(那)把城偷。杨林与我来争(呐)斗,因此上发配到登州。舍不得太爷的恩情厚,舍不得衙役们众班头,实难舍街坊四邻与我的好朋友,舍不得老娘(呐)白了头…”
--------
《玩转IP core》之一:我们的目标是ASIC
摘要:具体到一个产品里面,到底是采用FPGA还是ASIC,这个问题是多方面确定的。简单说,如果产品出货量小、时间紧、生命周期短,那么FPGA比较适合;反之就建议ASIC。但是,也不是完全绝对的,就像很难说少林和武当那个更牛一样。
《玩转IP core》之二:所见非所得
摘要:Verilog语言是由Gateway设计自动化公司的工程师于1983年末创立的;VHDL语言诞生于1983年,1987年被美国国防部和IEEE确定为标准的硬件描述语言。这个古人也“古”不到哪里去。上板砖!
《玩转IP core》之三::统一行动听指挥
摘 要:现在我们正沿着PCB数据大道,走向芯片大厦----就是大家眼前的巨大的、银色的大厦。我是本次旅行的导游,敝姓十,大叫可以叫我十导。路途之中, 为了大家不感到无聊,本人先给大家略略介绍一下,什么是数字电路的时钟。数字电路中,时钟是整个电路最重要、最特殊的信号。
《玩转IP core》之四:踏雪寻熊---面积与速度的协调
摘 要:具体到我们的FPGA/ASIC设计,这个“鱼”就是面积,而“熊掌”时钟频率(速度)。能不能很好的协调面积与速度的关系,是衡量一个数字逻辑设计 工程师能力的一个重要标准。在本讲座的第二篇里面,会说明各种单元模块的不同面积和速度的基本解构;在第三篇中,则会通过例子,介绍如何在系统中很好综合 考虑两者的关系,选择比较合适的实现解构。
《玩转IP core》之五:测试向量生成
摘要:在不考虑电源输入的前提下,在我们系统/板子上,能够不依靠其他外界输入而产生输出信号的器件有木有呢?当然有,而且必须有,那就是大名鼎鼎的晶振了,用来产生我们说过的、对以系统极端重要的系统时钟信号。
《玩转IP core》之六:程咬金的三板斧--系统基本结构

摘要:今天我们开始进入本讲座的第二部分:单元篇。大家将会发现,我们在基本单元设计里面,也就是三板斧:查找表、时分复用和流水线。但是,我们比程大将军稍稍高一点,我们会把这三招糅合,能产生变招。
《玩转IP core》之七:一个计数器引起的思考
摘 要:设问句:在进行一个计数器单元设计之前,我们需要什么前提条件呢?首先,需要功能描述(一个计数器嘛,不就是在不是复位“RST”的状态,每来一个时 钟内部/输出加一吗?还描述什么啊?磨洋工吧?----“非也,非也”,这个还是要描述一下。至少我们需要知道一下计数器的内部位数吧?也就是,计数器加 到多大回到0。)另外,就象我们在前面“菜谱”那一讲里面说过的,需要了解系统需要的时钟频率。
《玩转IP core》之八:小学一年级水平:加法器的结构
摘要:工程设计里面有一个原则:从简单做起。这里面还有一个小故事,今天就不讲了。现在,我们先瞧瞧最简单的一个比特位宽的加法器:半/全加器。全加器的输入为三个一比特的信号a0、a1,还有低位的进位c0;输出也是两个一比特的信号:结果s和进位位c1。
《玩转IP core》之九:小学二年级水平,乘法器的结构
摘要:通过前两次讲座,了解了计数器和加法器大体结构。大家不难发现,同样的一种功能,可能由于需要、工作频率和代价的不同要求,存在若干种不同的结构。这些结构如何选择,实际上是一个艰难的选择。这些选择,很多时候都是靠一个工程师的经验...
《玩转IP core》之十:升入小学三年级,除法器的结构
摘 要:如果各位在加法器和乘法器里面可以欣赏到了变化多端的话,那么在下不得不很遗憾的通知诸位:除法器里面大家只能看到“自古华山一条路”。不是我保 守,是除 法这个东西的本性。用《数学分析》里的说法,加法和乘法都是线性运算满足交换律的,除法是非线性运算不满足交换律的。这是数学上的根子,可以用来唬人。
《玩转IP core》之十一:非线性求值的孤独九剑,CORDIC方法
摘要:现在来个“师夷长技以制夷”,给大家画画CORDIC的流水线(因为是小数运算,假设实数“1”为十六进制的全1,实数值就可以折算了。这是普遍的技巧,不详述。)。还有一个小技巧就是由于每步的放大作用,公式里预先收缩了一把。
《玩转IP core》之十二:电路串串香,D触发器链
摘要:今个儿寡人给大家讲点有“理论”的:CRC校验和编码器。CRC校验的目的 就是看接收的一串比特和原来发射的是不是一致,有没有接收误码。CRC在编码界的春典,就是“gCRC16(D) = [D16 + D12 + D5 + 1]”和“1 0001 0000 0001 0001”。给大家一个口诀:“延时触发串一串,遇到一字砍一段。输入牵来异或算,输出导出入口看。”
《玩转IP core》之十三:简直的层层叠,FIR滤波器的串联实现
摘要:今天我们继续信号处理的行程,给大家介绍FIR滤波的串行实现。却说“请介绍FIR滤波器和IIR滤波器的差别”,这可是一道非常典型的面试题。这道题目类似于《哈利ˑ波特》里面那个“分院帽”的作用,当然这个题目里面没有宝剑。
《玩转IP core》之十四:我的地盘我做主,锁相与分频
摘要:在做设计的时候,谁都希望片子的输入时钟是稳定的、可靠的,并且和我们系统的采样频率是一致的。这是最理想状态。可惜啊,希望是丰满的,现实是骨感的。很多时候,情况并没有这么理想。这种时候,就需要我们自己调节系统时钟,达到系统工作的目的了。
------------------=--------
如果你从事FPGA研发,或者你对IP core设计感兴趣,欢迎关注《玩转IP core》系列技术讲座,每周三加菲博士与你不见不散,如果针对本讲座有任何技术问题欢迎与加菲进行技术互动可以加入QQ群(FPGA交流圈:23294742),或者去交流区提问:《玩转IP core》交流区


下一页 剩余页
返回列表