FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

OpenSPARC T1の調査(2. ModelSimによるシミュレーション→フェッチが出ず)

前回に引き続いて、OpenSPARC T1のシミュレーションを走らせていたが、それっぽい動作をしたものの、イマイチ有益なログを出さずにシミュレーションが終了してしまった。

f:id:msyksphinz:20170226082556p:plain

$ tree .
.
├── bypass_win:model_core1:core1_mini:0
│   ├── diag.s
│   ├── efuse.img
│   ├── flist
│   ├── history.sims
│   ├── perf.log
│   ├── raw_coverage
│   ├── sim.log
│   ├── sim.perf.log
│   ├── sim_command
│   ├── sims.log
│   ├── spd_single_dimm.data
│   ├── spd_stack_dimm.data
│   ├── status.log
│   ├── transcript
│   └── vlog.log
├── flist
├── history.sims
├── ihit_sameset:model_core1:core1_mini:0
│   ├── sim_command
│   └── sims.log
├── imiss_sameset:model_core1:core1_mini:0
├── lock
├── master_diaglist.core1_mini
├── sims.log
└── tre
    ├── sims.iver
    └── sims.tver_0

シミュレーション中に大量のエラーを出しているのが気になる。

# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/ciop_iob.v(328): Cannot execute undefined system task/function '$iob_jdriver'
# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/bw_sys.v(99): Cannot execute undefined system task/function '$pc_trigger_event'
# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/ciop_iob.v(297): Cannot execute undefined system task/function '$iob_cdriver'
# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/pcx_stall.v(93): Cannot execute undefined system task/function '$pc_trigger_event'
# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/cpx_stall.v(100): Cannot execute undefined system task/function '$pc_trigger_event'

これはPLIを動かさないと駄目なのか。

$ ag pc_trigger_event

tools/pli/veriuser.c
173:    {usertask, 0, 0, 0, pc_trigger_call, 0, "$pc_trigger_event"},
  • tools/pli/iop/iop_main.cpp
void pc_trigger_call()
{
  switch(tf_getp(PC_TRIG_TY)){
  case 1 :// check for event
    int low, high;
    long long pc;
    low  = tf_getlongp(&high, PC_TRIG_PC);
    pc   = high;
    pc <<= 32;
    pc  |= low;
    if(pli_var.pc_event.hit_pc(pc)){
      while(pli_var.pc_event.which_event()){
        switch(pli_var.pc_event.one_event->type){
        case 1 :
          pli_var.pc_event.print(PC_TRIG_TH, PC_TRIG_WD);
          break;
        case 2 :
          pli_var.pc_event.print(PC_TRIG_TH, PC_TRIG_WD);
          break;
        case 3 :
          pli_var.l2.vld_counter  = pli_var.pc_event.one_event->wait;
          pli_var.l2.cpu          = tf_getp(PC_TRIG_CP);
          pli_var.l2.cpu_invalid  = 0;
          pli_var.l2.l2_bank      = 0xf;//set four bank
          pli_var.l2.cpu_invalid  = 0xff;//8 cpu
          pli_var.l2.cpu_invalid ^= tf_getp(PC_TRIG_AT);
          tf_putp(PC_TRIG_ST, 1);//start counter
          break;
        case WARMRST :
          pli_var.pc_event.set_warm();
          break;
        case EXTINT :
          pli_var.pc_event.set_extint(pli_var.pc_event.one_event->wait);
          break;
        case TEMPTRIG :
          pli_var.pc_event.set_temptrig(pli_var.pc_event.one_event->wait);
...

PLI群も整備しないと、何が起きているのか分からないなあ。。。