VVViy / VVViy.github.io

This is Max's blog, something interesting in it.
MIT License
13 stars 4 forks source link

博客复更 - Max's Blog #10

Open VVViy opened 4 years ago

VVViy commented 4 years ago

https://vvviy.github.io/2020/04/06/recover/

Keep self busy.

Scriabing commented 4 years ago

讨论下,请问香农展开的设计在NVDLA哪里有体现啊?我个人理解香农展开优化组合逻辑,减少器件使用,NVDLA也是这个目的吗?还是说 香农展开的思想在模块设计上有别的好处吗?

VVViy commented 4 years ago

@Scriabing 讨论下,请问香农展开的设计在NVDLA哪里有体现啊?我个人理解香农展开优化组合逻辑,减少器件使用,NVDLA也是这个目的吗?还是说 香农展开的思想在模块设计上有别的好处吗?

香农分解是一种针对多信号到达时间不一致的优化方法,假设一条逻辑F(a,b,c)由三个信号构成,c到达时间晚于a,b,那么如果不针对c做特殊优化,逻辑F的整体延迟会因信号c增加,香农分解说白了就是用晚到达信号的全部可能状态与a,b信号构成多条逻辑路径,相当于提前计算了,这样最终F的逻辑输出直接由晚到信号做MUX就行了,为晚到信号安排了最快路径。显然,香农分解会增加逻辑开销和面积,但是速度快,至于在NVDLA哪里,那得自己去找,如果了解什么是skid buffer和香农分解,读源码时自然会遇到,而且经常遇到。 当然,香农分解的意义不止于此,有很多好处,比如优化有反馈逻辑的loop时,香农有奇效。

Scriabing commented 4 years ago

您说的概念我理解了,但是有个疑问。组合电路时延是所有与或单元综合,如果面积增大了,总时延不是也增加了吗?为什么会更快呢?还是说 针对c的优化,使得不可控的c时延变得可控,并不能减少时延?

VVViy commented 4 years ago

@Scriabing 您说的概念我理解了,但是有个疑问。组合电路时延是所有与或单元综合,如果面积增大了,总时延不是也增加了吗?为什么会更快呢?还是说 针对c的优化,使得不可控的c时延变得可控,并不能减少时延?

是这样的,一般来说,一块逻辑的延迟是由关键路径上的门延迟决定的,但这是假定相关输入同时到达的情况,如果输入信号不是同时到达,还要加上等待时间,比如之前的例子F(a,b,c), 假设a,b是单cycle的,c是两个cycle到达,如果不优化,F的延迟就是2个cycle+关键路径Fx延迟,用香农分解优化之后,a,b到达后可以直接进逻辑,不用再多等1个时钟c到达再进逻辑,而等c到达时不必与a,b做逻辑,直接MUX一下F就可以输出了,理论上,F的延迟就是2个cycle。 说白了,基本原则就是把晚到的信号放到逻辑少的快速路径上,放到靠近整个逻辑最终输出的地方。我记得synopsys好像有个针对综合的代码优化的文档专门讲过晚到信号的相关处理方法,可以进一步参考。

Scriabing commented 4 years ago

@Scriabing 您说的概念我理解了,但是有个疑问。组合电路时延是所有与或单元综合,如果面积增大了,总时延不是也增加了吗?为什么会更快呢?还是说 针对c的优化,使得不可控的c时延变得可控,并不能减少时延?

是这样的,一般来说,一块逻辑的延迟是由关键路径上的门延迟决定的,但这是假定相关输入同时到达的情况,如果输入信号不是同时到达,还要加上等待时间,比如之前的例子F(a,b,c), 假设a,b是单cycle的,c是两个cycle到达,如果不优化,F的延迟就是2个cycle+关键路径Fx延迟,用香农分解优化之后,a,b到达后可以直接进逻辑,不用再多等1个时钟c到达再进逻辑,而等c到达时不必与a,b做逻辑,直接MUX一下F就可以输出了,理论上,F的延迟就是2个cycle。 说白了,基本原则就是把晚到的信号放到逻辑少的快速路径上,放到靠近整个逻辑最终输出的地方。我记得synopsys好像有个针对综合的代码优化的文档专门讲过晚到信号的相关处理方法,可以进一步参考。

讲的很细致,感谢解答;持续关注您的博客

VVViy commented 4 years ago

@Scriabing

@Scriabing 您说的概念我理解了,但是有个疑问。组合电路时延是所有与或单元综合,如果面积增大了,总时延不是也增加了吗?为什么会更快呢?还是说 针对c的优化,使得不可控的c时延变得可控,并不能减少时延?

是这样的,一般来说,一块逻辑的延迟是由关键路径上的门延迟决定的,但这是假定相关输入同时到达的情况,如果输入信号不是同时到达,还要加上等待时间,比如之前的例子F(a,b,c), 假设a,b是单cycle的,c是两个cycle到达,如果不优化,F的延迟就是2个cycle+关键路径Fx延迟,用香农分解优化之后,a,b到达后可以直接进逻辑,不用再多等1个时钟c到达再进逻辑,而等c到达时不必与a,b做逻辑,直接MUX一下F就可以输出了,理论上,F的延迟就是2个cycle。 说白了,基本原则就是把晚到的信号放到逻辑少的快速路径上,放到靠近整个逻辑最终输出的地方。我记得synopsys好像有个针对综合的代码优化的文档专门讲过晚到信号的相关处理方法,可以进一步参考。

讲的很细致,感谢解答;持续关注您的博客

这种小的设计技巧有不少,之前想总结一篇了,事情太多太忙了,后续有好的内容再分享了。