為什麼這篇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