EDA/IC设计
怎么提高自己的代码水平?
怎么提高自己的verilog能力?
IC设计的难点在哪里?
这些其实都是一个问题。我们要知道我们写代码是要做什么,我们是要做到物理实现的。
所以,代码的质量和设计的难点一定是怎么做到容易实现,且实现的结果是我们的期望。一定不是写的代码多么漂亮。
当然我不否认漂亮的代码更容易维护和debug,到这只是锦上添花的作用。
难点主要是性能,功耗,面积以及时序优化。
一般来说,coding的难度并不是特别大,如果有详细的设计文档,以及较好的coding经验,完成代码实现问题不大。
IC圈有一句话叫:一千个人眼中有一千个哈姆雷特。为什么这样说呢?
每个人的设计习惯不一样,有的人喜欢相同的always块写多个变量,以便代码尽量少,而有的人喜欢代码尽量详细,让可读性更好。还有就是不同的思维模式,处理异步等问题的方式不同,可能是fifo,也可能是握手,有的人喜欢用组合逻辑,而有的人喜欢用时序逻辑,例如序列检测器可以用状态机实现也可以用移位寄存器实现,这些编码方式不同将会导致综合出来的结果差别很大。
以AXI master设计为例,设计实现难度不是特别大,要点包括:fifo处理数据和控制,outstanding深度控制,channel控制,组合逻辑实现背靠背等等。
如果只是简单实现axi master,难度不大,但是第一个难点就是怎么实现背靠背,怎么让性能实现100%?答案就是增加两次传递之间的组合逻辑。
这个问题如果解决了,就可能带来第二个问题,那就是时序问题,为什么呢?
因为组合逻辑导致delay过大,axi 频率一般又较高,就难免导致后端时序做不下去。我们的解决办法就是书上讲的pipeline,在关键路径将组合逻辑打散,但是这又是个技术活,有可能不是一条路径需要加寄存器,寄存器汇聚前面的所有路径都需要加寄存器。(好比axi接口打拍,不可能只对addr打拍,其他的也要打拍,否则不满足协议,只是举例,肯定不是这么简单,因为还有握手)一般来说,我们需要借助spyglass和PT report,充分了解我们的设计,然后一个一个问题解决。
面积也是我们经常要讨论的点,还是以axi master为例,性能还有一个指标就是outstanding能力,肯定是越大越好,但是这个buffer宽度比较大,一般使用sram实现,这将导致sram的面积过大,sram又比较贵,相应的成本也上去了。怎么解决呢?书里是这么教我们的,分时复用,但是这种情况是不适合的,因为channel互相独立。我们一般就是根据应用场景,例如前级IP的能力和需求使用参数控制outstanding深度。分时复用什么时候能用呢?一般就是计算单元的复用,以及内存的复用,这需要对软件应用场景和算法非常清晰。
最后一个那就是功耗。比如我们设计的IP是多个module结合的,分为寄存器控制模块,TXRX模块,异步fifo,pm管理模块,加上总线bridge。我们优化功耗微观上是优化静态和动态功耗,静态功耗就是优化cell,动态功耗就是降频。但是这只是细扣的时候考虑的,我们粗扣功耗时,一般就是power domain的优化。什么意思呢?
那就是哪些逻辑时需要一起使用的,必须同时上下电?比如bridge和TXRX,要是不准备发送,可以把bridge也关闭。哪些逻辑必须常开?pm模块,控制寄存器的某些寄存器。等等
所以,一定要记住,RTL实现时一定要有这些思维,不能只为了实现功能,这样如果后端做不下去,或者性能不达标,你就需要一直修修改改,改的过程还融入引入各种bug,让人非常头大。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !