簡體   English   中英

生成Verilog代碼時如何將所有變量名稱保留在鑿子中

[英]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!
  } 

輸入@chiselName

編輯:本節適用於 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是一個注解,可用於任何classobject定義,並確保像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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM