Chisel 在3中,对于可打印的示例,我需要什么导入?

Chisel 在3中,对于可打印的示例,我需要什么导入?,chisel,Chisel,我在这里试着效仿这个例子: 如本例中所示,我使用p“…”+字符串的串联覆盖了def toPrintable:Printable 在我的scala文件中,我 import chisel3._ 但我收到Scala compile警告,它不知道什么是Printable,也不知道如何使用p插值器,这让我觉得我没有正确的导入 除了凿子3之外,还有什么我需要导入的吗 这里有一些关于我正在做什么以及我遇到了什么错误的更多信息。 我正在修改此文件: 以下是我补充的内容: ... import Chisel

我在这里试着效仿这个例子:

如本例中所示,我使用
p“…”+
字符串的串联覆盖了
def toPrintable:Printable

在我的scala文件中,我

import chisel3._
但我收到Scala compile警告,它不知道什么是
Printable
,也不知道如何使用
p
插值器,这让我觉得我没有正确的导入

除了凿子3之外,还有什么我需要导入的吗

这里有一些关于我正在做什么以及我遇到了什么错误的更多信息。 我正在修改此文件:

以下是我补充的内容:

...
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.kiffe3.
),
import.kiffe3.{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
编辑以更新: 在查看了3的来源之后,我补充说
import3.{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
代码中对requires添加了更详细的内容,我认为它不喜欢选项卡(
\t
):

编辑以更新:

我修改了
凿子3
,使之可以使用制表符,现在代码可以编译并运行,但这是生成的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]
注意,
bundle.d.bits
看起来“正常”,因为我没有给它一个特定的toPrintable函数,但是
bundle.a.bits
是一团乱

编辑:已解决

问题是我在调试过程中将TopPrintable更改为

  override def toPrintable: Printable = {
    "A:\t" +
    p"opcode[$opcode]\t" +
    ...
    p"corrupt[$corrupt]\n"
  }
}

第一个un-
p
字符串使其余字符串成为普通字符串,忽略
p
。我把第一个
p“A:\t”
放回原处,现在它插值正确。

导入凿子3.\u应该足够了。尝试查看3回购协议中的示例,例如。如果这样做没有帮助,您可以显示错误消息。

正如Chick所说,这应该是可行的。你能分享更多关于你的环境吗?您使用的是什么版本的凿子3?我已经更新了更多的细节,感谢您的跟进。我明白了,所以它会有点难看,但是自定义字符串插值器(如
p“…”
)是使用
隐式实现的。您可以显式导入隐式:
导入凿子3.PrintableHelper
,您可能还应该导入凿子3.string2Printable
,尽管可能不需要这样做,但这也是我使用的凿子版本:
*060b421-(13天前)修复了注释(#1294)(#1313)-mergify[bot]中的代码示例打字错误(origin/3.2.x)
        when (bundle.a.fire()) { printf(p"$prefix ${bundle.a.bits}")}
        when (bundle.d.fire()) { printf(p"$prefix ${bundle.d.bits}")}
  override def toPrintable: Printable = {
    "A:\t" +
    p"opcode[$opcode]\t" +
    ...
    p"corrupt[$corrupt]\n"
  }
}