[爆卦]Verilog array assign是什麼?優點缺點精華區懶人包

為什麼這篇Verilog array assign鄉民發文收入到精華區:因為在Verilog array assign這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者zxvc (眾生都是未來佛)看板Electronics標題Re: [問題] verilog ar...


※ 引述《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
bjk:謝謝你的說明~ 10/06 17:17
zxvc:FPGA可說是4D IC XD 10/06 17:18
mmonkeyboyy:4D IC 要看你花多少錢買到的 FPGA 到是 TABULA說 10/06 20:34
mmonkeyboyy:說他們的東西叫TIME machine 看看就好 XD 10/06 20:35

你可能也想看看

搜尋相關網站