Tenstorrentが、オープンソースのRISC-VベクトルプロセッサOcelotを公開した。
トレースファイルの修正について、Generator内のコンフィグレーションを少しいじってみたのだが変化はなかった。
$ git diff diff --git a/generators/boom b/generators/boom --- a/generators/boom +++ b/generators/boom @@ -1 +1 @@ -Subproject commit b059b3b85b4bb4dbf44a9112c14d24945b3828cf +Subproject commit b059b3b85b4bb4dbf44a9112c14d24945b3828cf-dirty diff --git a/generators/chipyard/src/main/scala/config/BoomConfigs.scala b/generators/chipyard/src/main/scala/config/BoomConfigs.scala index 719eef0b..9362af2d 100644 --- a/generators/chipyard/src/main/scala/config/BoomConfigs.scala +++ b/generators/chipyard/src/main/scala/config/BoomConfigs.scala @@ -15,8 +15,10 @@ class MediumBoomConfig extends Config( new chipyard.config.AbstractConfig) class MediumBoomVecConfig extends Config( - new boom.common.WithVector(2) ++ // Add vector + new boom.common.WithVector(2) ++ // Add vector new boom.common.WithNMediumBooms(1) ++ // medium boom config + new boom.common.WithBoomCommitLogPrintf ++ + new boom.common.WithBoomBranchPrintf ++ new chipyard.config.AbstractConfig)
コア側のトレースファイルもspike-dasmが受け取れるようにしてみたのだが変化がない。
diff --git a/src/main/scala/exu/core.scala b/src/main/scala/exu/core.scala index 0cbcd32d..9194eb1f 100644 --- a/src/main/scala/exu/core.scala +++ b/src/main/scala/exu/core.scala @@ -1480,9 +1480,9 @@ class BoomCore(usingTrace: Boolean)(implicit p: Parameters) extends BoomModule // To allow for diffs against spike :/ def printf_inst(uop: MicroOp) = { when (uop.is_rvc) { - printf("(0x%x)", uop.debug_inst(15,0)) + printf("DASM(0x%x)", uop.debug_inst(15,0)) } .otherwise { - printf("(0x%x)", uop.debug_inst) + printf("DASM(0x%x)", uop.debug_inst) } }
波形自体は取得できたので、プログラムは動いたのだろう、何が起きているのかもう少し解析したいと思う。
とりあえず手っ取り早くトレースファイルを出力する方法は、上記のif
文を取り除いてダイレクトにトレースを出力することだろう。
generators/boom/src/main/scala/exu/core.scala
if (COMMIT_LOG_PRINTF) { var new_commit_cnt = 0.U for (w <- 0 until coreWidth) { val priv = RegNext(csr.io.status.prv) // erets change the privilege. Get the old one // To allow for diffs against spike :/ def printf_inst(uop: MicroOp) = { when (uop.is_rvc) { printf("(0x%x)", uop.debug_inst(15,0)) } .otherwise { printf("(0x%x)", uop.debug_inst) } } when (rob.io.commit.arch_valids(w)) { printf("%d 0x%x ", priv, Sext(rob.io.commit.uops(w).debug_pc(vaddrBits-1,0), xLen))
とりあえずCOMMIT_LOG_PRINTFを除去して問答無用で出力するようにする。
3つのテストケースで実行されている命令を確認する。
$ ag " v" rvv_int_arithmetic_1_3828467586_2.log
90:3 0x000000008000139c vsetivli s3, 4, e32, m1, ta, ma x19 0x0000000000000004 93:3 0x00000000800013a8 vslide1up.vx v24, v9, s3 98:3 0x00000000800013bc vslide1up.vx v9, v24, s3 101:3 0x00000000800013c8 vslide1up.vx v24, v9, s3 106:3 0x00000000800013dc vslide1up.vx v9, v24, s3 107:3 0x00000000800013e0 vmv.v.v v24, v9 112:3 0x00000000800013f4 vslide1up.vx v30, v26, s3 115:3 0x0000000080001400 vslide1up.vx v26, v30, s3 118:3 0x000000008000140c vslide1up.vx v30, v26, s3 123:3 0x0000000080001420 vslide1up.vx v26, v30, s3 124:3 0x0000000080001424 vmv.v.v v30, v26 127:3 0x0000000080001430 vmaxu.vx v30, v24, s5 130:3 0x000000008000143c vmv.x.s s0, v30 x 8 0xffffffff8acf763a 132:3 0x0000000080001444 vslide1down.vx v21, v30, zero 135:3 0x0000000080001450 vmv.x.s s0, v21 x 8 0x0000000071010810 137:3 0x0000000080001458 vslide1down.vx v30, v21, zero 140:3 0x0000000080001464 vmv.x.s s0, v30 x 8 0xffffffff8d41f927 142:3 0x000000008000146c vslide1down.vx v21, v30, zero 145:3 0x0000000080001478 vmv.x.s s0, v21 x 8 0x000000003d80261a 178:3 0x0000000080001b58 vsetivli s3, 4, e32, m1, ta, ma x19 0x0000000000000004 181:3 0x0000000080001b64 vslide1up.vx v9, v26, s3 184:3 0x0000000080001b70 vslide1up.vx v26, v9, s3 189:3 0x0000000080001b84 vslide1up.vx v9, v26, s3 194:3 0x0000000080001b98 vslide1up.vx v26, v9, s3 ...