阅读芯片源码(RTL)

====part one====

主要的原则。

一个rtl可以是这样的:

da2717f322a045d2aedf286b36fd013c.png

经常大家习惯于算法和数据结构。对于设计的部分,落实不一定多。

另外一个rtl也可以是这样的:

887c2239420c4e51ad35d6b2eeda58e5.png

所以从不同的层面来讲,一个Rtl有不同的表述。

首先大概把所有的部分浏览一遍,看看有些什么。必须没有遗漏。细看要深入,全看要不遗漏。

其次,找到重点的部分。

重点分两种,一种是熟悉的,一种是重要的。

如果重要的不懂,那就先看熟悉的。

再次,找到其中的逻辑。这是因为单点的记忆是不能得到很好的收获的。

重要的,对rtl来讲,存储,状态机,interface都是重点。interface中,要注意信号之间的紧密关系,比如握手。或者信号的处理要求:要求在何种状态响应,要响应什么。

对于,握手而言,存在可中断和不能中断的握手。即一个脉冲过去,那么这是可中断的,因为可能马上第二个脉冲就过来了。还有是一个信号过去,那么除非等到对方的握手,那么这个信号是不会消失的,后者是不能中断的握手。

逻辑行中,如果向下面说的,如果多个if 分支,或者非常多的if层次,那更有可能是重要的。反之,多个分开的if,则更不一定是重要的。

熟悉的,有时不是真熟悉,而只是熟悉其中一个字眼,基于这个字眼,能够联想,就是扫雷。

在逻辑寻找中,应该注意分支。比如一个if block中,平行的几个分支是按什么来切分的。逻辑中,还应该注意层次,还是if,如果if中还有if,那么两个if的逻辑层次是依据什么来的呢?

要知道模块关系。

interface的确很重要。双边关系。指的两个模块之间的关系。可以先明确起来。去掉一看就没有明确意义的。去掉普通意义,大的意义的。合并同类项。找出动词,状态词。

宁深入,不求全。一个interface串一串,串到底。就像开辟根据地,至少在每一个模块(地方)都能扎下根来。即使是个小树苗,也比走马观花好。

比如,

两个模块hndler和dp之间的interface。

选最亮的那些名字拿出来,就是,没有看过代码的人都觉得很厉害的拿出来。

然后再把这些信号归并同类项。--的是一类,**的是一类。 (这里首先分了数据和控制状态类两类)。

在每一类中,挑一个去熟悉,那么,就可以对脉络,甚至精要熟悉了。

f1585f3de4e94c1fbdd5a07ef3f58a20.png

interface: 如果归类之后,发现还是挺多的。那么结合一些基本背景,获知核心的一类。

在一类信号中,发现每个信号的不同点。

以及将信号,与特定的fifo, interface等联系在一起。

skill: look around。如果一个点位看得稀里糊涂,那么,就看看其他的。比如看时序,看得糊涂,那么就看一下逻辑。算法是灵魂,状态机设计,关键信号设计,counter设计是一些骨架。

在状态机设计中,有一些紧状态和松状态,前者依赖一些counter,后者则是依赖一些外部信号,往往时间不确定。紧是自身的时间要求,而松是外部的时间,两者是应该配合起来的。

阅读的最终目的,是得到可记忆,可以传达,值得传达的东西。比如一个算法,一个方法。而非得到事情本身。

得到算法,也是一种映射,将各种信号,数据之间的关系,映射到一些处理上去。

====part two====

怎么学习一个之前未学习过的领域。

这实际是一个升级的过程。

那么,其实很多面向市场,产品,项目的,人,都是有非常强的学习能力的。所以,要论实操,不一定,比得过技术人。但是见识和沟通因而不可忽视。

升级的学习。其实应该是利用现有的知识,扩展到新的领域。比如说RTL,从控制类的代码,到信号处理类的代码,到协议类的代码。这些代码的跨度也许很大。但是,看完之后,就知,比起其他代码,这些差异就不那么大了。

不大,在于,最后都会落实到状态机,FIFO, RAM,关键信号的设计上。而区别在于核心的逻辑。有些是控制器,有些事DSP,有些是协议加速器。因此,如这个图:

9d55eea89cb24cadaebc8a5b28b21905.png

如此,上半部分就是灵魂了。下半部分是壳体。大部分的设计,在下半部分是有共通之处的。而要学习的也就是上半部分的逻辑。

更进一步,在IP设计内部,还会有类似FIFO,RAM这样的模块,它是相对独立的功能,经常还被多个模块复用。复用,一般可以减少面积占用。对这些部分的研读也是有意义的。

====part three====

面向verilog

经常碰到的问题是,信号tracing一下又回去了。让人看不清。

好在,现在大部分的代码遵循一个规则,<= 和=之分。所以可以尝试在两次<=之间作为一个小段落,停一下。

脉冲信号解析。

举例:intCancelCurrentTxopN

状态跳转blk中,在case blk之前,赋值为无效值(1’b1)。且在状态跳转时,方转为0。因此是脉冲信号。

====part four====

对模块的解读。

根据功能,细分,将它们对应到blocks/sub instances。比如下面的每个s都可以理解为计算len的一个步骤。每个步骤可以分到一个block/sub instances.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

relis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值