This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:CLA 流水线写读取冲突

Guru**** 2802915 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1611841/tms320f28379d-cla-pipeline-write-read-conflict

部件号: TMS320F28379D

您好:

该问题与 CLA 流水线中潜在的写读取冲突有关。

使用同一浮点寄存器 (MRx) 时、写指令后跟读指令是否会导致潜在冲突、或者仅在使用相同地址(或从属地址)时冲突才相关?

请考虑以下代码:

  MMOV16 *MAR0, MR1               ;旧 MR1 应写入第一个地址

  MMOVZ16 MR1、@_cla_current21      ;第二个(不同)地址应加载到 MR1(新)

 

这里是否存在冲突、因为两个指令都使用 MR1? @由于流水线顺序、新的 MR1(包含 μ S_CLA_current21 的内容)可能会存储在*MAR0 中、而不是存储在旧的 MR1 内容中吗?

如果这里确实存在冲突、应使用多少个中间指令(或 MNOP)来避免这里的冲突?  

 

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dvir、

    这是后一种情况。  也就是说、如果用户有两条指令、即第一次写入存储器位置 A、第二次读取从存储器位置 A;根据流水线、读取发生在写入之前、因此会出现先读后写入的风险。 从属寄存器也是如此。 对于 C28x、流水线会自动暂停读取、直到写入发生、但 CLA 流水线不会...因此在编写 CLA 汇编代码时需要小心。  

    但是、在编写 C 代码时、您实际上看不到这些问题/差异。

    3 指令应分隔任何此类读写序列。  TRM 的 CLA 一章对此进行了介绍。   

    此致、

    Lori

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢 Lori!

    所以、为了确保 这一点、如果我正确理解、我分享的示例中没有写读冲突/问题、这里有两个不同的存储器位置、但指令中有相同的浮点寄存器 (MR1)。

    代码示例:

      MMOV16 *MAR0, MR1               ;旧 MR1 应写入第一个地址

      MMOVZ16 MR1、@_cla_current21      ;第二个(不同)地址应加载到 MR1(新)

    谢谢、

    Dvir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只是为了澄清,我担心的是,新的 MR1 将存储到*MAR0 中,而不是预期的旧 MR1。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正确、Dvir。 MR1 寄存器没有读取/写入冲突。

    旁注:CLA 一章的 TRM 中列出了流水线冲突。 此外,如果代码生成工具可以检测到类似 MR1 的情况,它将作为错误或警告向用户提供反馈。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你 Lori 的帮助,这是非常感谢。