tag 标签: 博客大赛,ASIC,FPGA

相关博文
  • 热度 16
    2017-8-5 11:38
    1611 次阅读|
    0 个评论
    本篇 对 SOC 设计 ,FPGA 设计也有相当大的借鉴意义 . 本着帮助别人 , 提升自己的宗旨 , 记录 , 总结 , 回忆从接触这个行业的所听 , 所记 , 所感 . 其中一部分经验是自己实战总结的 , 一部分经验是从书上看到的 , 一部分经验是从别人那学到的 . 难免会有错误 , 还请大家不吝指正 . IC 设计其实是一个门槛特别高的行业 , 要学的专业特别多 , 要会的工具特别多 , 要走的流程特别长 , 要花的时间也要足够 , 所以你可以理解为他是一个要求特别多的行业 . 你可以认为他是高富帅行业 , 也可以认为他是屌丝行业 , 但是这都不妨碍他对这个社会的巨大贡献 . 因而学会 IC 设计于己于人都是相当有诱惑力的 . 本篇介绍从 5 个方面来谈 IC 设计实战经验 : 一 : 设计架构的划分 , 这一块是相当重要的 , 你可以在很多的书籍中看到 , 很多的书籍中也都会谈论如何进行架构的划分 . 架构的划分好比盖房子 , 设计好整个房子的结构 , 后面才能一砖一瓦的网上填 , 最后的摩天大楼才能建成 . 架构的划分又可以分为如下几个方面 : 1 )   软硬件划分 , 什么归软件来做 , 什么归硬件来做 , 如何达到效率的最高效 ; 这个方面其实很困难的 , 一般都是相当有经验的人才来做架构的划分 , 但是一般会遵循一些原则 , 即 : 软件的灵活性比较大 , 所以一般做一些控制类的活儿 , 硬件的并行性比较大 , 所以一般用来做加速 , 遵循这些原则的话 , 划分以来或许简单一些 . 当前比较流行的做法是软硬件协同设计 , 具体可以参考相关的书籍 . 2) 算法设计 , 例如快速搜索 , 快速比对 , 软件的一些思维未必适合硬件实现 , 因为硬件需要考虑资源问题 , 需要考虑速度和面积 , 需要考虑组合逻辑的延时等等 , 不能一味的追求单方面而忽略了其他的方面 . 3) 性能因素的考虑 , 譬如带宽为多少合适 , 太宽并不一定就会很快 , 要考虑如何提升吞吐率 , 可以从各个方面入手 . 4) 模块设计的划分 , 一个太大的模块不适合实现 , 也不适合维护 , 当别人接手时也很难快速的理解 , 所以模块划分要得当 , 可以基于接口 , 基于功能 , 基于灵活性 , 一个好的划分会带来很多的好处 , 例如易于维护 , 易于理解 , 出错概率低 , 相反 , 会看起来很臃肿 , 很奇怪 , 也难以维护升级 . 另外模块代码的行数不易过多 , 当然也没必要划分出几十个小的模块 , 那样维护起来也是相当的痛苦 . 二 : 设计技巧 , 这一部分包括如下几个方面 :   1) 利用脚本加速开发 , 例如利用脚本进行接口的自动连线 , 快速复制相似的代码 , 如果恰当合适的利用脚本 , 会使你的开发事半功倍 . 2) 状态机的设计 , 组合逻辑和时序逻辑分开 , 状态机不宜过大 , 否则会出现很大的比较器 . 3)one hot 编码推荐使用,这个在后面的 ECO 时比较方便更改。 4 )流水线技术,这个技术可以提高吞吐率,有利于时序的优化,利用流水线技术可以高效发访问 DDR ,但是流水线也有弊端,例如某个阶段的时间太长,或者某个阶段依赖于前一个阶段,流水线一定要设计得当,否则可能会弄巧成拙。 5 )利用链表技术可以节省 memory 的使用,当然这个很多时候要看具体的应用场景。 6 )在设计模块的时候,可以简单的设计一个可以综合的 Testbench ,这样你可以不依赖单独设计 Testbench 的人,你可以继续往后推进你的模块设计,你可以上 FPGA 开发板上简单的验证。 三 : 设计实现技巧 ,你的设计一定要是可实现的,否则你的设计没有任何意义,就是一堆垃圾字母而已。该技巧包括如下几个方面: 1 )你的电路要具有可测试性 DFT ,这个可以在后端插入 scan ,你的电路中的 memory 要有 mbist 的电路,用于自动产生数据读写 RAM ,自动比对结果,一般这都是到后端后会接触的东西。 2 )你的电路要能够做 STA ,你的电路中最好只用一个沿来采样( DDR 这种情况除外),因为很难保证两个沿都能卡的很好。 3 )注意跨时钟域的处理,跨时钟域如何进行验证。 4 )功耗和面积之间的权衡,门控时钟的使用, RAM 的使用。 5 ) FPGA 的选择,到一定程度时,电路需要到 FPGA 上进行验证,快速的 FPGA 十分的昂贵,便宜的可能又达不到项目的需求,所以一定要权衡好两者之间的关系。 6 )关于 RAM 的实现,可以用 register 实现,也可以采用生成的 ram 实现,一般比较小时采用 register 实现(一般小于 512bits ) , 而且 RAM 要尽量成正方形,因为太深或者太宽的 ram 不好布局布线,他占了一块面积后,其他的只能扰很的距离来布局布线,不利于时序的优化。 四 : 设计调试技巧 ,你的设计在后面将转为大量的调试 , 无论是波形仿真的调试 , 还是上 FPGA 的调试 , 或者是芯片回来的调试 , 都是一份相当大 , 相当困难 , 相当耗时的艰巨任务。该技巧包括如下几个方面: 1 )你在设计的时候就要充分考虑如何进行后续的验证 , 你可以拉出一些信号进行调试 , 但是由于出 pin 的数量限制,所以你可以利用 mux 分级拉出信号,然后用寄存器配置的方式,选择哪些 pin 被拉出,这样你可以拉出很多的 pin. 2) 你可以加一些寄存器用于调试 , 例如中断寄存器, error 寄存器,状态机寄存器,拉出状态,看状态跳转的是否正确。 3 )如果你的设计中有 ram ,你要充分考虑 ram 该如何验证,否则 ram 出错的话将是十分头疼的事情。 4 )如果你做的是通信类的设计,要考虑 loop_back 模式的测试,这样不需要和别的设计进行连接。 五 : 沟通的技巧 ,这一块说不重要其实可以说是最重要的,设计的要和验证的沟通,硬件的要和软件的沟通,做技术支持的要和客户沟通,上下级要沟通,反正沟通无处不在。所以你要注意下面几个方面: 1 )保留平时的沟通记录,可以帮助你到时候进行 review ,也可以帮助你到时出错时作为证据。 2 )通过各种手段进行沟通,例如邮件,电话,会议等等,要充分让别人懂你说的,你也懂别人说的,开会不要漫无目的,要把握时间。 3 )沟通的最主要目的是发现问题,解决问题,所以怎么高效怎么办。 ​ ​