可以在verilog中明确找到凿子中的寄存器名称。 但电汇名称有时会在Verilog代码中省略号。
例如,我在verilog中找不到sjwr ,sjwaddr
名称。
val sjwr = Wire(Bool())
val sjwaddr = Wire(UInt(jcnt.getWidth.W))
sjwr := jcnt_rdy
sjwaddr := jcnt
when (sjwr) { sjBuf(sjwaddr) := sjxv }
当我们生成Verilog代码时,如何将所有变量名保留在凿子中。
对于wave调试很重要。
答案 0 :(得分:4)
谢谢您对凿子的兴趣!
名字可能消失的原因有很多。
由于许多原因,包括与现有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
}
在上面的代码中,wire
将被删除,因为它只是连接到io.in
,Verilog只会显示:
assign io_out = io_in;
凿子模块实现为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)
}
您可以通过在其上调用.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!
}
我们可以使用称为@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)
}
@chiselName
是一个注释,可在任何class
或object
定义上使用,并确保可以命名诸如incremented
之类的值。 @chiselName
有效地重写您的代码以将.suggestName
放在各处。
我希望这会有所帮助!
我认为它尚未发布(最近发布的是3.1.7
,它将发布在3.2.0
中),但是我们确实有一个选项可以禁用所有优化。您可以将使用的“编译器”从verilog
更改为mverilog
(对于“最小” Verilog,即无优化)。可以使用Chisel或FIRRTL中的命令行参数-X mverilog
完成。
您还可以使用chisel3.experimental.dontTouch
将信号标记为不应删除的内容。这将阻止优化消除信号。例如:
import chisel3.experimental.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