可以在verilog中明确找到凿子中的寄存器名称。
但电汇名称有时会在Verilog代码中省略号。
例如,我sjwr ,sjwaddr在verilog中找不到名称。
val sjwr = Wire(Bool())
val sjwaddr = Wire(UInt(jcnt.getWidth.W))
sjwr := jcnt_rdy
sjwaddr := jcnt
when (sjwr) { sjBuf(sjwaddr) := sjxv }
Run Code Online (Sandbox Code Playgroud)
当我们生成Verilog代码时,如何将所有变量名保留在凿子中。
对于wave调试很重要。
感谢您对凿子的关注!
名字消失的原因有很多。
由于许多原因,包括与现有CAD工具的互操作性,性能和Verilog调试能力,Chisel(实际上是Chisel下的FIRRTL编译器)将传播常量和直接导线连接。例如:
class MyModule extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W))
val out = Output(UInt(8.W))
})
val wire = Wire(UInt(8.W))
wire := io.in
io.out := wire
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,wire将被删除,因为它只是连接到io.in,Verilog只会显示:
assign io_out = io_in;
Run Code Online (Sandbox Code Playgroud)
凿子模块实现为Scala类。由于实现原因,默认情况下,Chisel只能vals在模块主体中命名“顶级” ,例如:
class MyModule extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W))
val in2 = Input(UInt(8.W))
val out = Output(UInt(8.W))
})
val sum = io.in + io.in2 // this is a top-level val, will be named
// A method, we can call to help generate code:
def inc(x: UInt): UInt = {
val incremented = x + 1.U // We cannot name this, it's inside a method
incremented
}
io.out := inc(sum)
}
Run Code Online (Sandbox Code Playgroud)
您可以通过调用任意信号来手动命名.suggestName("name"),例如。
def inc(x: UInt): UInt = {
val incremented = x + 1.U // We cannot name this, it's inside a method
incremented.suggestName("incremented") // Now it is named!
}
Run Code Online (Sandbox Code Playgroud)
我们可以使用@chiselName类似这样的实验功能来解决上述问题:
import chisel3.experimental.chiselName
@chiselName
class MyModule extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W))
val in2 = Input(UInt(8.W))
val out = Output(UInt(8.W))
})
val sum = io.in + io.in2 // this is a top-level val, will be named
// A method, we can call to help generate code:
def inc(x: UInt): UInt = {
val incremented = x + 1.U // We cannot name this, it's inside a method
incremented
}
io.out := inc(sum)
}
Run Code Online (Sandbox Code Playgroud)
@chiselName是可以在任何或定义上使用的注释,它将确保可以命名类似val 。有效地重写您的代码以放置到各处。classobjectincremented@chiselName.suggestName
我希望这有帮助!
我不认为它尚未发布(最近发布3.1.7,它将在中3.2.0),但是我们确实有一个选项可以禁用所有优化。您可以将使用的“编译器”更改verilog为mverilog(对于“最小” Verilog,即无优化)。可以使用-X mverilogChisel或FIRRTL中的命令行参数来完成。
您也可以chisel3.dontTouch将信号标记为不应删除的内容。这将阻止优化消除信号。例如:
import chisel3.dontTouch
class MyModule extends Module {
val io = IO(new Bundle {
val in = Input(UInt(8.W))
val out = Output(UInt(8.W))
})
val wire = dontTouch(Wire(UInt(8.W)))
wire := io.in
io.out := wire
Run Code Online (Sandbox Code Playgroud)
编辑2:我已针对Chisel 3.2进行了更新,dontTouch将其从软件包chisel3.experimental移至常规chisel3软件包