[英]How to keep all variable name In chisel when generate Verilog code
chisel 中的寄存器名稱可以在 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 中。
這對於 wave 調試很重要。
感謝您對 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;
Chisel 模塊被實現為 Scala 類。 由於實現的原因,默認情況下 Chisel 只能在 Module 的主體中命名“頂級” 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!
}
編輯:本節適用於 v3.4.0 之前的 Chisel 版本。 在 v3.4.0 中,Chisel 添加了一個 Scala 編譯器插件來做更好的命名,因此不再需要@chiselName
。 有關文檔,請參閱網站: https : //www.chisel-lang.org/chisel3/docs/explanations/naming.html
我們可以使用名為@chiselName
的實驗性功能來解決上述問題, @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
可以被命名。 @chiselName
有效地重寫了您的代碼,將.suggestName
放在所有地方。
我希望這有幫助!
我認為它還沒有發布(最近是3.1.7
,這將是3.2.0
),但我們確實可以選擇禁用所有優化。 您可以將使用的“編譯器”從verilog
更改為mverilog
(對於“最小”Verilog,即沒有優化)。 這可以在 Chisel 或 FIRRTL 中使用命令行參數-X mverilog
來完成。
您還可以使用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
包
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.