Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在时钟周期内多次重新分配变量-凿子_Scala_Loops_Hdl_Chisel - Fatal编程技术网

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)