不能在 class 参数化中使用 Bool 来反转复位极性
Cannot use Bool in class parametrization to reverse reset polarity
我刚开始使用 Chisel 并编写了一个简单的计数器来使 LED 闪烁。 FPGA板(Lattice iCEstick)有一个反相复位信号,我不想在生成的verilog中改变极性,而是想在Chisel中设置它。
我发现 Module 有一个 _reset
类型的 Chisel.Bool 参数,可以将其设置为 false,从而反转复位信号。 Here 是其他人使用它的示例。但是我收到一个我似乎无法修复的错误。一、代码:
import Chisel._
class Blink( rstPol: Bool = null ) extends Module( _reset = rstPol ) {
val io = new Bundle {
val led = UInt( OUTPUT, 1 )
}
val cnt_next = UInt()
val counter = Reg( init = UInt( 0, 24 ), next = cnt_next )
cnt_next := counter + UInt( 1 )
io.led := counter( 23 )
}
object blinkmain {
def main( args: Array[ String ] ): Unit = {
chiselMain( Array( "--backend", "v" ),
() => Module( new Blink( Bool( false ) ) )
)
}
}
我得到的错误是:
[error] Blink.scala:19 < /*??*/ Chisel.Bool(OUTPUT, width=1, connect to 0 inputs: ()) > doesn't have its component,yet. in class blinkmain$$anonfun$main$$anonfun$apply
如果我不提供 Bool( false )
参数,那么我不会收到任何错误,但我的重置极性当然仍然是正极。
我试过 rstPol: Bool = Bool( false )
和 Module( _reset = Bool( false ) )
但我在第 3 行遇到了同样的错误。它似乎试图将 Bool 分配给没有宽度的东西,但我不知道这怎么可能。
我检查了我使用的是哪个版本的 Chisel,它是 2.2.33
。这是我的 build.sbt 文件,以防它很重要:
scalaVersion := "2.11.7"
libraryDependencies += "edu.berkeley.cs" %% "chisel" $ "latest.version"
scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-language:reflectiveCalls")
由于我是 Scala 和 Chisel 的新手,我错误地认为 Module
的 _reset
参数是一个 Bool
来指示是正复位信号还是负复位信号产生。您可以将 Bool
INPUT 连接到 _reset
但是,与 Bool
OUTPUT 相反,错误消息提及。
我就是这样修复它的(我确实用计数器宽度参数 swidth
扩展了它,但这无关紧要):
import Chisel._
class Blink( swidth: Int, rst: Bool = null ) extends Module( _reset = rst ) {
val io = new Bundle {
val led = UInt( OUTPUT, 5 )
}
val counter = Reg( init = UInt( 0, width = swidth ) )
counter := counter + UInt( 1 )
io.led := counter( swidth - 1, swidth - 5 )
}
class Top extends Module {
val io = new Bundle {
val led = UInt( OUTPUT, 5 )
val rstn = Bool( INPUT )
}
val rst = Reg( next = Reg( next = !io.rstn ) )
val blink = Module( new Blink( 27, rst ) )
blink.io.led <> io.led
}
object BlinkMain {
def main( args: Array[ String ] ): Unit = {
chiselMain( Array( "--backend", "v", "--targetDir", "verilog" ),
() => Module( new Top() )
)
}
}
所以我创建了一个实例化 Blink
的 Top
模块,它采用反转复位输入 (rstn
),将其反转,并将其分配给 _reset
.为了更好地衡量,我还通过两个触发器路由 rstn
以将其与输入时钟信号同步。
我刚开始使用 Chisel 并编写了一个简单的计数器来使 LED 闪烁。 FPGA板(Lattice iCEstick)有一个反相复位信号,我不想在生成的verilog中改变极性,而是想在Chisel中设置它。
我发现 Module 有一个 _reset
类型的 Chisel.Bool 参数,可以将其设置为 false,从而反转复位信号。 Here 是其他人使用它的示例。但是我收到一个我似乎无法修复的错误。一、代码:
import Chisel._
class Blink( rstPol: Bool = null ) extends Module( _reset = rstPol ) {
val io = new Bundle {
val led = UInt( OUTPUT, 1 )
}
val cnt_next = UInt()
val counter = Reg( init = UInt( 0, 24 ), next = cnt_next )
cnt_next := counter + UInt( 1 )
io.led := counter( 23 )
}
object blinkmain {
def main( args: Array[ String ] ): Unit = {
chiselMain( Array( "--backend", "v" ),
() => Module( new Blink( Bool( false ) ) )
)
}
}
我得到的错误是:
[error] Blink.scala:19 < /*??*/ Chisel.Bool(OUTPUT, width=1, connect to 0 inputs: ()) > doesn't have its component,yet. in class blinkmain$$anonfun$main$$anonfun$apply
如果我不提供 Bool( false )
参数,那么我不会收到任何错误,但我的重置极性当然仍然是正极。
我试过 rstPol: Bool = Bool( false )
和 Module( _reset = Bool( false ) )
但我在第 3 行遇到了同样的错误。它似乎试图将 Bool 分配给没有宽度的东西,但我不知道这怎么可能。
我检查了我使用的是哪个版本的 Chisel,它是 2.2.33
。这是我的 build.sbt 文件,以防它很重要:
scalaVersion := "2.11.7"
libraryDependencies += "edu.berkeley.cs" %% "chisel" $ "latest.version"
scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-language:reflectiveCalls")
由于我是 Scala 和 Chisel 的新手,我错误地认为 Module
的 _reset
参数是一个 Bool
来指示是正复位信号还是负复位信号产生。您可以将 Bool
INPUT 连接到 _reset
但是,与 Bool
OUTPUT 相反,错误消息提及。
我就是这样修复它的(我确实用计数器宽度参数 swidth
扩展了它,但这无关紧要):
import Chisel._
class Blink( swidth: Int, rst: Bool = null ) extends Module( _reset = rst ) {
val io = new Bundle {
val led = UInt( OUTPUT, 5 )
}
val counter = Reg( init = UInt( 0, width = swidth ) )
counter := counter + UInt( 1 )
io.led := counter( swidth - 1, swidth - 5 )
}
class Top extends Module {
val io = new Bundle {
val led = UInt( OUTPUT, 5 )
val rstn = Bool( INPUT )
}
val rst = Reg( next = Reg( next = !io.rstn ) )
val blink = Module( new Blink( 27, rst ) )
blink.io.led <> io.led
}
object BlinkMain {
def main( args: Array[ String ] ): Unit = {
chiselMain( Array( "--backend", "v", "--targetDir", "verilog" ),
() => Module( new Top() )
)
}
}
所以我创建了一个实例化 Blink
的 Top
模块,它采用反转复位输入 (rstn
),将其反转,并将其分配给 _reset
.为了更好地衡量,我还通过两个触发器路由 rstn
以将其与输入时钟信号同步。