Scala 在时钟周期内多次重新分配变量-凿子
我想在一个时钟周期内多次重新分配变量Scala 在时钟周期内多次重新分配变量-凿子,scala,loops,hdl,chisel,Scala,Loops,Hdl,Chisel,我想在一个时钟周期内多次重新分配变量hit_bits命中位将增加。当我试图编译代码时,我得到了“找到组合路径!” 有什么想法吗 val hit_bits = Bits() hit_bits := Bits(0) when(io.bits_perf.valid){ for(i<- 0 until 3){ when(io.bits_perf.bits(i)) { hit_bits := hit_bits + Bits(1) } } }
hit_bits
<只要io.bits\u perf.bits(i)
为真,代码>命中位将增加。当我试图编译代码时,我得到了“找到组合路径!”
有什么想法吗
val hit_bits = Bits()
hit_bits := Bits(0)
when(io.bits_perf.valid){
for(i<- 0 until 3){
when(io.bits_perf.bits(i)) { hit_bits := hit_bits + Bits(1)
}
}
}
val hit_bits=bits()
命中位:=位(0)
何时(io.bits\性能有效){
对于(i本例,重要的是要记住凿子和Scala之间的区别。更具体地说,当
是一个凿子构造,映射到Verilog中的条件连接,而for
是一个Scala构造,我们可以使用它来生成硬件(类似于Verilog中的生成
)
让我们展开这个for循环,看看我们得到了什么:
when(io.bits_perf.valid){
when(io.bits_perf.bits(0)) { hit_bits := hit_bits + Bits(1) }
when(io.bits_perf.bits(1)) { hit_bits := hit_bits + Bits(1) }
when(io.bits_perf.bits(2)) { hit_bits := hit_bits + Bits(1) }
}
请注意,所有连接都是相同的,当io.bits\u perf.valid
为高位且io.bits\u perf.bits
中的任何位为高位时,您将连接hit\u bits
到hit\u bits+bits(1)
。这是组合循环
现在,让我们了解如何表达您真正想要做的事情:当io.bits\u perf.bits\u perf.valid
较高时,如何将hit\u位连接到io.bits\u perf.bits
中的位数。这也称为popcount,凿子恰好有一个实用程序。您应该做的是:
val hit_bits = Bits()
hit_bits := Bits(0)
when(io.bits_perf.valid) {
hit_bits := PopCount(io.bits_perf.bits)
}
但是,您编写的代码几乎是正确的,所以我们还是让它工作吧。我们要做的是使用Scala for循环来生成一些代码。一种方法是使用Scalavar(允许重新分配)作为凿除节点的“指针”,而不是只允许单个分配的val(因此不能更改为指向其他凿子节点)
var hit_bits=bits(0,2)//我们设置宽度,因为+不扩展宽度
何时(io.bits\性能有效){
为了
var hit_bits = Bits(0, 2) // We set the width because + does not expand width
when (io.bits_perf.valid) {
for (i <- 0 until 3) {
hit_bits = hit_bits + io.bits_perf.bits(i)
}
}
// Now hit_bits is equal to the popcount of io.bits_perf.bits (or 0 if not valid)