zoukankan      html  css  js  c++  java
  • PCIE_DMA:xapp1052学习笔记

    Moselsim仿真:

        

        EP为Endpoint部分实现代码,即例程主代码。其他的是搭建的仿真环境,主要目的是仿照驱动的行为,将PCIE软核用起来,主要是做PC端的行为仿真,如DMA配置,DMA读写操作及主时钟,复位等。加入testbench后结构如上图。

        board:顶层文件+系统复位

        RP:Root complex的部分。其中rport就是PCIE端口部分;rx_usrapp是RX部分,负责发送数据;tx_usrapp是TX部分,负责接收数据;cfg_usrapp是配置部分,配置读写使能,错误控制等,还有一些常用的任务方便其他模块调用;com_usrapp是加载RX/TX文件,把RX/TX的数据以dat文件形式保存,需要时加载/覆盖。pl_usrapp物理层控制和状态部分。

        CLK_GEN_RP/EP:分别是两个端口的时钟产生信号。

        其实EP和RP的结构很像的,基本都是对应的关系,所以理解起来工作量不是很大。

    语法笔记:

        因为CLK_GEN_RP/EP很简单,没有什么扒的必要,所以分分钟掠过了。接下来是对RP(testbench)的一些平时没见过的语法的笔记。

        1.module xxx #(

                  parameter  xxxx1 = xx,

                  parameter      xxxx2 = xx,

                  ......

                )

                (

                  input          xxxxxx,

                  output        xxxx,

                   .......

                );

          这个是正常的模块定义。其中前面一个括号是为参数传递准备的定义,后面那个括号就是常见的输入输出端口定义。

         xxx #(

                  .xxxx1 ( xx),

                  .xxxx2 (xx),

                  ......

                )

                module_usrname(

                  .xxxxxx(xxxxxxx),

                  .xxxx(xxxx),

                   .......

                );

          这个是调用模块xxx的语句,其中前面一个括号用于参数传递,后面一个括号用于输入输出端口的引用。

         2.rport中,对RP的BAR0-BAR5有明确的定义需要记录下:      

          BAR0 = 32'hffffff00,
          BAR1 = 32'hffff0000,
          BAR2 = 32'hffff000c,
          BAR3 = 32'hffffffff,
          BAR4 = 32'h00000000,
          BAR5 = 32'h00000000,

         3.rx_usrapp中的output分别是trn_rdst_rdy_n和trn_rnp_ok_n,这两个信号是由ramdom产生的。不过原来的代码里面trn_rdst_rdy_n是始终为0的,实际加入DMA操作的时候可以用trn_rdst_rdy_toggle_count来控制使其有效。其中的状态机通过调用usrapp_com中的任务来进行RX中数据的store。

         4.调用TASK方法:

          eg: board.RP.com_usrapp.TSK_READ_DATA(0, `RX_LOG, trn_rd, trn_rrem_n);——是指调用board-RP-com_usrapp里面的 TSK_READ_DATA任务,其中括号里面的是传递变量,按照usrapp里面TSK_READ_DATA定义里面的input顺序来传递变量。

         5.$value$plusargs:将运行命令(run-options)中的参数值传递给指定的信号或者字符
          用法:

            if ($value$plusargs("TESTNAME=%s", testname))
            $display("Running test {%0s}......", testname);

            则,当使用的运行命令为:<run-options>+TESTNAME=tst_name时,运行结果为:Running test {tst_name}......

          6.如果想把DMA功能用起来,自行调用pci_exp_usrapp_tx.v中的函数,往DMA控制寄存器中写入地址、长度等数据,然后启动DMA读或者写。

  • 相关阅读:
    数据结构 链表笔记
    C语言 字符串操作 笔记
    数据结构 排序算法 笔记
    链表详解
    mysql常用命令
    图片压缩工具之grunt-contrib-imagemin
    正则表达式
    阿里云部署nodejs服务器(windows)
    canvas简介
    js面向对象
  • 原文地址:https://www.cnblogs.com/daisyuer/p/6669616.html
Copyright © 2011-2022 走看看