main.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <stdio.h>
  2. #include "insn.h"
  3. #include "nuclei_sdk_soc.h"
  4. // TODO this is vnice internal region private address
  5. #define VNICE_PRIVATE_ADDR 0x0
  6. int main(void)
  7. {
  8. int ret = 0;
  9. uint32_t array_normal_in1[DATASIZE] = {0};
  10. uint32_t array_normal_in2[DATASIZE] = {0};
  11. uint32_t array_normal_out[DATASIZE] = {0};
  12. uint32_t array_vnice_in1[DATASIZE] = {0};
  13. uint32_t array_vnice_in2[DATASIZE] = {0};
  14. // unsigned int array_vnice_addr[DATASIZE] = {0};
  15. uint32_t array_vnice_out[DATASIZE] = {0};
  16. uint32_t initdata = 0;
  17. uint32_t begin_instret, end_instret, instret_normal, instret_vnice;
  18. uint32_t begin_cycle, end_cycle, cycle_normal, cycle_vnice;
  19. __RV_CSR_SET(CSR_MSTATUS, MSTATUS_XS);
  20. __enable_minstret_counter();
  21. __enable_mcycle_counter();
  22. printf("1. Set array_normal_in1 array_normal_in1 array_vnice_in1 array_vnice_in2\r\n");
  23. for (int i = 0; i < DATASIZE; i++) {
  24. initdata = (i%16) + ((i%16) << 8) + ((i%16) << 16) + ((i%16) << 24);
  25. array_normal_in1[i] = initdata;
  26. array_normal_in2[i] = initdata;
  27. array_vnice_in1[i] = initdata;
  28. array_vnice_in2[i] = initdata;
  29. }
  30. printf("2. Do reference vector complex mul, store, load\r\n");
  31. begin_instret = __get_rv_instret();
  32. begin_cycle = __get_rv_cycle();
  33. normal_case(array_normal_in1, array_normal_in2, array_normal_out);
  34. end_instret = __get_rv_instret();
  35. end_cycle = __get_rv_cycle();
  36. instret_normal = end_instret - begin_instret;
  37. cycle_normal = end_cycle - begin_cycle;
  38. printf("3. Do vector nice complex mul, store, load\r\n");
  39. begin_instret = __get_rv_instret();
  40. begin_cycle = __get_rv_cycle();
  41. vnice_case(array_vnice_in1, array_vnice_in2, VNICE_PRIVATE_ADDR, array_vnice_out);
  42. end_instret = __get_rv_instret();
  43. end_cycle = __get_rv_cycle();
  44. instret_vnice = end_instret - begin_instret;
  45. cycle_vnice = end_cycle - begin_cycle;
  46. printf("4. Compare reference and vnice result\r\n");
  47. if (compare_result(array_normal_out, array_vnice_out) == 0) {
  48. printf("PASS\r\n");
  49. } else {
  50. printf("FAIL\r\n");
  51. ret = 1;
  52. }
  53. printf("5. Performance summary\r\n");
  54. printf("\t normal: \r\n");
  55. printf("\t instret: %lu, cycle: %lu\r\n", instret_normal, cycle_normal);
  56. printf("\t vnice : \r\n");
  57. printf("\t instret: %lu, cycle: %lu\r\n", instret_vnice, cycle_vnice);
  58. return ret;
  59. }