Refer to Github Discussion #217: https://github.com/bol-edu/HLS-SOC-Discussions/discussions/217#discussioncomment-9357134 下面介紹 DMA 設計的考量: 1. HLS design 不應該用 hardwire constant, e.g. BUF_LEN。這樣的設計就只能傳 固定大小的data。若是 FIR data size 改變,豈不要修改硬體設計。所以 while (final_s2m_len < BUF_LEN) 這個 loop 要拿掉。 2. userDMA 是需要指定需要傳輸的資料量 (在 argument list 中, 用 axilite 的configuration cycle 指定)。而 FIR IP 需要用 axi-stream中 的 tlast 信號告知這個 frame 的運算結束了。 這有幾個可能的做法 1. 在 axi-stream-in 要用 tlast, testbench 或 userDMA 的 m2s (memory-to-stream)的最後一筆data,assert tlast。FIR 收到 tlast 知道這是最後一筆data, 在 Y output 的最後一筆 data, assert tlast。 2. 或 FIR 有設定 (axilite program)data-length, 在 Y 送出最後 data 時, assert tlast。 3. userDMA 需要設計的更 robust, 絕對不能把系統 當掉,即使 FIR 多送,或少送 data (也就是 tlast 提早)。 - 多送的 data, 即 tlast 超過 DMA 設定的 Len。多送的data, 就 drop 掉。但要記錄在 status 中。這樣 software 才知道系統發生了什麼事。 - 少送了 data, 即 tlast 提早送出。DMA 必須正常結束,但需要把 error flag, 及傳輸的資量記錄在 status 中,提供給 software. 4. DMA 結束的情況 有以下兩種情形 1. 傳輸了指定的資料量後, 若是 steam-in 不管 tlast 是否有 assert, 若是 stream-out, 需要assert tlast。 2. 當 stream-in 時,收到 tlast。 不關是否到達 指定的傳輸量 處理方式 1. 設定 done status flag。並設定相關的 error status, e.g. stream-in less than specified len,or over. 2. 是否 舉起 interrupt。 以上是一個 well-behaved DMA 的 設計考量。