ошибка chisel printf (построена с использованием chisel3, а затем верификатора на C ++)

Это немного измененная версия примера 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

person Daniel    schedule 13.02.2020    source источник
comment
Я попытался выпустить источник Verilog. Я вижу, что вам нужно определить макрос `PRINTF_COND. Я думаю, вы можете определить это в командной строке компилятора вашего верилятора.   -  person FabienM    schedule 13.02.2020
comment
Но у меня в команде printf verilog странное имя файла: $fwrite(32'h80000002,"hello, world!\n");   -  person FabienM    schedule 13.02.2020
comment
Я понял: printf () происходит только на восходящих часах, поэтому жгут C ++, обернутый вокруг кода верилятора, должен явно: (1) понижать тактовую частоту, (2) eval (), (2) повышать тактовую частоту, (3) eval (), а затем printf () напечатает. (На самом деле я не уверен, что (2) требуется, но было бы странно не делать этого.) Обратите внимание, что в примерах верилятора не показано, что это делает оснастка C ++.   -  person Daniel    schedule 14.02.2020
comment
Вы можете опубликовать ответ на свой вопрос. Предлагаю сделать это, чтобы прояснить, что на вопрос действительно дан ответ.   -  person Scott McPeak    schedule 15.02.2020


Ответы (1)


Я понял: printf () происходит только на восходящих часах, поэтому жгут C ++, обернутый вокруг кода верилятора, должен явно: (1) понижать тактовую частоту, (2) eval (), (2) повышать тактовую частоту, (3) eval (), а затем printf () напечатает. (На самом деле я не уверен, что (2) требуется, но было бы странно не делать этого.)

В своем комментарии выше я сказал, что в примерах верилятора не показано, что жгут C ++ делает это, однако в более сложном примере и более сложным образом они это делают.

person Daniel    schedule 15.02.2020