В Chisel3, какой импорт мне нужен для примеров для печати? - PullRequest
2 голосов
/ 21 января 2020

Я пытаюсь следовать примеру здесь: 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" обратно, и теперь он корректно интерполируется.

1 Ответ

1 голос
/ 21 января 2020

import chisel3._ должно быть достаточно. Попробуйте посмотреть примеры в репозитории Chisel3, такие как LFSR16. scala. Если это не поможет, вы можете показать сообщение об ошибке.

...