Это слегка измененная версия HelloWorld. scala пример из https://github.com/freechipsproject/chisel3/wiki/Frequently-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, а затем 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