Благодарим Вас за интерес к долоту!
Существует несколько причин, по которым имя может исчезать.
Постоянное распространение
По многим причинам, включая совместимость с существующими инструментами САПР, производительность и возможность отладки 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