凿子中的注册名可以在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代码时,我如何将所有变量名保持在chisel中。
这对波形调试很重要。
发布于 2019-03-28 17:00:05
谢谢您对Chisel的兴趣!
一个名字可能正在消失的原因有几个。
常传播
由于许多原因,包括与现有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
您可以通过调用.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
编辑:本节适用于v3.4.0之前的Chisel版本。在v3.4.0中,Chisel添加了Scala编译器插件,以便进行更好的命名,因此不再需要@chiselName。有关文档,请参见网站:https://www.chisel-lang.org/chisel3/docs/explanations/naming.html
我们可以通过一个名为@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,即。没有优化)。这可以用命令行参数-X mverilog来完成,无论是在Chisel还是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编辑2:我已经为Chisel 3.2更新了dontTouch从包chisel3.experimental转移到常规的chisel3包
https://stackoverflow.com/questions/55401525
复制相似问题