原创 创建PCIe空间映射子函数

2019-8-8 15:19 1338 8 8 分类: FPGA/CPLD 文集: Xilinx PCIe仿真模型
BAR初始化第一步,即BAR_SCAN子函数了解完了,下面我们了解初始化第二步,即TSK_BUILD_PCIE_MAP函数。再次复习下BAR初始化步骤(在TSK_BAT_INIT任务里面其实是在模拟BIOS和驱动程序的操作,首先会对BAR寄存器进行赋值,然后会对BAR指向的设备内存进行IO或者mem映射,最后就是对设备的配置寄存器的参数写入。):
  1. /************************************************************
  2. Task : TSK_BAR_INIT
  3. Inputs : None
  4. Outputs : None
  5. Description : Initialize PCI core based on core's configuration.
  6. *************************************************************/
  7. task TSK_BAR_INIT;
  8. begin
  9. TSK_BAR_SCAN;
  10. TSK_BUILD_PCIE_MAP;
  11. TSK_DISPLAY_PCIE_MAP;
  12. TSK_BAR_PROGRAM;
  13. end
  14. endtask // TSK_BAR_INIT

TSK_BUILD_PCIE_MAP源代码有点长,这里就不贴了。其主要目的就是执行存储器或I/O映射算法,并依据Endpoint需求分配Memory 32、Memory 64和I/O空间。具体来说,就是根据上一步TSK_BAR_SCAN得到的各个BAR的range变量,检查这些range,根据检查结果,判断每个BAR是否被使能、及其对应的映射结果(是MEM32啊还是MEM64啊,或者是I/O空间)。仿真的时候会将检查结果打印如下:

:函数TSK_BUILD_PCIE_MAP在检查正常的时候只会打印上图中的第一句;下面每个BAR空间的检查结果,是在调用函数TSK_DISPLAY_PCIE_MAP的时候打印的。

BAR空间初始化最后一步,看似就是将之前读回的BAR状态重新使用Type0配置写再写回去(这里应该对应应用程序里的BAR空间基地址的产生,电脑开机扫描获取PCIe的各个BAR的信息,为它们分配地址空间,这里的Program应该是将分配好的地址空间基地址重新写回到BAR寄存器),比如对BAR0的写:

  1. // Program BAR0
  2. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h10, BAR_INIT_P_BAR[0][31:0], 4'hF);
  3. DEFAULT_TAG = DEFAULT_TAG + 1;
  4. TSK_TX_CLK_EAT(100);

这个子函数还对其它BAR空间进行Type0配置写,个人觉得,其它BAR空间都Disable了,写不写都无所谓。值得注意的时候,该子函数最后还对PCI命令寄存器和PCIe器件控制寄存器进行了编程:
  1. // Program PCI Command Register
  2. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h04, 32'h00000003, 4'h1);
  3. DEFAULT_TAG = DEFAULT_TAG + 1;
  4. TSK_TX_CLK_EAT(100);
  5. // Program PCIe Device Control Register
  6. TSK_TX_TYPE0_CONFIGURATION_WRITE(DEFAULT_TAG, 12'h68, 32'h0000005f, 4'h1);
  7. DEFAULT_TAG = DEFAULT_TAG + 1;
  8. TSK_TX_CLK_EAT(1000);
注意上述两次写和BAR0写的区别,比如最后一个参数为4‘h1,则表示只有最低字节被Enable了,即只需传递低8位即可。

了解完BAR空间的初始化,后面开始了解正常的PIO仿真,即存储器写和存储器读。

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

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

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

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

赞赏支持
点赞 8
赞赏0

文章评论0条评论)

登录后参与讨论
相关推荐阅读
coyoo 2020-04-13 15:19
用SI9000控制阻抗,并得出各种叠层走线参数
1、差分表层(1B)2、差分内层(1B2A)3、差分内层(2B1A)4、单端表层(1B)5、单端内层(1B2A)6、单端内层(2B1A)7、未命名...
coyoo 2020-04-01 15:29
中国进出口商品运输路线图-2011年
试试翻转下:...
coyoo 2020-03-31 11:38
LTspice导入其它厂家器件现有的spice模型
最近在使用LTspice仿真由三极管搭建的放大电路,在选用罗姆的三极管2SC4083的时候,从罗姆的官网下载了其spice模型文件,这个文件后缀是lib。这里介绍一种方法导入我下载到的lib文件,该l...
coyoo 2020-03-20 14:54
共基极放大器,共基极放大器放大电路 (转)
共基极放大器,共基极放大器放大电路 交流信号电压叠加在直流电压上,使晶体管基极、发射极之间的正向电压发生变化,通过晶体管的控制作用,使集电极电流有更大的变化,它的变量在集电极电阻上产生大的电压变量,...
coyoo 2019-10-31 17:09
FPGA Based TDC的编码器
编码方法: 顺序查找:利用for循环,从tc的第0位依次遍历到第一个0-1(或1-0)跳变的位置,输出跳变处的位置序号,完成编码。顺序查找法比较直观,无需任何外加电路就可以抑制bubble现...
coyoo 2019-10-31 09:56
码密度测试
FPGA芯片中,受到布局布线以及PVT的影响,无法使得每个延迟单元的延迟时间完全一致,更重要的问题在于我们需要获取每个延迟单元的bin-width,此时可以采用码密度测试来获取每个延迟单元的bin w...
广告
我要评论
0
8
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /7 下一条