Step 3 打開Analysis窗口,選擇state C1的write operation,右擊選擇Goto Source

?
狀態C1下的寫操作是由于代碼在Product loop前就已經設置res為0。因為res是在頂層函數,在RTL里這是在寫入一個端口:這個操作必須發生在loop Product執行之前。因為它不是一個內部操作,而是會對I / O行為產生影響,這種操作不能移動或優化。這可以阻止Product loop被flatten進入row_col loop。
更重要的是,對于Product loop來說,為什么只有II為2是可能flatten的。
這個問題被稱作carried dependency,這個dependency發生在一個loop的迭代操作和相同loop的不同迭代操作。例如,一個操作分別發生在K = 1時,當K = 2時(其中k是循環指數)。
第一個操作是在line 60數組res上的存儲(內存讀操作)。
第二個操作是在line 60數組res上的下載(內存寫操作)。
從圖中可以看到line 60是從數組res的讀取(由于+=操作符)和寫入數組res。數組默認映射到RAM block,下面Performance View的細節解釋了為什么會發生這種沖突。

?
成功的schedule中,Product loop的下一次迭代如上所示。在這個schedule中,initiation interval(II)= 2,即loop操作每兩個周期重啟。任何block RAM之間的訪問沒有沖突。(沒有突出顯示的單元迭代重疊。)
不成功的schedule顯示了為什么loop不能在II = 1時pipeline。此時,下一次迭代將需要1個時鐘周期后開始。當第二次迭代嘗試一個地址去讀入時,第一次迭代中寫入block RAM的操作仍然發生。這些地址是不同的,并且都不能在同一時間被應用到block RAM。
因此,你不能將Product loop的initiation interval 設置為1。下一步是pipeline Col loop。這將自動展開Product loop,并創建更多的operators,因此需要更多的硬件資源,但它確保在Product loop的不同迭代之間沒有dependency。

?

?
在綜合過程中,在控制臺窗格中報告的信息顯示loop Product被展開,loop flattening是在loop Row上執行,默認initiation intervalv為1的目標不能在loop Row_Col上實現,這是由于數組a上memory資源的限制。

?
綜合報告顯示,如上所述,對loop Row_Col的interval只有2:目標是每個周期處理一個sample。你可以再一次使用Analysis窗口來證明為什么不實現initiation target。
Step 3 打開Analysis perspective,在Performance View里,展開Row_Col loop

?
在數組a中有三個讀操作。兩個讀操作開始于C1狀態,第三個讀操作開始與C2狀態。數組被實現為block RAMs和數組,這是參數的函數是實現塊內存端口。在這兩種情況下,一個block RAM最大只能有兩個端口(對于雙端口block RAM來說)。訪問數組a通過一個單一block RAM接口,沒有足夠的端口能夠在一個時鐘周期中讀取所有三個值。
另一種查看該資源限制的方法是使用到Resource窗口。
Step 4打開Resource tab,擴展Memory Ports
狀態C1下面兩個讀操作與那些狀態C2下的讀操作重疊,因此,只有一個單一的周期是可見的:很顯然該資源被用于在多個狀態。即使當端口a的問題得到解決,相同的問題會發生在端口b:它也有三個讀操作。

?
高級綜合允許數組被partitioned, mapped together和 re-shaped。這些都允許在不改變源代碼的情況下,對數組進行修改。
solution4: Reshape the Arrays
Step 1 創建solution4,在Directive里給數組a和數組b插入ARRAY_RESHAPE,選擇dimension分別為2和1

?
Step 2 Run C Synthesis
綜合報告顯示頂層loop Row_Col現在是每個時鐘周期處理數據的一個sample。

? 頂層模塊需要12個時鐘周期才能完成。
? 經過3次循環,Row_Col loop輸出sample(迭代延遲)。
? 然后每個周期讀取1個sample(Initiation Interval)。
? 9次iterations/samples(Trip count)完成所有samples。
? 3 + 9 = 12個時鐘周期
函數可以完成并返回開始處理下一組數據。現在,把block RAM接口設置為FIFO接口,數據流形式。
solution5: Apply FIFO Interfaces
Step 1 創建solution5,在Directive里給數組a,b,res插入INTERFACE,在mode里選擇ap_fifo

?
Step 2 Run C Synthesis,Console窗口報錯
電子發燒友App



























評論