Как сохранить все имена переменных в долоте при генерации кода Verilog - PullRequest
1 голос
/ 28 марта 2019

Имя регистра в долоте определенно можно найти в 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 }  

Как сохранить все имена переменных в долоте при создании кода verilog.
это важно для отладки волны.

1 Ответ

4 голосов
/ 28 марта 2019

Благодарим Вас за интерес к долоту!

Существует несколько причин, по которым имя может исчезать.

Постоянное распространение

По многим причинам, включая совместимость с существующими инструментами САПР, производительность и возможность отладки Verilog, Chisel (фактически компилятор FIRRTL под Chisel) будет распространять константы и прямые проводные соединения. Например:

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. Из-за причин реализации по умолчанию Чизель может называть только «верхний уровень» 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

Мы можем исправить вышеуказанную проблему с помощью экспериментальной функции под названием @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 либо в долоте, либо в FIRRTL.

Не трогай

Вы также можете использовать 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
...