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"
}
}