Я пытаюсь следовать примеру здесь: https://github.com/freechipsproject/chisel3/wiki/Printing-in-Chisel#custom -принтинг
Как и в примере, я переопределил def toPrintable: Printable
с конкатенацией p"..." +
строк.
В моем scala файле я
import chisel3._
Но я получаю Scala предупреждения компиляции, что он не знает, что такое Printable
, и не знает, что делать с p
интерполятор, который заставляет меня думать, что у меня нет нужного импорта.
Есть ли что-то, что мне нужно импортировать, кроме chisel3 ._?
Вот немного больше информации о том, что я я делаю и какую ошибку я получаю. Я изменяю этот файл: https://github.com/chipsalliance/rocket-chip/blob/e6a6c67f30d668e702ddbef93789e9b4f709b237/src/main/scala/tilelink/Bundles.scala
Вот что я добавил:
...
import Chisel._
import chisel3.{Printable}
...
final class TLBundleA(params: TLBundleParameters)
extends TLBundleBase(params) with TLAddrChannel
{
...
override def toPrintable: Printable = {
p"A:\t" +
p"opcode[${opcode}]\t" +
p"param[${param}]\t" +
p"size[${size}]\t" +
p"source[${source}]\t" +
p"address[${address}]\t" +
p"user[${user}]\t" +
p"mask[${mask}]\t" +
p"data[${data}]\t" +
p"corrupt[${corrupt}]\n"
}
}
Кажется, что (в отличие от import chisel3._
), import.chisel3.{Printable}
работает, но я не делаю что-то правильно с p"..."
. Я получаю эту серию ошибок:
[error] rocket-chip/src/main/scala/tilelink/Bundles.scala:189:5: value p is not a member of StringContext
[error] p"A:\t" +
[error] ^
[error] rocket-chip/src/main/scala/tilelink/Bundles.scala:190:5: value p is not a member of StringContext
[error] p"opcode[${opcode}]\t" +
[error] ^
...
[error] rocket-chip/src/main/scala/tilelink/Bundles.scala:198:5: value p is not a member of StringContext
[error] p"corrupt[${corrupt}]\n"
[error] ^
[error] 10 errors found
[error] (Compile / compileIncremental) Compilation failed
РЕДАКТИРОВАТЬ В ОБНОВЛЕНИЕ: После просмотра источника Chisel3 я добавил import chisel3.{Printable, PrintableHelper}
, и теперь я получаю новую ошибку, которая выглядит, как будто я просто испортил свою строку :
[error] (run-main-0) java.lang.IllegalArgumentException: requirement failed
[error] java.lang.IllegalArgumentException: requirement failed
[error] at scala.Predef$.require(Predef.scala:268)
[error] at chisel3.printf$.escaped$1(Printf.scala:28)
[error] at chisel3.printf$.$anonfun$format$3(Printf.scala:32)
[error] ocketchiat chisel3.printf$.$anonfun$format$3$adapted(Printf.scala:32)
[error] at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:238)
[error] at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
[error] at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
[error] at scala.collection.immutable.StringOps.foreach(StringOps.scala:33)
[error] at scala.collection.TraversableLike.map(TraversableLike.scala:238)
[error] at scala.collection.TraversableLike.map$(TraversableLike.scala:231)
[error] at scala.collection.immutable.StringOps.map(StringOps.scala:33)
[error] at chisel3.printf$.format(Printf.scala:32)
[error] at chisel3.internal.firrtl.Emitter.emit(Emitter.scala:75)
[error] at chisel3.internal.firrtl.Emitter.$anonfun$moduleDefn$4(Emitter.scala:140)
РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ: я добавил больше подробностей к требованию в коде printf
, и я думаю, что он не любит вкладки (\t
):
[error] (run-main-0) java.lang.IllegalArgumentException: requirement failed: char to Int 9 must be >= 32
[error] java.lang.IllegalArgumentException: requirement failed: char to Int 9 must be >= 32
EDIT TO UPDATE:
Я изменил chisel3
, чтобы он был в порядке с вкладками, и теперь код компилируется и запускается, но это одна из результирующих строк verilog, которая, очевидно, не верна. Я пробовал импорт строки string2Printable, который вы предложили, но все равно получаете следующее:
freechips.rocketchip.system.DefaultConfig.v: $fwrite(32'h80000002,"PLIC_TL_IFC A:\tPrintables(ArrayBuffer(PString(opcode[), Decimal(UInt<3>(IO in unelaborated TLMonitor)), PString(]\t)))Printables(ArrayBuffer(PString(param[), Decimal(UInt<3>(IO in unelaborated TLMonitor)), PString(]\t)))Printables(ArrayBuffer(PString(size[), Decimal(UInt<2>(IO in unelaborated TLMonitor)), PString(]\t)))Printables(ArrayBuffer(PString(source[), Decimal(UInt<9>(IO in unelaborated TLMonitor)), PString(]\t)))Printables(ArrayBuffer(PString(address[), Decimal(UInt<28>(IO in unelaborated TLMonitor)), PString(]\t)))Printables(ArrayBuffer(PString(user[), PString(None), PString(]\t)))Printables(ArrayBuffer(PString(mask[), Decimal(UInt<8>(IO in unelaborated TLMonitor)), PString(]\t)))Printables(ArrayBuffer(PString(data[), Decimal(UInt<64>(IO in unelaborated TLMonitor)), PString(]\t)))Printables(ArrayBuffer(PString(corrupt[), Decimal(Bool(IO in unelaborated TLMonitor)), PString(]\n)))"); // @[Monitor.scala 577:40:freechips.rocketchip.system.DefaultConfig.fir@64082.10]
freechips.rocketchip.system.DefaultConfig.v: $fwrite(32'h80000002,"PLIC_TL_IFC TLBundleD(opcode -> %d, param -> %d, size -> %d, source -> %d, sink -> %d, denied -> %d, data -> %d, corrupt -> %d)",io_in_d_bits_opcode,2'h0,io_in_d_bits_size,io_in_d_bits_source,1'h0,1'h0,io_in_d_bits_data,1'h0); // @[Monitor.scala 578:40:freechips.rocketchip.system.DefaultConfig.fir@64090.10]
Для справки, вот тот участок вызова, на котором я на самом деле звоню:
when (bundle.a.fire()) { printf(p"$prefix ${bundle.a.bits}")}
when (bundle.d.fire()) { printf(p"$prefix ${bundle.d.bits}")}
Обратите внимание на bundle.d.bits
выглядит "хорошо", потому что я не дал ей специфическую c функцию toPrintable, но bundle.a.bits
беспорядок.
РЕДАКТИРОВАТЬ: РАЗРЕШЕНО
Проблема в том, что я изменил свой toPrintable в процессе отладки она будет иметь вид
override def toPrintable: Printable = {
"A:\t" +
p"opcode[$opcode]\t" +
...
p"corrupt[$corrupt]\n"
}
}
Первая строка un- p
делает остальные из них просто обычными строками, игнорируя p
. Я положил первый p"A:\t"
обратно, и теперь он корректно интерполируется.