Re: [問題] verilog array index表示 的限制

看板Electronics作者 (眾生都是未來佛)時間13年前 (2012/10/06 17:06), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《bjk (Up2u)》之銘言: : 發現好像index有兩個限制,導致不能合成 : 1.for的終止條件不可以是變數 : for(i=0;i<temp;i=i+1) : array[i]... : temp必須是常數 : 2.不可以是兩個變數相加 : array[i+j]; : 請問是這樣嗎? 大多數合成器對loop的支援的要求是要有"固定"的iteration次數, 我還沒看過支援不固定次數的。 "不固定次數"很容易出問題,例如用loop generate產生邏輯閘 以目前技術不行(可能是不太實用,沒人做)。 目前做不到一顆IC,比如某個時間點有三個邏輯閘、下個時間點有五個邏輯閘。 但FPGA是最近似可達成這目的的東西,例如它一下可以是一個FFT電路, 重新configure後可以是個CORDIC... 另外要知道Verilog裡for loop有兩種。 一種是generate裡的for loop, 在Verilog標準文件是一種叫作"loop generate"的東西。 另一種是always+sequential block的for loop(我不知道有沒有正式名稱)。 我先講loop generate的"固定"iteration次數: 這裡所謂的"固定"是指在合成器有一個elaboration階段必須是常數值, 就可以合成。 Verilog parameter或字面常數(literal constant, 如數字1, 2, 3, ...) 就是在elaboration時是固定下來的數值, 它與常數值就適合決定for loop的iteration次數。 如下SystemVerilog的範例,已確認Design Compiler 2012.06可合成: module m #( parameter w = 2 ) ( output [w*2-1:0] a, input [w-1:0][w-1:0] c ); genvar i, j; generate for(i = 0; i < w; i = i+1) begin: s1 for(j = 0; j < w; j = j+1) begin: s2 assign a[w*i+j] = c[j][i]; end end endgenerate endmodule 但如果你把a[w*i+j]的w宣告成integer,Design Compiler就不接受了。 宣告成wire也不行,即使它被assign常數。 這是因為wire與integer在elaboration都還沒初始化,所以不算常數值。 至於always+sqeuential block的for loop則 用parameter、wire、integer或literal constants都可以。 不過這樣看來parameter、literal constants比較通用, 所以不建議使用wire、integer constants。 -- 楞嚴咒(附注音): https://skydrive.live.com/?cid=87cef5e6683b5427&sc=documents&id=87CEF5E6683B5427%21312# 縮址: http://bit.ly/r3bgEo -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.161.190.107

10/06 17:17, , 1F
謝謝你的說明~
10/06 17:17, 1F

10/06 17:18, , 2F
FPGA可說是4D IC XD
10/06 17:18, 2F

10/06 20:34, , 3F
4D IC 要看你花多少錢買到的 FPGA 到是 TABULA說
10/06 20:34, 3F

10/06 20:35, , 4F
說他們的東西叫TIME machine 看看就好 XD
10/06 20:35, 4F
文章代碼(AID): #1GR_IofS (Electronics)
文章代碼(AID): #1GR_IofS (Electronics)