Есть некоторые сомнения, когда я изучаю Chisel в настоящее время.
Кажется, FIRRTL сделает некоторую оптимизацию для генерации кода Verilog.
И я пишу пример, и собираюсь его запустить.
Но я нахожу некоторые проблемы.
Мой пример кода (я просто беру его для эксперимента, поэтому он может быть странным):
class Example extends Module {
val io = IO(new Bundle {
val in = Input(UInt(16.W))
})
val x = RegInit(0.U(16.W))
val y = RegInit(0.U(16.W))
x := io.in
y := x
}
После создания файла fir я запускаю компилятор FIRRTL, чтобы увидеть, не вызывает ли он удаление мертвого кода.
======== Starting Transform DeadCodeElimination ========
[DCE] reg Example.x
[DCE] reg Example.y
Я узнал, что это можно решить с помощью API dontTouch:
class Example extends Module {
val io = IO(new Bundle {
val in = Input(UInt(16.W))
})
val x = RegInit(0.U(16.W))
val y = RegInit(0.U(16.W))
x := io.in
dontTouch(x)
y := x
}
Я проверяю с тем же потоком выше. Он по-прежнему получает тот же результат:
======== Starting Transform DeadCodeElimination ========
[DCE] reg Example.x
[DCE] reg Example.y
Вопросы:
(1) Я неправильно понимаю API dontTouch или использую его неправильно?
(2) значение x изменится с сигналом io.in, почему x рассматривается как неиспользуемая часть, а компилятор считает его мертвым кодом?