繁体   English   中英

FPGA-使用C / C ++进行CPU延迟测量

[英]FPGA - CPU Latency measurement with C/C++

我正在尝试测量同一块板上的ARM CPU和FPGA之间的读/写延迟。 我想知道使用全局计时器是否足以按时钟周期报告此延迟,因为ARM和FPGA以不同的频率运行。 我的情况是

    resetTimer();
    startTimer();
    for(i=0; i<1000; i++) { 
      T1 = readTimer();
      writeToFpgaIP(int* regAddress, int data);
      T2 = readTimer();
      storeInArray(T2-T1);
    }
    StopTimer();
    latency  = sum (array_write_timing[]) / 1000;
    -*-*-*-End algo-*-*-*

根据所涉及的时间跨度(毫秒,微秒,纳秒),您可能会在readTimer调用中失去粒度。 一种更准确的方法是使用硬件探针和示波器。 在进入writeToFPGA例程时将测试点设置为高,在退出时将测试点设置为低。 较新的示波器可以为您平均脉冲宽度,但是即使您没有此功能,您也将看到绝对时间并感觉到变化。

更改算法使其更精确,

resetTimer();
startTimer();
T1 = readTimer();
for(i=0; i<1000; i++) { 
  writeToFpgaIP(int* regAddress, int data);
}
T2 = readTimer();
StopTimer();
latency  = (T1-T2) / 1000;

您可以尝试通过创建另一个模仿现有循环并对其计时的循环来衡量循环开销。 例如,如果writeToFpgaIP是一个函数,

  dummyCall(int* regAddress, int data){}
  dummyWrite(int* regAddress, int data){volatile int foo = data;}

dummyCall仅用于查看编译器函数的调用开销, dummyWrite比较FPGA总线与核心内存(或高速缓存)。 检查汇编器,以确保编译器尚未优化,然后再次检查它是否类似于基准循环。 您可能不得不摆弄编译器选项,以便与dummyCall一样构造带有dummyCall (或dummyWrite )的writeToFpgaIP

使用示波器是有益的,但是它只会在FPGA端测量时序。 您无法确定数据到达CPU / SOC引脚后发生什么情况。 因此,使用两种技术都可能是有益的。 确保他们互相确认。

如果不是这样,那么连接FPGA的端口/总线可能需要在ARM方面进行一些研究以改善访问。

无论readTimer()调用是如何实现的(可以是简单的本地外围设备读取),基准测试都是将关键写入与其他处理交织在一起的。 根据内核,这可能会显示一个周期(对于STR)。 等到循环再次出现时,STR可能已经完成。

您的基准不太可能代表您要解决的实际问题。 即使您在一个循环中重复执行STR 1000次,您仍然没有观察到实际的延迟,但是现在您正在查看流向FPGA的流带宽。

根据系统的不同,延迟意味着内核可以(从确定的事件)以多快的速度触发FPGA中的响应。 传统上,这可能是IRQ,将一些数据传递给FPGA,返回响应,写入外设(除非是由FPGA驱动引脚)。

更好的方法可能是将数据写入FPGA,回读FPGA寄存器(易失性,器件区域),使用数据并将其放入循环中。

取决于设备存储系统,这可能仍未给出与系统性能相关的结果(例如,Cortex-R8,Cortex-M0将在非常不同的系统中)。

我倾向于不使用外部示波器或逻辑分析仪,而是向FPGA添加性能测量。 这样,我可以测量处理来自CPU的请求的总周期数和平均周期数,也可以通过执行背对背请求并测量经过的总周期数来测量CPU开销。 我经常还会测量在任一方向上传输的数据量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM