chisel printf 失败(使用 chisel3 然后 Verilator 到 C++ 构建)
Posted
技术标签:
【中文标题】chisel printf 失败(使用 chisel3 然后 Verilator 到 C++ 构建)【英文标题】:chisel printf fail (built using chisel3 then verilator to C++) 【发布时间】:2020-02-13 07:54:32 【问题描述】:这是来自 https://github.com/freechipsproject/chisel3/wiki/Frequently-Asked-Questions 的 HelloWorld.scala 示例的略微修改版本
// say hello
package HelloWorld
import chisel3._
class HelloWorld extends Module
val io = IO(new Bundle
val halt = Output(Bool())
val may_halt = Input(Bool())
)
printf("hello, world!\n");
when (io.may_halt)
io.halt := true.B
.otherwise
io.halt := false.B
// code for building HelloWorld
object HelloWorld extends App
chisel3.Driver.execute(args, () => new HelloWorld)
我使用 chisel3 构建它,然后使用 verilator 生成 C++。这是 C++ 工具中有趣的部分:
VHelloWorld *top; // Instantiation of module
int main(int argc, char** argv)
Verilated::commandArgs(argc, argv); // Remember args
top = new VHelloWorld; // Create instance
printf("eval loop start\n");
long long cycle = 0;
for (; !Verilated::gotFinish(); ++cycle)
printf("\tcycle: %lld\n", cycle);
if (2 <= cycle)
printf("\t\tput io_may_halt = 1\n");
top->io_may_halt = 1;
top->eval(); // Evaluate model
if (top->io_halt)
printf("\t\tgot an io_halt, so halting\n");
break; // halt when we get the signal to do so
printf("eval loop stop\n");
top->final(); // Done simulating
delete top; // (Though this example doesn't get here)
return 0;
我运行它几个周期,然后发出停止信号。然而,“你好,世界!”消息永远不会出来。
HelloWorld.cppdir/HelloWorld.exe
eval loop start
cycle: 0
cycle: 1
cycle: 2
put io_may_halt = 1
got an io_halt, so halting
eval loop stop
【问题讨论】:
我尝试发出verilog源。我可以看到你必须定义宏'PRINTF_COND。我认为您可以在您的验证器编译命令行中定义它。 但是我在 printf verilog 命令中有一个奇怪的文件名:$fwrite(32'h80000002,"hello, world!\n");
我想通了:printf() 只发生在上升时钟上,因此包裹在验证器代码上的 C++ 线束必须明确地 (1) 将时钟驱动为低电平,(2) eval(), (2) 将时钟驱动为高电平,(3) eval(),然后 printf() 将打印。 (实际上我不确定(2)是必需的,但不这样做会很奇怪。)。请注意,验证器示例没有显示 C++ 工具执行此操作。
您可以发布自己问题的答案。我建议这样做是为了表明问题实际上已经得到了回答。
【参考方案1】:
我想通了:printf() 只发生在上升时钟上,所以包裹在验证器代码上的 C++ 线束必须明确地 (1) 将时钟驱动为低电平,(2) eval(),(2) 驱动时钟高,(3) eval(),然后 printf() 将打印。 (其实我不确定是否需要(2),但不这样做会很奇怪。)。
我在上面的评论中说过,验证器示例没有显示 C++ 工具这样做,但是在更复杂的示例和更复杂的方式中,它们会这样做。
【讨论】:
以上是关于chisel printf 失败(使用 chisel3 然后 Verilator 到 C++ 构建)的主要内容,如果未能解决你的问题,请参考以下文章
Chisel3-Intellij IDEA中使用sbt构建Chisel项目