Это немного измененная версия примера HelloWorld.scala из https://github.com/freechipsproject/chisel3/wiki/Frequent-Asked-Questions
// 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, а затем проверяю для генерации 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
$fwrite(32'h80000002,"hello, world!\n");
- person FabienM   schedule 13.02.2020