.. Kenneth Lee 版权所有 2021
:Authors: Kenneth Lee :Version: 1.0 :Date: 2021-05-29 :Abstract: 本文本来是一个内部分析的一部分,但这个里面部分的例子具有典型性,而且 也没有保密要求,我整理到本文中。
:dtag:架构设计案例
几个架构定义问题的实例
架构设计能有用有一个基本前提,否则就会沦为做样子。这个前提是:在高层的概括中正 确表述目的和意图。
我用一些公开的资料来举例子。
在龙芯的芯片架构手册中,对Memory Barrier指令,DBAR,的定义是这样的:::
DBAR指令用于完成load/store访存操作之间的栅障功能。
这种写法是一种模糊的表述,你说它不对吗?其实它也不是。但如果你真的在设计芯片或 者基于这个写一个CPU间同步的代码,你就会发现你根本不知道怎么写,因为这个表述是不 精确的。
如果我们按我们的理解实现一个DBAR指令,把它的RTL代码放出来,它是精确的,因为基本 上每种指令序列灌入这个RTL,它们都有呈现一些确切的规律。
但如果你要写出一个抽象的,用不同的RTL实现出来,最后都呈现一样的规律的“要求”,对 很多人来说就很困难了。因为这是需要相当能力的一种创造:你既不能用细节语言(比如 RTL)直接说具体的行为规则,也不能用模糊语言(比如前面的“栅障”这种提法),你必须 仅仅抓住一些精确的特征,放弃掉其他特征,建出一个符合条件的要求集合出来(Rules) 。我原以为这是很容易做到的事情,但经过这么多年的推行,我发现这确实是一种有相当 要求的能力,而这种能力,很多中国工程师都不具备。即使有大量外国的已经存在的材料 摆在我们面前作为参考。
比如,同是Memory Barrier指令,RISCV的定义是这样的:::
The FENCE instruction is used to order device I/O and memory accesses
as viewed by other RISC-V harts and external devices or coprocessors.
Any combination of device input (I), device output (O), memory reads
(R), and memory writes (W) may be ordered with respect to any
combination of the same.
这不是一段RTL或者代码,也不是“栅障”这样的模糊表述,它选择了“栅障”这个模糊表述中 我们关心的核心特征——其他的Hart(CPU核)观察到的,在IORW上呈现的顺序——对Hart的设 计者提出了它要求的Rule:我不管你RTL怎么写,我要求在其他Hart上看到的IORW的顺序是 吧啦吧啦这样的。我既不关心你的指令序列,也不关心你的内存访问,也不关心你有几级 的Cache。我就要求一个特征:其他Hart观察到的顺序必须如此呈现。
这是像外科手术那样的一种精准:你做外科手术,如果你拿把菜刀,眼睛不好还不戴眼睛, 那么你根本就无法区分骨头和血管,那无论你掌握了多少理论,你都没有办法完成这个手 术。你只能像屠夫那样,一刀下去,要不横着切,要不竖着切,这都可以。但你要求像外 科手术师那样,把骨粘膜和血管分离,那你永远都做不到,无论是你的眼神还是你的刀子 ,都不具备做这件事的条件。
需要补充的是,精准不是把集合的范围缩小,而是把目标都包含在范围内。我还可以举一 个龙芯的例子来说明这个道理。龙芯中对特权级的定义是这样的:::
处理器核当前处于哪个特权等级由CSR.CRMD中的PLV域值唯一决定
这是一个画蛇添足的定义。处理器核处于什么特权级,是一个状态机,它被这个核的所有 部件的行为共同决定,你可以通过某个寄存器去呈现它,但为什么这个状态需要被一个寄 存器唯一决定?一个复杂的处理器,难道所有部件都要去访问一下这个寄存器才能决定自 己当前处于什么状态吗?这明显是缺乏架构定义的人想出来的。这个地方用力过猛切到另 一个集合里面去了。
架构设计是需要非常细致的逻辑切割能力的,不是说你有宏伟的蓝图,有不着边际的“大局 观”,就自然可以做的。大局观本身也是细节,只是是所有细节中被敏感捕获的那几个细节 特征。怎么选对这些特征才是架构的能力。这种能力无法靠学习一个样子来获得的。