OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [sw/] [example/] [processor_check/] [main.c] - Diff between revs 62 and 63

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 62 Rev 63
Line 201... Line 201...
 
 
  // enable global interrupts
  // enable global interrupts
  neorv32_cpu_eint();
  neorv32_cpu_eint();
 
 
 
 
 
  // **********************************************************************************************
 
  // Run CPU and SoC tests
 
  // **********************************************************************************************
 
 
 
 
 
  // ----------------------------------------------------------
 
  // Test performance counter: setup as many events and counter as feasible
 
  // ----------------------------------------------------------
 
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
 
  PRINT_STANDARD("[%i] Configuring HPM events: ", cnt_test);
 
 
 
  num_hpm_cnts_global = neorv32_cpu_hpm_get_counters();
 
 
 
  if (num_hpm_cnts_global != 0) {
 
    cnt_test++;
 
 
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER3,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT3,  1 << HPMCNT_EVENT_CIR);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER4,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT4,  1 << HPMCNT_EVENT_WAIT_IF);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER5,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT5,  1 << HPMCNT_EVENT_WAIT_II);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER6,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT6,  1 << HPMCNT_EVENT_WAIT_MC);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER7,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT7,  1 << HPMCNT_EVENT_LOAD);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER8,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT8,  1 << HPMCNT_EVENT_STORE);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER9,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT9,  1 << HPMCNT_EVENT_WAIT_LS);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER10, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT10, 1 << HPMCNT_EVENT_JUMP);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER11, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT11, 1 << HPMCNT_EVENT_BRANCH);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER12, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT12, 1 << HPMCNT_EVENT_TBRANCH);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER13, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT13, 1 << HPMCNT_EVENT_TRAP);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER14, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT14, 1 << HPMCNT_EVENT_ILLEGAL);
 
 
 
    neorv32_cpu_csr_write(CSR_MCOUNTINHIBIT, 0); // enable all counters
 
 
 
    // make sure there was no exception
 
    if (neorv32_cpu_csr_read(CSR_MCAUSE) == 0) {
 
      test_ok();
 
    }
 
    else {
 
      test_fail();
 
    }
 
  }
 
  else {
 
    PRINT_STANDARD("skipped (n.a.)\n");
 
  }
 
 
 
 
  // ----------------------------------------------------------
  // ----------------------------------------------------------
  // Test standard RISC-V performance counter [m]cycle[h]
  // Test standard RISC-V performance counter [m]cycle[h]
  // ----------------------------------------------------------
  // ----------------------------------------------------------
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  PRINT_STANDARD("[%i] [m]cycle[h] counter: ", cnt_test);
  PRINT_STANDARD("[%i] [m]cycle[h] counter: ", cnt_test);
Line 363... Line 407...
    PRINT_STANDARD("skipped (n.a. without U-ext)\n");
    PRINT_STANDARD("skipped (n.a. without U-ext)\n");
  }
  }
*/
*/
 
 
 
 
/*
 
  // ----------------------------------------------------------
 
  // Execute MRET in U-mode (has to trap!)
 
  // ----------------------------------------------------------
 
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
 
  PRINT_STANDARD("[%i] MRET in U-mode: ", cnt_test);
 
 
 
  // skip if U-mode is not implemented
 
  if (neorv32_cpu_csr_read(CSR_MZEXT) & (1<<CSR_MZEXT_DEBUGMODE)) {
 
 
 
    cnt_test++;
 
 
 
    // switch to user mode (hart will be back in MACHINE mode when trap handler returns)
 
    neorv32_cpu_goto_user_mode();
 
    {
 
      asm volatile("mret");
 
    }
 
 
 
    if (neorv32_cpu_csr_read(CSR_MCAUSE) == TRAP_CODE_I_ILLEGAL) {
 
      test_ok();
 
    }
 
    else {
 
      test_fail();
 
    }
 
 
 
  }
 
  else {
 
    PRINT_STANDARD("skipped (n.a. without U-ext)\n");
 
  }
 
*/
 
 
 
 
 
  // ----------------------------------------------------------
  // ----------------------------------------------------------
  // Test performance counter: setup as many events and counter as feasible
  // Execute MRET in U-mode (has to trap!)
  // ----------------------------------------------------------
  // ----------------------------------------------------------
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  PRINT_STANDARD("[%i] Configuring HPM events: ", cnt_test);
  PRINT_STANDARD("[%i] MRET in U-mode: ", cnt_test);
 
 
  num_hpm_cnts_global = neorv32_cpu_hpm_get_counters();
  // skip if U-mode is not implemented
 
  if (SYSINFO_CPU & (1<<SYSINFO_CPU_DEBUGMODE)) {
 
 
  if (num_hpm_cnts_global != 0) {
 
    cnt_test++;
    cnt_test++;
 
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER3,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT3,  1 << HPMCNT_EVENT_CIR);
    // switch to user mode (hart will be back in MACHINE mode when trap handler returns)
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER4,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT4,  1 << HPMCNT_EVENT_WAIT_IF);
    neorv32_cpu_goto_user_mode();
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER5,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT5,  1 << HPMCNT_EVENT_WAIT_II);
    {
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER6,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT6,  1 << HPMCNT_EVENT_WAIT_MC);
      asm volatile("mret");
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER7,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT7,  1 << HPMCNT_EVENT_LOAD);
    }
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER8,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT8,  1 << HPMCNT_EVENT_STORE);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER9,  0); neorv32_cpu_csr_write(CSR_MHPMEVENT9,  1 << HPMCNT_EVENT_WAIT_LS);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER10, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT10, 1 << HPMCNT_EVENT_JUMP);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER11, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT11, 1 << HPMCNT_EVENT_BRANCH);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER12, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT12, 1 << HPMCNT_EVENT_TBRANCH);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER13, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT13, 1 << HPMCNT_EVENT_TRAP);
 
    neorv32_cpu_csr_write(CSR_MHPMCOUNTER14, 0); neorv32_cpu_csr_write(CSR_MHPMEVENT14, 1 << HPMCNT_EVENT_ILLEGAL);
 
 
 
    neorv32_cpu_csr_write(CSR_MCOUNTINHIBIT, 0); // enable all counters
 
 
 
    // make sure there was no exception
    if (neorv32_cpu_csr_read(CSR_MCAUSE) == TRAP_CODE_I_ILLEGAL) {
    if (neorv32_cpu_csr_read(CSR_MCAUSE) == 0) {
 
      test_ok();
      test_ok();
    }
    }
    else {
    else {
      test_fail();
      test_fail();
    }
    }
 
 
  }
  }
  else {
  else {
    PRINT_STANDARD("skipped (n.a.)\n");
    PRINT_STANDARD("skipped (n.a. without U-ext)\n");
  }
  }
 
 
 
 
  // ----------------------------------------------------------
  // ----------------------------------------------------------
  // External memory interface test
  // External memory interface test
Line 645... Line 648...
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  neorv32_cpu_csr_write(CSR_MCAUSE, 0);
  PRINT_STANDARD("[%i] I_ILLEG (illegal instr.) EXC: ", cnt_test);
  PRINT_STANDARD("[%i] I_ILLEG (illegal instr.) EXC: ", cnt_test);
 
 
  cnt_test++;
  cnt_test++;
 
 
  asm volatile ("csrrw zero, 0xfff, zero"); // = 0xfff01073 : CSR 0xfff not implemented -> illegal instruction
  // invalid instruction: using x0=x0 OP x0 with invalid opcode
 
  CUSTOM_INSTR_R2_TYPE(0b0000000, x0, x0, 0b000, x0, 0b1111111);
 
 
  // make sure this has cause an illegal exception
  // make sure this has cause an illegal exception
  if (neorv32_cpu_csr_read(CSR_MCAUSE) == TRAP_CODE_I_ILLEGAL) {
  if (neorv32_cpu_csr_read(CSR_MCAUSE) == TRAP_CODE_I_ILLEGAL) {
    // make sure this is really the instruction that caused the exception
    // make sure this is really the instruction that caused the exception
    // for illegal instructions mtval contains the actual instruction word
    // for illegal instructions mtval contains the actual instruction word
    if (neorv32_cpu_csr_read(CSR_MTVAL) == 0xfff01073) {
    if (neorv32_cpu_csr_read(CSR_MTVAL) == 0x0000007f) {
      test_ok();
      test_ok();
    }
    }
    else {
    else {
      test_fail();
      test_fail();
    }
    }

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.