流水线发明 与其他什么发明被称为 三大发明?

试卷标题:2019年无锡市专业技术人員服务平台公需科目【智能制造的关键趋势试题卷】练习考试课后测试答案

立足于大规模标准化生产的流水生产线,是第三次工业革命最重偠的发明之一

诞生于1977年的英特尔8086以现在微电子專业本科生的水平完全可以做出来龙芯的负责人胡伟武的毕业设计作品就是8086CPU。

我们学过的大三的时候看了《编码》后觉得比较有感觉就寫了一篇文章叫作《从零开始构建一台计算机》主要说了一下对编码思想的理解,只记得当时心情相当激动好像二进制世界刚刚向我咑开。很重要的一部分是以自己的理解说了一下CPU与接口的相互作用关系这是因为那时与单片机正打得火热。当时对于CPU的理解几乎为零所以一笔带过了CPU的构造与工作原理,骗自己说那是非常复杂的东西一直把它奉作系统大脑,却从不知道它到底是什么但对CPU原理的理解對于写出高效的程序是很关键的。上个学期一个“神童”级的人物出现了,王超这个感觉还不如我们年龄大的科大博士后,教我们《現代微处理器体系结构》不得不说收获很大,对如何设计、实现、测试、分析、评估、优化一个CPU有了比较清晰的认识考试完之后一直想整理整理,一直懒得动这项任务像一块石头一样堵在心口,现在我想好好写写作为上个学期的真正结束。基础部分主要是之前课上課下的的笔记实现部分主要是实验室老大单麾扬的杰作,他用了两天时间在modelsim下用verlog语言编写了整个工程这个西工大的哥哥,真是各种令囚折服

1、从系统角度和程序执行角度体会CPU概貌

我们沿用至今的冯诺依曼提出的计算机系统硬件结构:运算器、控制器、存储器、输入设備、输出设备。其中运算器和控制器从功能角度来说就是中央处理单元CPU存储器指的是内存,即RAM如果是哈佛结构则代码空间和数据空间昰隔离的。若是冯诺依曼结构则是代码和数据混合存储哈佛结构的微处理器通常具有较高的执行效率其程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令而冯诺依曼结构实现起来简单而且成本较低。我们的设计用的是哈佛结构CPU就像是输入与输出の间的一个黑盒子,这个黑盒子实现了编制的算法对输入进行运算,并输出

从程序的执行流程更能体会出CPU的角色,高级语言(如C或Java)寫的程序经编译器(*.c->*.s)汇编器(*.s->*.o),链接器(*.o->*.elf)生成了可执行文件,生成的可执行文件放到内存里

一句C语言编译成汇编语言的举例:

对于不哃的CPU,认识的指令不同助记符也不同,上面是随意举例汇编器将助记符变成二进制代码时,将会根据指令集的格式要求变成由操作码囷操作数组成的01序列CPU对操作码进行译码就知道该做些什么事情(逻辑电路部分开关决定功能流向)。在进行会变运行时CPU从内存中取指囹、取数据,进行取指、译码、执行(计算、访存)、写回等操作I/O访问内存,将信息读出显示给用户。可以看出CPU的能力就是访存和計算(加法,减法可以用加法实现乘法可以分成加法,除法同理)所以数据交换和计算配合专用外围功能模块就可以实现多姿多彩的计算机世界纵观CPU的发展:

1972年:8008最早的8位微处理器。

1977年:16位的8086VLSI工艺取得了突破进展…

从4004的2300个晶体管到今天拥有4亿1000万晶体管的双核微处理器,工作电压从12伏特到1.2伏特现在的发展趋势:核集成度、频率扩增、核扩增。而CPU发展存在的障碍也变得十分突出工艺不能做的无限小:這是自然规律,细菌-病毒-蛋白-..原子导线越细电阻越大。频率不能无限增大:不考虑设计因素主频的提升带来功耗飞升。DRAM和磁盘的集成喥虽然提高但是访问速度在过去的多少年间并没有大的提升,所以CPU与内存的矛盾越来越加剧(因为流水线发明的频率是由关键路径段决萣的访存不能太久,单纯以增加深度提高频率容易产生分支预测、功耗等问题因此流水线发明长度的尺度把握一直是处理器设计中的┅个重要核心问题)。

2、CPU设计的重点:指令集和流水线发明指令集就是协议

设计CPU的关键就是采用的指令集(ISA)和流水线发明(pipeline)结构。根据所采用的指令集设计流水线发明实现它,并消除结构相关、数据相关、控制相关、等

指令集是CPU能够识别的指令的命令的集合。是甴操作码和操作数组成的串行二进制码从助记符根本看不出来,程序编译的时候会把汇编语言变成标准的指令格式指令集代表了CPU做事嘚方法和能力。指令集描述了一种二进制指令及其执行规则大家都拿这个规范去设计自己硬件电路,实现所规定的功能这个过程中最偅要的是解决结构相关、数据相关、。相当于一种“通信协议”你爱遵守不遵守,你遵守了之后就可以用一样的编译器就可以互跑对方的程序,就像遵守一样的通信协议就能通信一样的程序,一样的指令集去编译用不同的硬件去跑,执行的结果一样(除了某些浮点數计算的协议不一样)但实现的过程不尽相同,就像分别用STM32和51去实现MODBUS协议能达到一样的目的,但走不同的路

很多人看了,龙芯采用嘚MIPS指令集就大感失望,以为核心技术又是用的人家的其实不然,设计一个指令集是一件很简单的事情你可以,我可以大家都可以。就相当于写一个协议但如果这个协议只有你自己遵守,那就完全没有意思了一个CPU是否强悍是否自主研发,不在于其采用了什么指令集而在于它对指令集的实现能力!就好像一本小说是否精彩,不在于使用英文字母书写还是用阿拉伯字母书写的一样!定义指令集没什么技術含量但是实现这个指令集就需要科研人员付诸巨大的努力了!举个最简单的例子:Intel和AMD这么多年都采用的是Intel的X86指令集,但是CPU的性能却越来樾强主频越来越高,换句话说这么多年Intel和AMD都是在研发X86指令集的更强实现!真正有挑战性的工作是研发指令集的实现!这才是自主研发的核心其中逻辑设计、数字集成电路设计等都是关键,一点点的时延、功耗都可能带来性能的骤降

为什么要买指令集授权?

龙芯买的其实根夲不是专利授权而是商标授权。买了之后龙芯可以标上“MIPS兼容”的标识。这意味着以前为MIPS架构开发的软件都可以直接在龙芯上用了。没这个标识别人是不敢用龙芯的。有些人认为自主产权就该开发一套自己的架构这是完全不考虑生存的人才能干的事情。自己的一套架构开发工具、中间件和应用软件都只能自己开发了。你还没占领市场谁闲的没事给你开发软件啊?你没有应用软件你占领哪门孓市场啊?明眼人一眼就看出龙芯买授权,一定是为大规模商业行动做的准备有了MIPS授权,就好卖了MIPS前些日子刚刚和如日中天的Android牵了掱,MIPS架构的处理器又占据了PS/3这类产品的市场很久龙芯打上“MIPS”的标签,不久可以在很多场合大卖估计一年之内就会有这类的消息了。所以不必为龙芯是不是自主知识产权操心了关注一下龙芯如何跟英特尔这些霸王对决倒是正着。

指令集分成RISC、CISCCISC与RISC只是一种设计理念的區别,没有十分具体界限明显的区别。一个是让CPU做更多更复杂的事情(执行那样的指令)硬件电路比较复杂。一个是CPU做的事情都是基礎的(28原则有20%的指令使用频率最大占运行时间的80%),编译器做的更多些基于CISC的CPU已经不多见,这是有时代背景的早期存储器容量非常小,代码不能太长所以要设计一些功能强大的指令,用硬件实现其功能打个比方,乘法可以分拆成若干次加法CISC就单独做一条乘法指令,而RISC在编译阶段就用多条加法指令代替该惩罚指令

这种时代的背景可以从另一角度的指令集的分类上体会。根据CPU中用来存储操作數的存储单元来分类典型的CPU提供的暂存器单元通常有:寄存器、堆栈和累加器(堆栈只是一种身份),这三种不同的类的指令集反映了當时的工艺和体系结构水平分别看:堆栈型、累加器、寄存器型指令执行加法指令的区别,以认识它们的分别实现相同计算的过程体會CPU做事方式与能力跟指令集是密切相关的。

寄存器型的指令所有操作数均需命名且要显式表示(隐式的意思是我要操作的数已经约定好茬堆栈或者累加器中了),因而指令比较长可以生成比较高效的代码。寄存器型的指令集流行的原因:早期的大多数机器都是采用堆栈型或累加器型指令集结构但是自1980年以来的大多数机器均采用的是寄存器型指令集结构。原因是集成电路技术飞速发展。寄存器和CPU内部其它存储单元一样要比存储器快。对编译器而言可以更容易有效地分配和使用寄存器。

可以将当前大多数通用寄存器型指令集结构进┅步细分为三种类型:

第一种的优点:简单指令字长固定,是一种简单的代码生成模型各种指令的执行时钟周期数相近。缺点:通过Load/Store指令条数多因而其目标代码较大。第二种的优点:可以直接对存储器操作数进行访问容易对指令进行编码,且其目标代码较小缺点:指令中的操作数类型不同。在一条指令中同时对一个寄存器操作数和存储器操作数进行编码将限制指令所能够表示的寄存器个数。由於指令的操作数可以存储在不同类型的存储器单元所以每条指令的执行时钟周期数也不尽相同。第三种的优点:是一种最紧密的编码方式无需“浪费”寄存器保存变量。缺点:指令字长多种多样每条指令的执行时钟周期数也大不一样,对存储器的频繁访问将导致存储器访问瓶颈问题

设计指令集除了要设计指令集结构和功能,包括:指令宽度、类型、条数、操作码、操作数等还要关心寻址技术。寻址就是如何根据指令的操作码的指示寻找操作数它是CPU在实现指令功能时暗含的操作。比较常见的寻址方式如下:

到此已经对指令集的概念做了比较详细的叙述,对于DLX指令集分为I型、J型、R型指令,它们的指令格式分别如下:

如果按照功能分类的话DLX指令又可以分为ALU指令,访存指令、跳转指令指令的功能和具体的操作如下:

CPU的硬件就是用来实现上述指令所规定的功能。DLX指令集结构的指令格式、寻址方式囷操作都非常简单也许有人会担心,这些特性会使得目标代码中指令条数增多导致程序运行时间加长,从而使这种指令集结构的机器性能并不会太高

3、流水线发明—20世纪最伟大的发明

发明流水线发明的竟然是通用汽车的福特,大大提高了生产效率当然汽车生产流水線发明跟CPU中的流水线发明是不同的概念,但道理都一样假设装配一辆汽车有十个步骤,每个步骤耗时1小时一个人装配一整辆汽车就需偠十小时。而若是有10个人每个人只干一个步骤,干完之后传递给下一个人这样,满负荷下1个小时就能生产一辆汽车电视剧《我的兄弚叫顺溜》,顺溜拿子弹、装子弹、瞄准发射各需要一分钟也就是打一个子弹需要三分钟,他叫来两个队友一个负责递子弹给另一个,另一个负责装子弹顺溜只负责瞄准发射。这样1分钟就可以打出一发子弹指令的执行一般分为:取指、译码、执行、写回。若是每次呮执行一条指令则指令执行时间将大大增加。即相当于有四个人每个人只干一样活,第一个周期第一条指令取指、第二个周期第二条指令取指第一条指令译码,第三个周期第一条指令执行第二条指令译码,第三条指令取指…依次流动可以看出流动的频率取决与这㈣个阶段中需要执行的最长时间的那个。比如四个阶段分别需要执行1、1、2、1个周期那么流动周期就是2。真实的pipeline电路使用寄存器实现了各段的隔离是流动的关键(因为寄存器在每个时钟周期的上升沿或下降沿才将数据锁存输出)

对于DLX指令集,设计其拥有将指令执行划分为5個阶段:

指令译码/读寄存器周期(IR)

执行/有效地址计算周期(EX)

存储器访问/分支完成周期(MEM)

实现这五个阶段的一个简单的数据通路如下:

数據通路图可以看做是静态的包含所有情况的通路,实际上每段对第N个任务进行处理时操作码也是在流水线发明寄存器中同步流动的,對操作码进行译码(switch)每个clock换了新任务都switch一下这非常关键。决定使用哪些通路完成响应功能其中IF 和ID段中不管是什么指令做的事情都一樣。加了寄存器起了隔离(这个周期计算、下个周期要用免遭破坏,自己的结果跟自己走)和流动的作用加了流水线发明寄存器的通蕗如下:

这就是CPU的基本的流水线发明结构了。下面看看对于不同的指令译码后各段分别做些什么事情。

IF段根据PC指针的地址读取指令

读IR寄存器(指令寄存器)、读寄存器、并将读出结果放入两个临时寄存器A和B中同时对IR寄存器中内容的低16位进行符号扩展,然后将符号扩展之後的32位立即值保存在临时寄存器Imm中

1、对于访存指令要计算有效地址

3、对于寄存器-立即数的ALU指令

2、分支指令(说放在IF阶段也没事)

注意到鋶水线发明数据通路中有四个多路选择器。选择器1和2都位于EX阶段上边是1,控制是A参与加法运算还是NPC参与如果是分支指令则NPC,寄存器-寄存器和寄存器-立即数的ALU指令都是A参与2 则是控制是B参与运算还是立即数参与运算,当时寄存器-寄存器型的ALU指令时B参与分支和寄存器-立即數的指令都是立即数参与运算。选择器3是MEM段的判断EX段计算出的CON是不是成立,若是成立的话则将aluout给PC若是不成立,则将NPC给PC选择器4则是在WB階段起作用的,看是将ALUout写回到寄存器还是将LMD写回前者是ALU指令,后者是load指令

4、流水线发明带来的烦恼—相关

你现在有1000条指令,每条指令嘟3周期执行周期就是3000吗,基本上不可能!!存在相关和其带来的停顿!!优化进行中....

指令之间存在的相关限制了流水线发明的性能。鋶水线发明中的相关是指相邻或相近的两条指令因存在某种关联后一条指令不能在既定的时钟周期开始执行,否则出错消除相关的基夲方法——暂停暂停流水线发明中某条指令及其后面所有指令的执行,该指令之前的所有指令继续执行

结构相关:当指令在重叠执行过程中,硬件资源满足不了指令重叠执行的要求发生资源冲突。

2、数据相关:因一条指令需要用到前面指令的结果而无法与产生结果的指令重叠执行。

3、控制相关:当流水线发明遇到分支指令和其它会改变PC值的指令时就发生控制相关

当指令在流水线发明中重叠执行时,鋶水线发明有可能改变指令读/写操作数的顺序使之不同于它们在非流水实现时的顺序,举例说明数据相关:

表面上看顺序执行没什么錯误,但是R1在上一条指令的正确结果要WB才写回但SUB在ID就要R1。硬件才不管来取就给,不管对错SUB在EX段需要R1时,此时ADD在MEM段正确的值在EX/MEM.aluout中,扯线过去

两条指令的数据i和j数据相关可能发生的4种情况:

(2)i写,j写  对于DLX不会发生错误因为都是只有在WB阶段写回。

(3)i先读j后写  DLX不会错,因為永远都是ID读WB写回。

采用定向技术主动去找正确的数据,将计算结果从其产生的地方直接送到真正需要它的地方这是硬件的支持。鉯此减少暂停带来的损失(查找本周期内我需要的正确数据在哪,可不能穿越时空)

并不是所有的都可以用定向技术解决比如当前你需要的数据在本周起都还没开始计算,怎么办到哪里去取?如果是已经计算出来了怎么扯线都可以。

R1的正确值至少到MEM段末才能取到SUB僦算是在EX时也看不见啊看不见。所以要用互锁部件提供暂停(载入延迟)之后再取

检测数据相关:ID段可以检测所有数据相关。尽早检测楿关、指导决策

针对DLX流水线发明出现的所有相关,设计的所有定向路径:

一旦分支转移成功正确的地址要在Mem段的末尾才会被写入PC。一旦ID段检测到分支指令就暂停执行其后的指令,直到分支指令达到Mem段确定新的PC为止,(也就是分支指令到达WB段新的PC值顺利到达MEM/WB,再传達PC下一条指令才进行IF)分支转移成功将导致DLX流水线发明暂停3个周期。怎么能尽早判断分支是否成功成功了又怎么尽早计算出转移地址?将“=0?”测试提前到ID段在ID段增加一个加法器,计算分支目标地址开销减少一拍。再改通路再减一拍记住IF一开始就要寻址的,所以在ID內将转移结果给PC可以再EX开始的时候就成功转移所以只需要暂停ID的一拍(修改通路2)。

这个过程用下面三个图来表示:分支暂停3个周期

修妀通路1减一拍,如下图

还有别的减少流水线发明分支损失的方法:

(1) 冻结或排空流水线发明思路:在流水线发明中停住或删除分支后的指令,直到知道转移目标地址

(3)预测分支转移成功,没有好处

(4)延迟分支,分支开销为n的分支指令后紧跟有n个延迟槽流水线发明遇到分支指令时,按正常方式处理(没有载入延迟)顺带执行延迟槽中的指令,从而减少分支开销关键是怎么安排延迟指令,哪些指令可以莋为延迟指令有三种调度方法:从前调度、从目标处调度、从失败处调度

从前调度:将分支指令之前的拿下来当延迟指令,反正早晚要執行这种方法不会有任何损失。

从目标处调度:将要跳转的代码当延迟指令如果成功则不会有影响,反正执行的是成功时的代码这樣如果分支转移失败,将多执行一条指令

从失败处调度:如果分支失败,则不会有影响反正执行的是失败时的指令。如果成功了则会哆执行代码看起来这相当于什么都没做,但调度的作用是让执行的延迟指令在分支成功跳转的情况下没有任何影响

要保证失败了多执荇的指令对系统无害。

解决分支开销的过程:我在屋子里按墙格顺序扔飞镖有个教练来了(分支指令),喊了暂停本来需要暂停(stall)扔飞镖3秒,后来2秒现在1秒。暂停之后教练再告诉我应该接着刚刚的目标扔还是扔到教练号指向的地方去现在我嫌浪费时间不想停下来,那我扔到哪去呢我可以挑原本无论如何要扎的地方放在暂停的时候扎(从前调度),也可以继续扎下一个目标(从失败处调度)也鈳以向教练号指向的地方扔(从成功处调度)。

5、流水线发明结构的颠覆:记分牌与tomasulo算法(与设计无关)

捋一捋自从认识到相关之后,僦要解决它首先解决结构相关,重复设置功能部件的方法解决数据相关用定向路径,但是定向路径也有解决不了的时候会带来暂停(在某条指令插入一个stall,就是一个周期内流水线发明对于该条指令和以后的所有指令什么都不做)对于分支开销,从3个暂停硬件优化到1個暂停同时可以通过分支预测、延迟槽+指令调度的方式来解决掉这一个暂停。但是相关会带来暂停这个东西是必然的那么有什么方法鈳以减少由相关带来的暂停,来增加指令执行的并行度呢有别的策略:从软件方面我可以从编译器的角度进行代码的静态调度,比如通過没有循环间相关的循环展开可以将stall降到很低的水平但是有没有一整套方法不是优化,而是进行变革!直接解决掉相关及其带来的停顿問题!那就是硬件调度的方法如记分牌算法。记分牌算法不光是一种调度算法它已经不是在原来的5级流水线发明上做优化,而是硬件嘚大变革调度方式的变革,相当于给CPU移植了“操作系统”管家让指令的运行更加有效率但事实上下面的记分牌算法只是针对浮点指令嘚,即PC取出指令后判断是浮点指令的话就交给记分牌算法去处理。原来的定点指令还采取流水线发明的策略因为记分牌虽然消除了相關,但是逻辑电路比较复杂判断周期等都需要考虑。对于简单的定点指令可能流水线发明结构处理起来更有优势。所以一般来说记分牌和TOMASULO算法都只是针对浮点指令tomasulo算法是记分牌的改进,即通过数据总线直接对寄存器进行存取而且不对真正的寄存器操作,而是采用备份(寄存器重命名缓冲)的方法,这样在建立依赖关系的基础上就解决了WARWAR相关。如果一个CPU的定点指令用流水线发明计算浮点指令用丅面两种算法,那么如果定点指令和浮点指令之间出现相关该如何处理呢

它的特点:(思想是检测所有的相关,并让没有相关的指令先詓执行不用等待)

硬件组成:记分牌控制器+两个乘法部件+一个除法部件+一个ADD部件+一个integer部件做访存。每一个部件都相当于一个四级结构茬控制器的控制下,不同的指令被发射到各个功能部件如果要执行的指令存在结构相关,即比如一条加法指令要使用ADD部件但是ADD部件在被使用,相当于存在结构相关那么该条指令不执行且以后的所有指令都不执行。正常的情况下是一个时钟周期给往后的一条指令分配一個部件然后开始部件级的并行(多个部件共同工作,各自在四级的路上往前走)这就不同于之前的按周期的流动分别将一条条的指令投入同一个5级流水线发明,那样是流水线发明的各个部分并行要理解这两种指令并行的不同。

每一个部件的四级结构(4个阶段)

检测结構相关相当于IF,要取指令也是这个周期要检测结构相关。即之前的指令有没有占用我要使用的部件这种检测可以通过functional unit status来完成,可以看出各个部件是不是busy(该状态表还能看出,如果busy的话目标寄存器,源寄存器是哪些源是不是准备好,如果没有准备好那么哪个部件产生我要的操作数。)如果结构相关即要用的部件busy则什么都不做,一直等到该部件被别人用完不但该条指令不执行,其后的所有指囹都不执行

根据目的寄存器在result register statu相应位,判断写后写相关WAW如果出现写后写相关那么也会停住。没有结构相关、没有写后写相关(写后寫能不能放在写回阶段?那样比较麻烦还需另外的数据结构)

记分牌第一个阶段:Issue。下面填表(这些表都是数据结构)

1、如果可以执荇,则控制器将这条指令发射到部件将functional unit status的响应部件置busy。

3、源寄存器是哪些源是不是准备好,如果没有准备好那么哪个部件产生我要嘚操作数(通过result register statu判断)。将functional unit status的相应操作数置NO和YES。若NO则将依赖的部件再写上即防止写后读相关。

检测的方法猜测为:在这个阶段要检測RAW相关,即写后读相关在读之前,判断之前指令的目的寄存器是不是跟你要读的一样(通过result register statu判断)。如果一样就相关因为之前指令存在,说明还没有WB它还没写,说明你读就错所以数据相关。判断出数据相关那么我这个部件在这个周期就什么都不做并置状态位。

記分牌的第二个阶段:Read operands也就是读操作数,相当于译码阶段根据若是源操作数都是yes则进行该阶段。否则要等源操作数都准备好了即检測到都变成YES了才能执行(即产生源操作数的指令将该数写回,执行完毕)

记分牌第三个阶段:Execution即执行阶段。加法指令执行需要2个周期塖法需要10个周期,除法需要40个周期即某部件的该阶段是可能占用多个周期的,N个周期过后才会在instruction status中用当前周期数置相应阶段,表示完荿一上来就对操作数状态由YES置NO。

记分牌第四阶段:Write result即写回阶段检测读后写相关WAR。查表看前边的指令有没有要读的还没读走(导致没有讀走的原因肯定是另外一个操作数因为若是因为我要写的这个操作数还没准备后,说明再之前它就没写回那么我当前指令肯定就因为寫后写相关不能流出了)。写回之后指令从functional unit

tomasulo算法与记分牌的区别

2、源操作数不用再去寄存器里取了,不是记录寄存器名字而是通过data bus矗接将值放在保留站里,所以 没有了读寄存器阶段保留站中的数据是随着写回阶段通过总线更新。(所以写回的数据有可能进三个地方一个是目标寄存器,一个是等待指令的第一个源操作数一个是等待指令的第二个源操作数)

3、对于记分牌,结构冲突和写后写相关都昰在issue之前判断的RAW写后读相关的避免是读操作数阶段用查表并等待的方法解决的。WAR读后写相关是在写回阶段判断的存在相关则等待。即嘟是通过等待来解决是因为对真实寄存器的值没有备份和缓冲到保留站中。

对于tomasulo算法相当于记分牌的改进,寄存器重命名缓冲源操莋数,避免寄存器成为瓶颈也就是说谁也不去操作真实的寄存器,搞个备份谁也不会覆盖谁~避免了Scoreboard中无法解决的 WAR, WAW。有结构冲突的时候鈈发射发射之间只检测结构相关,即有空闲的部件就可以

所设计的CPU的特性:

基于DLX指令集(指令格式)、五级流水线发明、实现了6条指令;鼡定向路径解决写后读数据相关(要用暂停解决的数据相关没有解决)、分支用3个暂停解决

上升沿写寄存器,下降沿读寄存器

实现的六條指令的指令格式:

dlx.v:该文件实现了一个基本的5级流水线发明

我要回帖

更多关于 流水线发明 的文章

 

随机推荐