1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
package vexriscv.plugin
import vexriscv.{VexRiscv, _}
import spinal.core._
// DivPlugin was by the past a standalone plugin, but now it use the MulDivIterativePlugin implementation
class DivPlugin extends MulDivIterativePlugin(genMul = false, genDiv = true, mulUnrollFactor = 1, divUnrollFactor = 1)
//import spinal.lib.math.MixedDivider
//
//class DivPlugin extends Plugin[VexRiscv]{
// object IS_DIV extends Stageable(Bool)
//
// override def setup(pipeline: VexRiscv): Unit = {
// import Riscv._
// import pipeline.config._
//
// val actions = List[(Stageable[_ <: BaseType],Any)](
// SRC1_CTRL -> Src1CtrlEnum.RS,
// SRC2_CTRL -> Src2CtrlEnum.RS,
// REGFILE_WRITE_VALID -> True,
// BYPASSABLE_EXECUTE_STAGE -> False,
// BYPASSABLE_MEMORY_STAGE -> True,
// RS1_USE -> True,
// RS2_USE -> True,
// IS_DIV -> True
// )
//
// val decoderService = pipeline.service(classOf[DecoderService])
// decoderService.addDefault(IS_DIV, False)
// decoderService.add(List(
// DIVX -> actions
// ))
//
// }
//
// override def build(pipeline: VexRiscv): Unit = {
// import pipeline._
// import pipeline.config._
//
// val divider = new MixedDivider(32, 32, true) //cmd >-> rsp
//
// //Send request to the divider component
// execute plug new Area {
// import execute._
//
// divider.io.cmd.valid := False
// divider.io.cmd.numerator := input(SRC1)
// divider.io.cmd.denominator := input(SRC2)
// divider.io.cmd.signed := !input(INSTRUCTION)(12)
//
// when(arbitration.isValid && input(IS_DIV)) {
// divider.io.cmd.valid := !arbitration.isStuckByOthers && !arbitration.removeIt
// arbitration.haltItself := memory.arbitration.isValid && memory.input(IS_DIV)
// }
// }
//
// //Collect response from the divider component, REGFILE_WRITE_DATA overriding
// memory plug new Area{
// import memory._
//
// divider.io.flush := memory.arbitration.removeIt
// divider.io.rsp.ready := !arbitration.isStuckByOthers
//
// when(arbitration.isValid && input(IS_DIV)) {
// arbitration.haltItself := !divider.io.rsp.valid
//
// output(REGFILE_WRITE_DATA) := Mux(input(INSTRUCTION)(13), divider.io.rsp.remainder, divider.io.rsp.quotient).asBits
// }
//
//
// divider.io.rsp.payload.error.allowPruning
// }
// }
// }
|