这是我问的另一个问题的延续:https://stackoverflow.com/questions/72294401/instanciation-of-a-class-doesnt-work-chisel-scala
实际上,我想打印“结果”变量。我写了这个命令:sbt test,我不明白这个错误:
“chisel3.internal.ChiselException:无法重新分配给只读组合Tausworthe.b:OpResult[UInt<32>]”
这是测试文件
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)
}
}
}
这是课程:
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 {
}
回答1
在 Chisel3 中,:=
是连接运算符,用于驱动带有一些 value 的信号。将其视为创建电气连接。在您的代码中,您似乎正在尝试重新分配给可变变量,而不是使用 value 驱动该变量的 value,请尝试 =
:
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 是一种函数式编程语言,并且我们在风格上更喜欢纯/不可变结构,因此请尝试仅使用 values:
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)
}