首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >凿子不能重新指定为只读。

凿子不能重新指定为只读。
EN

Stack Overflow用户
提问于 2022-05-18 20:09:43
回答 1查看 135关注 0票数 1

这是我提出的另一个问题的延续:Instanciation of a class doesn't work (Chisel/Scala)

实际上,我想打印“结果”变量。我编写了以下命令: sbt测试,我不理解这个错误:

"chisel3.internal.ChiselException:无法重新分配到只读组合Tausworthe.b: OpResultUInt<32>“

这是测试文件

代码语言:javascript
复制
import chiseltest._
import org.scalatest.freespec.AnyFreeSpec


class combined_test extends AnyFreeSpec with ChiselScalatestTester {
  "combinedTauswhore" in {

    test(new combinedTausworthe() ){ c =>
      //Initialisation
       c.clock.step(1)
      println(c.result)

      c.clock.step(1)
      println(c.result)

    }

  }

}

这是一堂课:

代码语言:javascript
复制
import chisel3._

 class combinedTausworthe extends Module{
   val io = IO(new Bundle {
   })
   val seed1 = RegInit(322769304.U(32.W))
   val seed2 = RegInit(424235419.U(32.W))
   val seed3 = RegInit(212119443.U(32.W))
   var result= 0.U

   var b = ((seed1 << 13)(31,0) ^ seed1)
   seed1 := ((seed1 & 4294967294L.U) << 12)(31,0) ^ b
   b := ((seed2 << 2)(31,0) ^ seed2) >> 25
   seed2 := ((seed2 & 4294967294L.U) << 4)(31,0) ^ b
   b := ((seed3<<3)(31,0) ^ seed3) >> 11
   seed3 := ((seed3 & 4294967294L.U) <<17)(31,0) ^ b

   result := (seed1 ^ seed2 ^ seed3)
   

 }

object Main extends App {
 
}
EN

回答 1

Stack Overflow用户

发布于 2022-05-18 20:22:30

在Chisel3中,:=是驱动具有某种值的信号的连接操作符。把它想成是制造一种电气连接。在您的代码中,您似乎试图将变量重新分配到可变变量,而不是使用值驱动该变量的值,尝试=

代码语言:javascript
复制
import chisel3._

class combinedTausworthe extends Module{
  val io = IO(new Bundle {
  })
  val seed1 = RegInit(322769304.U(32.W))
  val seed2 = RegInit(424235419.U(32.W))
  val seed3 = RegInit(212119443.U(32.W))
  var result= 0.U

  var b = ((seed1 << 13)(31,0) ^ seed1)
  seed1 := ((seed1 & 4294967294L.U) << 12)(31,0) ^ b
  // Note using assignment (=), not connection (:=)
  b = ((seed2 << 2)(31,0) ^ seed2) >> 25
  seed2 := ((seed2 & 4294967294L.U) << 4)(31,0) ^ b
  b = ((seed3<<3)(31,0) ^ seed3) >> 11
  seed3 := ((seed3 & 4294967294L.U) <<17)(31,0) ^ b

  // Same thing here
  result = (seed1 ^ seed2 ^ seed3)   
}

尽管如此,由于Scala是一种函数式编程语言,我们在风格上更喜欢纯/不变的结构,所以只使用值:

代码语言:javascript
复制
import chisel3._

class combinedTausworthe extends Module{
  val io = IO(new Bundle {
  })
  val seed1 = RegInit(322769304.U(32.W))
  val seed2 = RegInit(424235419.U(32.W))
  val seed3 = RegInit(212119443.U(32.W))
  // Note result var removed and replaced with val below

  val b1 = ((seed1 << 13)(31,0) ^ seed1)
  seed1 := ((seed1 & 4294967294L.U) << 12)(31,0) ^ b1
  val b2 = ((seed2 << 2)(31,0) ^ seed2) >> 25
  seed2 := ((seed2 & 4294967294L.U) << 4)(31,0) ^ b2
  val b3 = ((seed3<<3)(31,0) ^ seed3) >> 11
  seed3 := ((seed3 & 4294967294L.U) <<17)(31,0) ^ b3

  val result = (seed1 ^ seed2 ^ seed3)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72295386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档