原创 BAR空间扫描子程序学习(TSK_BAR_SCAN)

2019-8-8 12:59 3425 20 20 分类: FPGA/CPLD 文集: Xilinx PCIe仿真模型
前面博文有介绍在仿真测试功能代码里前面几步分别是设置仿真时间(以防止仿真被无休止挂起)、系统初始化(等待复位被释放以及链路链接ok)、BAR空间初始化等等。其中在BAR初始化子函数里调用了本文要介绍的BAR空间扫描子程序,其具体代码是:
  1. /************************************************************
  2. Task : TSK_BAR_SCAN
  3. Inputs : None
  4. Outputs : None
  5. Description : Scans PCI core's configuration registers.
  6. *************************************************************/
  7. task TSK_BAR_SCAN;
  8. begin
  9. //--------------------------------------------------------------------------
  10. // Write PCI_MASK to bar's space via PCIe fabric interface to find range
  11. //--------------------------------------------------------------------------
  12. P_ADDRESS_MASK = 32'hffff_ffff;
  13. DEFAULT_TAG = 0;
  14. DEFAULT_TC = 0;
  15. $display("[%t] : Inspecting Core Configuration Space...", $realtime);
  16. // Determine Range for BAR0
  17. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h10, P_ADDRESS_MASK, 4'hF);
  18. DEFAULT_TAG = DEFAULT_TAG + 1;
  19. TSK_TX_CLK_EAT(100);
  20. // Read BAR0 Range
  21. TSK_TX_TYPE0_CONFIGURATION_READ(DEFAULT_TAG, 12'h10, 4'hF);
  22. DEFAULT_TAG = DEFAULT_TAG + 1;
  23. TSK_WAIT_FOR_READ_DATA;
  24. BAR_INIT_P_BAR_RANGE[0] = P_READ_DATA;
  25. // Determine Range for BAR1
  26. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h14, P_ADDRESS_MASK, 4'hF);
  27. DEFAULT_TAG = DEFAULT_TAG + 1;
  28. TSK_TX_CLK_EAT(100);
  29. // Read BAR1 Range
  30. TSK_TX_TYPE0_CONFIGURATION_READ(DEFAULT_TAG, 12'h14, 4'hF);
  31. DEFAULT_TAG = DEFAULT_TAG + 1;
  32. TSK_WAIT_FOR_READ_DATA;
  33. BAR_INIT_P_BAR_RANGE[1] = P_READ_DATA;
  34. // Determine Range for BAR2
  35. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h18, P_ADDRESS_MASK, 4'hF);
  36. DEFAULT_TAG = DEFAULT_TAG + 1;
  37. TSK_TX_CLK_EAT(100);
  38. // Read BAR2 Range
  39. TSK_TX_TYPE0_CONFIGURATION_READ(DEFAULT_TAG, 12'h18, 4'hF);
  40. DEFAULT_TAG = DEFAULT_TAG + 1;
  41. TSK_WAIT_FOR_READ_DATA;
  42. BAR_INIT_P_BAR_RANGE[2] = P_READ_DATA;
  43. // Determine Range for BAR3
  44. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h1C, P_ADDRESS_MASK, 4'hF);
  45. DEFAULT_TAG = DEFAULT_TAG + 1;
  46. TSK_TX_CLK_EAT(100);
  47. // Read BAR3 Range
  48. TSK_TX_TYPE0_CONFIGURATION_READ(DEFAULT_TAG, 12'h1C, 4'hF);
  49. DEFAULT_TAG = DEFAULT_TAG + 1;
  50. TSK_WAIT_FOR_READ_DATA;
  51. BAR_INIT_P_BAR_RANGE[3] = P_READ_DATA;
  52. // Determine Range for BAR4
  53. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h20, P_ADDRESS_MASK, 4'hF);
  54. DEFAULT_TAG = DEFAULT_TAG + 1;
  55. TSK_TX_CLK_EAT(100);
  56. // Read BAR4 Range
  57. TSK_TX_TYPE0_CONFIGURATION_READ(DEFAULT_TAG, 12'h20, 4'hF);
  58. DEFAULT_TAG = DEFAULT_TAG + 1;
  59. TSK_WAIT_FOR_READ_DATA;
  60. BAR_INIT_P_BAR_RANGE[4] = P_READ_DATA;
  61. // Determine Range for BAR5
  62. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h24, P_ADDRESS_MASK, 4'hF);
  63. DEFAULT_TAG = DEFAULT_TAG + 1;
  64. TSK_TX_CLK_EAT(100);
  65. // Read BAR5 Range
  66. TSK_TX_TYPE0_CONFIGURATION_READ(DEFAULT_TAG, 12'h24, 4'hF);
  67. DEFAULT_TAG = DEFAULT_TAG + 1;
  68. TSK_WAIT_FOR_READ_DATA;
  69. BAR_INIT_P_BAR_RANGE[5] = P_READ_DATA;
  70. // Determine Range for Expansion ROM BAR
  71. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h30, P_ADDRESS_MASK, 4'hF);
  72. DEFAULT_TAG = DEFAULT_TAG + 1;
  73. TSK_TX_CLK_EAT(100);
  74. // Read Expansion ROM BAR Range
  75. TSK_TX_TYPE0_CONFIGURATION_READ(DEFAULT_TAG, 12'h30, 4'hF);
  76. DEFAULT_TAG = DEFAULT_TAG + 1;
  77. TSK_WAIT_FOR_READ_DATA;
  78. BAR_INIT_P_BAR_RANGE[6] = P_READ_DATA;
  79. end
  80. endtask // TSK_BAR_SCAN
查看代码,该子程序主要对几个BAR空间执行了一系列PCI Type0配置读和写,以此确定并获取Endpoint的每个BAR空间的存储器和IO操作要求。获取的信息存储在全局阵列变量BAR_INIT_P_BAR_RANGE[?]之中。注意这个函数只能在系统初始化函数之后被调用。
代码中Type0读写配置函数的第二个参数对应于每个BAR的基地址,比如BAR0对应h'10。
BAR

作者: coyoo, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1010859.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

给作者打赏,鼓励TA抓紧创作!

赞赏支持
点赞 20
赞赏0

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
20
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /6 下一条