我想知道处理器如何从一开始就在多周期数据路径中进行乘法运算,即从指令读取->解码指令->读取寄存器文件等。
换句话说,我想知道,考虑到booth的乘法算法是单独实现的(给出了一个电路),你将如何扩展多周期数据路径以支持使用最少资源的乘法指令。
你能告诉除法吗?
我想知道处理器如何从一开始就在多周期数据路径中进行乘法运算,即从指令读取->解码指令->读取寄存器文件等。
换句话说,我想知道,考虑到booth的乘法算法是单独实现的(给出了一个电路),你将如何扩展多周期数据路径以支持使用最少资源的乘法指令。
你能告诉除法吗?
对于简单的 cpu 乘法将在 CPU 管道的阶段 EX 上。所以获取指令,对其进行解码,向 RegisterFile 询问输入操作数,在 ALU 上执行实际的乘法运算。
取决于 ALU 变体,乘法可能需要 1 个 CPU 周期或更多(在每个 cpu 周期存储部分和,然后它将在 CPU 管道的 EX0、EX1、EX2 等阶段)。慢速 ALU 可以流水线化,所以它会在 N 个滴答中给出第一个操作的结果,并在每个 M 个中启动不同的操作
您可以在 http://www.aoki.ecei.tohoku.ac.jp/arith/mg/algorithm.html页面上获得乘法器的各种硬件变体
另一个很好的链接是开源 OpenFire 微处理器内核,MicroBlaze 的变体/模拟(基于 DLX):
ALU 和乘法器单元的部分数据路径在openfire_primitives.v
文件中。
DLX 数据路径手册对流水线停顿和气泡进行了很好的解释
http://www.cs.iastate.edu/~prabhu/Tutorial/PIPELINE/hazards.html
还有关于多循环操作(DLX)的信息
http://www.cs.iastate.edu/~prabhu/Tutorial/PIPELINE/multicycle.html
因此,可以留在管道中的操作(需要更多滴答声)会将停顿(或气泡)插入管道。您可以将其视为停止除 EX 之外的管道的所有阶段,这些阶段对几个 tisks 执行 Long 操作。
开源 Verilog 的另一个 Mul/Div 单元在这里: http ://opencores.org/websvn,filedetails?repname=openrisc&path=%2Fopenrisc%2Ftrunk%2For1200%2Frtl%2Fverilog%2For1200_mult_mac.v