Computer science Verilog:管道化简单处理器的步骤

Computer science Verilog:管道化简单处理器的步骤,computer-science,verilog,computer-architecture,pipelining,Computer Science,Verilog,Computer Architecture,Pipelining,几分钟前我问了另一个问题,但我正在完成一个项目。部分好处是我们的处理器设计采用了管道内衬。我有一个简单的基于累加器的处理器,带有数据总线和地址总线。它有三个基本阶段[获取、解码、执行],以及简单处理器中的大多数基本功能单元。如数据存储器、指令寄存器、ALU、MAR、MDR、状态和控制信号的控制器手柄等 我知道什么是管道内衬,但还没有弄清楚如何在功能层面实施它。我已经四处搜索,但没有任何东西可以简化它,或者没有找到任何示例。risc处理器的经典5级包括: 指令提取 指令解码和寄存器提取 处决 内存

几分钟前我问了另一个问题,但我正在完成一个项目。部分好处是我们的处理器设计采用了管道内衬。我有一个简单的基于累加器的处理器,带有数据总线和地址总线。它有三个基本阶段[获取、解码、执行],以及简单处理器中的大多数基本功能单元。如数据存储器、指令寄存器、ALU、MAR、MDR、状态和控制信号的控制器手柄等

我知道什么是管道内衬,但还没有弄清楚如何在功能层面实施它。我已经四处搜索,但没有任何东西可以简化它,或者没有找到任何示例。

risc处理器的经典5级包括:

指令提取 指令解码和寄存器提取 处决 内存访问 寄存器回写 如果一切都在零时间内工作,那么就不需要任何流水线阶段,但正如您在组合逻辑中看到的那样,输入上的一个技术需要时间来实现。再加上加载数据并将其保存到内存的要求,可以看出在一个时钟周期内处理每一件事情都是非常困难的

要简化它,请考虑从内存加载、执行和存储到内存的3个阶段

3指令添加内存指令处理器具有寄存器r1、r2、r3

addr3 = addr1 + addr2
addr6 = addr4 + addr5
addr9 = addr7 + addr8

     Unit Load        Execute        Store
Cycle 1 : r1 = addr1  -              -
          r2 = addr2  

Cycle 2 : r1 = addr4  acc = r1 + r2  -
          r2 = addr5

Cycle 3 : r1 = addr7  acc = r1 + r2  addr3 = acc
          r2 = addr8

Cycle 4 : r1 = 0      acc = r1 + r2  addr6 = acc
          r2 = 0 

Cycle 5 : r1 = 0      acc = 0        addr9 = acc
          r2 = 0
因此,当从程序中读取指令时,我们可以看到它的不同部分在不同的时间使用,读取内存地址在周期1中使用,操作类型加法、减法乘法在周期2中使用,存储内存地址在周期3中使用


数据路径中插入了触发器,将其分解为管道级,然后需要延迟解码指令字的相关部分,以便它们与预期操作的数据同时命中功能块

为了完成管道,你需要在基本阶段之间放置一个触发器阶段。我的意思是:|获取|解码|执行。这根管子代表一个失败的舞台。什么会经历失败?控制信号控制路径和数据信号数据路径。为了模拟触发器,它只是一个编码问题:总是@posedge clk,posedge a_\u rst begin----end如何使它看起来像代码?heheComments不能有换行符,但可以在其周围加上反勾号以使用单间距字体@DOS@DOS当每个阶段的功能单元是分开的时,这是有意义的,但是当一些功能单元在多个或所有阶段中使用时,如何防止它们相互干扰?我必须检查前方舞台的当前状态,以确保信号不会干扰或我遗漏了什么吗?如果我必须在前面陈述,是否有一个简单的路线或只是蛮力比较每个不会干扰的状态?当你实施管道时,你将不得不避开危险。我知道三种类型的危险,数据、控制和结构。这意味着代码需要额外的逻辑。另一种方法是用气泡停止管道。插入气泡并不是最好和有效的方法,您必须知道操作、内存访问等需要多长时间;为了知道在程序中放置nop的位置