很大量的所以前面的做法还不叫访真前面的做法都是叫口绕就是软件硬件一起跑为了让这个特别是针对测试场景我们希望做co-simulation就是软件硬件来联合访真做访真的时候它就灵活多了为什么因为做simulation的时候你不需要真实的硬件不需要真实的fjp在意设备你可以用个访真器把你的硬件逻辑放到访真器里面访真器本身是个软件所以软件的联合访真它的好处是完全全是软件硬件逻辑也是用软件访真器去模拟出来的然后我们这些各种各样的测试包括带着驱动的测试包括带着我们上层用户带软件的测试但是可以是真实的连着驱动的这些用户带真实的软件也可以是我专门测硬件的一些test case都可以这样的话我们希望比如说在一些云的场景下甚至一些公共云的场景下不可能有我们这种设备的或者说公共云上去租IPG设备也很贵或者即便有BWS和阿里都有云上的IPG但是他们IPG型号不一定是我们想用的那种型号那这个时候想在公共云上去测这些东西用公共云弹性的资源比如说撒出去一万个容器一万个任务去跑那这样的话一个纯软的cosimulation的一个场景就很适合了那具体是怎么做的呢就是说最右边这是我们的硬件逻辑DOT这是硬件的数据叫DesignUnderTest就是我的硬件逻辑我放到访证器上然后这边是我的各种各样的软件包括Testbench这也是给硬件的数据其实我们软件很多叫TestCase没关系就这边反正是我的软件测试的软件也好我真实的用户态软件驱动也好那软件和硬件你怎么直接连因为那边虽然不是真实的硬件但它也是真实的硬件逻辑我们自己写的硬件的RTL的代码那怎么让它连起来你中间肯定需要一个转换的东西比如说举个例子比如说我们用的是PCIE协议那你软件肯定不可能直接去跟PCIE协议去talkPCIE是个硬件协议软件你要去访问比如说驱动去访问硬件的时候都是直接去读写一个地址的对吧所以软件这边大量的都是一些message读写的一些message但硬件那边那它是专用的硬件协议对吧所以中间需要一个所谓翻译这个叫transactor待会我要解释这个transactor是什么好就说我们其实更希望的是软件的联合访真在一个完全纯软的环境下解决我们各种各样比如说测试的问题那这个时候呢我们找到了一个304的一个开源项这个项目叫leap system CTLMSoC这个开源项目这个开源项目它是怎么做的呢它也是用QMUQMU这边你去装软件把软件都装在QMU里边右边是一个硬件的访证器你有一大堆真实的硬件对吧好 装到这个访证器里边然后比如说这个软件硬件中间你是通过这种专用的协议去talk的比如说差不多的场景下大家主要用PCIE去talkARM的场景下软件硬件去用那些ARM的安保总线比如说AXI总线等等ARM的各种各样的总线去talk好 那这些总线对吧这些总线在一个纯软的环境下其实是没有的对吧 纯软的环境左边是我们纯软件右边是这个硬件访证器它也是个软件访证器也是个软件好 所以中间其实304做了一个工作它叫remote protocol这个缩写叫RP这个remote protocolRP它做了什么事情它来模拟了你中间的总线的传输它怎么模拟呢就是你不管什么总线不管是PCIE总线还是ARM的各种安保总线你所有的总线就是传递消息对不对你给个请求然后拿个响应或者有硬件的数据叫给个激励然后有feedback对吧 有反馈所以它其实中间传的是消息对不对这个remote protocol就是对所有的这个硬件我做了一声抽象不管你是PCIE还是什么我中间就是发消息请求消息 响应消息软件这边发出请求 收到响应硬件那边它也有一个RP把这些软件发过来的请求等等变成硬件能识别的总线协议总线协议的消息比如PCIE你按PCIE的格式它给你生成PCIE的那些真实的激励发给你的硬件逻辑去等硬件回复响应回复比如说PCIE的那些响应那是按照PCIE硬件的协议硬件的格式定的它这个RP再给你转成一个软件能认识的一个消息发回来所以它做了一些转换这个框架是Xilinx提供的这个也是个开源项目刚才讲了一下比如说总线上的一些处理就是既然是个纯软的环境硬件也跑在纺成器上然后我们的软件本来也是测试 证证 这都是多数软件纯软的环境下你没有真实的这些硬件也不需要真实的去跑这些硬件的协议了对吧这些PCIE这个Amba总线这些协议但是你硬件逻辑只接受对吧符合PCIE规范的那些请求你的硬件发出的也是符合PCIE规范的响应对吧好所以中间我们怎么来做这个转换呢这个是System C这是硬件的一套一套语言System C是拿C++来写这个硬件逻辑的一套语言主要它用在建模访证等等这些测试的场景所以它是软件它是C++System C只是C++上面有一个库对吧我们就用赛林斯也是用C++System C这个库来做了整个这些就是刚才我讲的这些硬件总线协议的模拟它有几个数语一个叫发起Initator一个叫TargetTarget就是你的目标的硬件讽讯器那边Initator就是你的软件中间各种各样的Interconnect可以是各种各样的各种总线它都支持常见的总线这部分总线上的东西其实赛林斯已经做好了像PCIe的总线还有AMBA的AXI总线还有戴Cache Coherence的一些ACE、CHI这种线赛林斯这个项目都做好了然后里边有一个细节这个也是就是这套GCU System C的这套它叫Transaction Lab Modeling就是最开始我这画的这个这个地方叫Transector它处理事物就是你的每个请求响应我们软件也叫一个事物对吧所以对硬件来讲你给机力然后给肥败这就是个事物Transector这个请求响应它怎么来进行抽象呢因为你的总线具体总线协议还是五华八本的PCIe什么AXI太多了这个System C的这套Transaction Lab Modeling事物级的建模它做了一层通用的抽象就是说我不管你什么总线但你总线上发的都是消息请求消息响应消息对吧好 这个消息我给你来一个System C来了一个统一的建模叫Generic Payload通用的这个负载大概长这个样子你是要读还是写往哪个地址写你要那数据给你个数据指針你数有多大等等它一套这个对于你的总线上传输的消息它来了一个抽象好有了这层抽象那我们写起来就比较比较轻松了对吧就说我们可以基于这套这套抽象的建模来做软硬件之间他们的交互你就不用关心具体PCIe协议是怎么做的了那些安巴总线底下协议的细节你就可以不用关心了你只关心你发的消息是什么比如说我举个例子我要让这个我的IPG来做一次DMA操作对吧我给他按个门铃对吧让这个硬件设备他来做DMA他从这个Main Merman去读数据那他比如说好那我按个门铃对吧我的Initiator去找Target对吧Dorbell按一下好那Target是硬件它硬件来发起DMA操作好发起一个请求这个请硬件那边也可以发请求软件也可以给硬件发请求对吧双向的好硬件这边发起DMA操作那它这个DMA请求长什么样子对吧它要往你的内存的哪个地址去读读还是写要DMA搬多少数据等等等等这些好所以呢这个Generic Payload是一个非常非常通用的抽象屏蔽了总线上的各种各样的细节好然后呢接下来这个我们做了一些什么工作呢就是前面讲的都是这个System C啊或者Zalix基于System C提供的一套框架就是它把总线已经帮你屏蔽了你不用再去操心这种底下的细节PCIe啊安把这些总线了但是总线还是太low-level了比如说对于我们硬件来说对吧刚才我们要基于PCIe或者各种的总线我们要跟这个这个CPU软件这边去打交道比如说举个例子DMA操作就是这个很常见的一个操作对吧特别对我们存储系统来说我在Mememory里面有一堆数据这些数据可能要加密之后对吧传输出去或者说IPG这边它收到了远端发过来的一大堆数据这些数据要把它写到Mememory去然后呢写之前先做解密先做解压缩等等一大堆操作所以这个DMA操作这就是一个很重要的操作而且DMA的这个如果硬件这边做不好那对于性能是极大的伤害那所以呢就说我们在硬件上这个有自己的这个DMA的引擎DMA的控制器但是呢在做这个联合访证的时候这个这个DMA控制器呢它就对我们联合访证的时候就不太方便为什么因为DMA控制器它是底下直接要跟PCIe去talk的对吧那既然我们已经把底下的PCIe给它抽向走了对吧就是我中间的这个这个刚才讲的remove point这是3.4提供的那个接口对吧就是你左边的这个QMU这个纯软件里面虚拟机里面跑的这些软件也好用户带软件也好驱动也好好 右面这个这个仿真器里面跑的硬件逻辑好等等底下其实没有PCIe了底下其实没有一个真实的PCIe了像我们用的这个PCIe是3.4 IP机上提供的一个硬核的一个实现那好在纯软件反正底下已经没有PCIe了所以呢我们在硬件上做的DMA控制器它也没法跑了因为你底下没有一个真实的PCIe你怎么跑你上面的PCIe的DMA控制器呢那这时候怎么办呢我们用这个sysmc来去做一个纯软的一个DMA控制器的一个对吧模拟实现对吧然后这个模拟实现其实很好写为什么因为底下已经没有PCIe了对吧然后它中间的所有的交互的接口已经变成刚才我说的那个事物级传三个栏目的一个毛动力了事物级的接口了对吧这个事物级的接口就长这个样子对吧你中间的消息就是这个样子这不是PCIe格式这是sysmc这个事物级建模它自己定一个通用格式这个格式是纯软件非常非常好写了好所以呢我们就说这个所有跟这个总线级协议密切相关的部分通通我们都把它干掉了对吧底下PCIe的那些抽象是被塞林斯的这个Libre-SysmcTOM这个开源项目它实现了那上面的这个DMA控制器好我们也用这套方式把DMA控制器真实的硬件DMA控制器也干掉了在这个联合访证的场景下好那这样的话这个但是呢我们的其他我们还有其他的这个硬件逻辑对吧我们这个硬件加速逻辑里面比如说那些加密压缩编接等等这些东西这些压缩加密编接这些东西是不依赖于你总线细节的对吧不依赖底线你用是PCIe还是用什么那些只是你的加密算法压缩算法而已好那些算法类的东西还是有纯硬件的逻辑然后跑在硬件的访证器上然后呢另外一点呢今天所有的硬件访证器呢它都支持CSMC这个语言这个语言本身是开源的也是个HPE的标准好这就是前面我讲了它是C++上的一个库所以这样的话我们把这个比如说所有跟总线硬件总线相关的东西都拿CSMCCSMC给它重新写了一遍给它模拟模拟实现了一遍然后呢当这个总线相关的东西真的要跟我们的这个硬件逻辑去打交道别刚才说那些算法类的东西加密压缩编辑码等等一大堆算法类的东西那中间的接口基本上我们常用的接口都是这个AXI协议这是Amba上的Amba的一个片内总线协议这个总线协议并不并不没有并没有那么复杂对吧CSMC它有它的机制可以跟你的硬件逻辑做一根一根线的连接硬件上都是要最终都是这个一根一根线对吧每个线上面传输零一零一零一一根一根的并行总线对吧好所以呢就说我们解决了最终解决了什么问题呢就说最终是什么样的情况就是我们的业务逻辑就是硬件加速的业务逻辑那些一大堆零零总统的算法它还是在用用硬件的逻辑去实现的然后跑在硬件的访证器上然后呢这些总线相关的东西通通都抽象掉了PCIe啊什么对吧这些复杂的总线都不需要了在这个联合访证的时候这些总线这些细节PCIe塞林斯提供了CSMC的实现PCIe之上依赖PCIe总线的DMA逻辑好我们用CSMC把它写了一遍写完之后好那这些总线相关的东西都用CSMC来做了这个访证的模拟那怎么给你的硬件那些算法那些硬件加速的逻辑连那些该怎么连怎么连对吧你还可以透传出这个一个一个人的这个这个并形总线来去来连到你的硬件逻辑上好这是右边左边这边软件这边就很简单了还是跑在你的QMU里面你QMU里面跑你的测试TESPENCE硬件的测试TESPENCE还是你软件的一堆东西对吧驱动也好用无态的软件也好这个就是其实刚才我讲的就是我们DMA控制器PCEDMA控制器的逻辑它底下这些PCE的硬核好等等这些东西通通都被干掉了所以这些DMA控制器的逻辑和PCE硬核的逻辑通通都被干掉了都被CSMC给访证掉了但是真实的IPGA里面算法那些东西还是在的然后那边你的算法逻辑是通过这个片内总线去来连接的所以这边PCECSMC的模拟实现还是会用XI协议去跟你的真实的硬件去连但是XI协议的复杂都已经比PCE低多了这边PCE其实都在co-simulation场景是没有了已经被CSMC的TLM把它完全的替代掉了好最终这个co-simulation长什么样子大概就是这个样子还有一些我们正在做的部分怎么理解呢就是说左边好 虚拟机右边硬件的这个访证器对吧好 那左边虚拟机里面该有Linux 该有驱动该有用户代程序这些都有然后呢这个右边我们真实的真实的这个硬件逻辑跑到访证器里面然后呢这个底线比如说这个总线的传输先说这个PCE的这边的传输那好虽然没有真实的PCE了但是那些PCE相应的那些逻辑还是有的但那些逻辑在哪儿呢被CSMC一套软件给干了对吧你PCE里边那些PCE那些transaction-level的ProtocTLP对吧PCE的那些它自己的事务级消息等等那些还是有的只不过是一个软件实现的PCE对列里边去保存着了好PCE这块我们现在搞定了那我们还在做一个呢是这个网络相关的对吧一个网络设备相关这怎么理解呢就说有了这个网络的支持呢左边这个虚拟机我们可以跑在一个刀壳里面右边硬件的访证器我们可以跑在另外一个刀壳里面而且这两个刀壳可以它不同的机器上它只要建立网络连接它就可以连起来了这样的话它就更加的灵活了为什么呢是因为QMU本身也挺重的然后这个硬件访证器本身也挺重的都是这个很消耗资源的东西如果这两个东西能拆开那我们调度就会变得更灵活了现在我们做法是整个这一大坨东西全部得放在同一个刀壳里面那这个刀壳会非常非常大但是如果能拆开那这样的灵活度就会大大的提升这就是我们就是软件硬件怎么用这个容器化的方式然后来做cosme的事然后我们现在把它全打到一个大的刀壳里面那而且它是纯软的所以很方便被这个copernize去调度而且这个完全不涉及任何硬件的好我大概就介绍这么多这个就是我们下面是我们公众号上面是我们的这个我们的一个工作人员同事大家感兴趣的话可以去找个码看看大家有没有什么问题我一个接收天线或者说一个一个其他领域的一个一个地方也可以使用这种软件协同的我们的做法是目前是只针对塞林斯的IPG因为这个硬件访证技术完全不一样然后底下的那些因为我们底下用到了塞林斯的一些对PCIE的那个访证实现那可能比如说intel的Autera可能它对PCIE的访证实现就不太一样了所以这个没办法这个一旦设计到硬件东西厂商绑定这个是逃不掉的所以比如说可能你做别的硬件那需要别的访证器需要别的一些底层的一些协议等等另外一个问题就是做这个事情的那个初衷是什么为什么要去拿KBS去把这些测试环境绑定起来是因为你需要模拟一个非常大的系统吗还是说是这样我们有特别特别多的测试人物特别特别多如果如果不用KBS这个方式那我们怎么办呢只好基本上都是比如有线的几台机器上面我们自己来管理这些任务那这个效率就很低所以我们后来想的就是做成完全纯软的方针就完全不要硬件设备最开始我讲的是说我们服务器还插着这个IPG卡好 上面用KBS来管理这些IPG资源然后我们的测试或者软件直接跟真实的硬件去talk这个成本也很高然后再一个管理复杂度也很高因为有真实的硬件所以后来我们做的就是就是不要真实硬件了我所有硬件逻辑全拿纺织器替代掉然后呢我们的测试的这些任务也基本上都是软件包括TES班车也好包括真实的用户台软件和驱动也好好 这些真实的软件或者测试的软件和我的硬件逻辑硬件逻辑用纺织器去模拟它所以纺织器也是纯软的了所以这样的时候变成完全软件的环境了完全软件的环境用talker把它封装起来然后KBS去调度管理这就很方便了所以其实是因为我们有太多的测试任务如果不用KBS去这么灵活地去调度测试的权量的跑一遍可能如果不用KBS大概要跑好几天但是用KBS我们就是比如说正在跟一些公共有赢去谈就是说现在还是我们自己的一些私有的一些服务器上去跑未来我们希望就是我们跑这个任务的时候到公共有赢上哇 开一千个虚拟机公共逛随便跑跑完的话再收回来这样的话我们就不会说受限于测试跑不完所以好多提交代码提交各种东西都很痛苦当然因为有硬件特别是IPC东西我们最后代码真正去合并的时候还得在硬件上去跑一遍看它的时序怎么样这些cosimulation只是跑功能但是大部分情况下就是你有一个底下已经时序收炼了之后你增量的去修改一般时序不会出太大问题往往都是功能上面的bug最多所以我们后来发现跑cosimulationcosimulation其实就是怎么讲的因为任务太多了所以的话用KBS并行的这么去跑分不出跑这样效率会提升很多代码量其实这套这套现在代码我们自己代码量并不大因为我们大量依赖了塞林斯提供了很多他做的开源东西还有别人别人开源的那些东西所以其实但只是整合工作还不少就是亥克的工作很多需要调这个调那个但其实代码量并不大最后我们很多时候跑起来好多都是一些SHOW的脚本把这个拼起来那个拼起来的这套cosimulation我们正在做做完我们也会开源出来我们计划和网络发了以后的话你原来基于PCIE走的这些协议的话实际上变成了软件的一个远程调用对的或者是通信协议是那这种网络上是延迟相比PCIE来说的话肯定要大很多对那么你们有没有这个对你们的测试TestBench有没有什么影响有些case是不是就没办法验证或者再来干扰了这个问题问得很好是这样回到这个场景行对 这个场景因为这个场景的时候我们很多跑的时候这边跑的是驱动和用户台的软件就是纯软件的纯软件这边就没有实序的概念了您刚才讲的那个例子是说我要跑TestBench怎么办对吧就是前面的这个例子我说TestBench对吧所以TestBench我专门加了一条叫Untime的就是我这边其实已经把它其实是纯软件了我根本不看你实序了我给你个请求你什么时候想一回来什么时候算就是我们做这个硬件这块测试的时候肯定会有一些TestBench是一定会跟实序相关的那是肯定有的那些任务那些TestBench我们尽量少写或者说那个一般在硬件的属于叫Block Level Test对吧Block Test对应到软件有点像单元测试那个概念所以Block Level Test我们基本上是设计人员自己写你设计人员写一个硬件的Model你自己把周围的Block Level Test的写完Block Level Test跟硬件打交道的时候就严格遵守硬件的时序严格遵守各种比如说细节的时序然后呢我们大量的测试的工程师其实是软件人员因为软件我这边去组织一些请求响应都很方便的所以 但软件人员他又不懂硬件那些细节的那些时序特别是让PCIE这么复杂的总写那时序还是很复杂的所以就是说我们这个硬件相关需要理解硬件时序那些测试不多那些不多大概几个小时就跑完了但是我们有一堆因为上面我们的软件还是分布式的这种因为管理分布式存储是很多分布式的软件分布式系统这上面的东西很复杂所以然后呢软件本身测我们也是KMAS这样去来调度了一堆刀块来测 测纯软件本身然后软件一件联合测的时候就很头疼所以后来我们搞了这一套东西把硬件变成纯软了全用防尘器然后中间的协议也都用刚才那个System-C的TOM给它干掉了这样的话纯软来跑就方便很多了最开始你在引入说从那个一开始一整套那刀刻整套那个环境包括KMAS调度等等后来你们说你们是引入KMAS也就是在作为这个硬件防尘模拟之前是引入KMAS还说是在需要硬件防尘包括Cosmetic所以说才有KMAS这个概念它是这样它是这样我们引入KMAS有几个原因首先这样其实如果我们如果我们自己没有驱动我们可以用Sylinx这套东西它的RoundTime等等这套东西结果如果我们自己没有驱动的话可以用它这套东西但它这东西也很重然后后来我们自己有驱动了有驱动驱动没法装到刀刻里面对吧好 那没办法我们就只好只好引入了KMAS就是因为我需要驱动需要搞驱动那我弄个虚拟机里边装操系统好吧 这样就能装驱动了然后呢用了KMAS用了虚拟机那好 你外边真实的设备你得能硬设进去得能硬设进去当然KMAS外边套了一层刀刻也能硬设进去只是刀刻需要很高的权限所以用KMAS主要是因为我们有自己的驱动如果没有自己的驱动那就可以不需要KMAS不稍微简单一点那这个驱动跟上面那个Science那个驱动是两个是吗两回事因为我们有自己的一些硬件逻辑所以必须得有自己的一些驱动才行然后这个驱动的话如果说直接装在物理层面的物理机上面的当然可以但是呢装在物理机上就没法KMAS去管理这些任务了对吧所以我们得把它容器化明白你这个驱动的版本是需要一直变 是吧需要跟着你的任务来变是的我们就是我们的软件一直在变我们的驱动也一直在变所以这每次变都得说白了就每次提交代码的时候你都得测一遍其实这些东西都是为了我们提交代码的时候去测一遍的去大量的是测试任务其实明白就刚才大家问的两个问题关于这个实际也就是说这个硬件相关的这个测试或者说在物理机里边这种分布式测试分布式这种存储对于这种性能或者说一些这种延迟这个要求还非常高 是吧是的不同的响应可能会导致在功能测试那些差异对 当然你刚才讲说你们对于这种实际的这种相关的要求没那么多这我不是特别理解的就是这样就是说我们这儿做的这些测试都是功能性测试就是用功能性测试性能测试没办法拿这个东西跑的性能测试必须得查着真实的硬件在上面有真实的测试但是性能测试的时候我们不会说你每次提交代码都要跑所有的性能测试不会跑这些明白对所以性能测试那是另外一个故事跟这个是没关系的这只是说我们有一堆一堆的功能测试的一些任务Test Case功能测试得太多了所以跑不完其实性能测试首先不一定是天天做再一个性能测试其实跑起来很快因为性能测试你基本上是跑最好的状态最快的一个状态对吧好 明白谢谢那还没有别的问题那我们没有问题的话那就多谢大家好谢谢