这是我想要完成的:我有一个Chisel加速器,它调用另一个Chisel加速器并传入一个值。我希望第二个函数中有一个while循环,其中的条件部分基于输入值。下面是一些示例代码:
class Module1 extends Module {
val in = 0.U
val Module2Module = Module2()
Module2Module.io.in := in
}
class Module2 extends Module {
val io = IO(new Bundle {
val in = Input(Reg(UInt))
}
val test = 0.U
while (test < io.in) {
}
}我得到的错误是“chisel.Bool < io.in”是一个测试,而不是一个布尔值。我知道我不能将其转换为Scala类型,对吧?
实现这一点的正确方法是什么?是否将信号发送到/从Module1发送到Module2,以指示加速器尚未完成,并仅在加速器完成时才继续?如果是这样的话,如果你有几个函数,每个函数都在不同的模块中,这不是很快就会变得复杂吗?
发布于 2020-02-23 10:57:30
您将需要使用由Reg构造函数家族创建的寄存器,并使用when、elsewhen和otherwise控制流程。我认为chisel bootcamp的2.6_testers2.ipynb是一个很好的例子。GCD电路相当于while循环。该电路继续运行,直到y寄存器递减至零。每个时钟周期对应于软件while循环的单次迭代。该电路使用Decoupled输入和输出的就绪和有效字段来协调新数据的摄取,并在计算出GCD值时进行报告。看看这个例子,看看你是否有更多的问题。
发布于 2020-02-27 03:23:56
为了详细说明为什么不能将while循环与chisel3.Bool这样的硬件值一起使用,您可以将chisel3设计看作是一个Scala程序,它在执行时构造硬件设计。当chisel3运行时,它只是运行一个程序,该程序的输出是您的电路(最终作为Verilog发出)。while是一个Scala结构,所以它只在程序执行期间可用,它不存在于实际的硬件中。有一个similar question and answer about for loops on the chisel-users mailing list。
现在回答你的问题,正如奇克提到的,你可以使用chisel3构造when,.elsewhen和.otherwise来处理实际硬件中的控制流:
class Module2 extends Module {
val io = IO(new Bundle {
val in = Input(Reg(UInt))
}
val test = 0.U
when (test < io.in) {
// Logic for that applies when (or while) the condition is true
} .otherwise {
// Logic that applies when it isn't
}
}同样,正如奇克提到的,你可能需要一些状态(使用Reg),因为你可能需要在多个时钟周期上做事情。在没有更多信息的情况下,很难在这个简单的例子之外提供建议,但如果您需要更多帮助,请扩展您的问题或询问更多问题。
如果是这样的话,如果你有几个函数,每个函数都在不同的模块中,这不会很快变得复杂吗?
我不确定如何在没有更多上下文的情况下回答这个问题,但Chisel的整个目的是让创建允许您处理复杂性的抽象变得更容易。Chisel支持在设计硬件时进行软件工程。
https://stackoverflow.com/questions/60358354
复制相似问题