Abstract
本文使用Verilog 2005的新特性實現memory轉vector。
Introduction
網友Adamite今天問我該如何將memory轉成vector,我們兩個在MSN研究了一番,發現Verilog 2001的generate與Verilog 2005的input memory可以達成,特別做下筆記。
重點是:『這些花俏的寫法,Quartus II 7.2/8.1都可以合成』。不過必須將Quartus II設定成支援Verilog 2005。
memory_to_vector.v / Verilog
1
/*
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : memory_to_vector.v
5 Compiler : Quartus II 8.1
6 Description : array to vector
7 Release : 12/25/2008 1.0
8 */
9
10 module memory_to_vector (
11 input [VECTORSIZE - 1 : 0 ] mem [ARRAYSIZE - 1 : 0 ],
12 output [ARRAYSIZE * VECTORSIZE - 1 : 0 ] vec
13 );
14
15 parameter VECTORSIZE = 4 ;
16 parameter ARRAYSIZE = 3 ;
17
18 genvar i,j;
19 generate
20 for (i = 0 ; i < ARRAYSIZE - 1 ; i = i + 1 ) begin : array
21 for (j = 0 ; j < VECTORSIZE - 1 ; j = j + 1 ) begin : vector
22 assign vec[i * VECTORSIZE + j] = mem[i][j];
23 end
24 end
25 endgenerate
26
27 endmodule
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : memory_to_vector.v
5 Compiler : Quartus II 8.1
6 Description : array to vector
7 Release : 12/25/2008 1.0
8 */
9
10 module memory_to_vector (
11 input [VECTORSIZE - 1 : 0 ] mem [ARRAYSIZE - 1 : 0 ],
12 output [ARRAYSIZE * VECTORSIZE - 1 : 0 ] vec
13 );
14
15 parameter VECTORSIZE = 4 ;
16 parameter ARRAYSIZE = 3 ;
17
18 genvar i,j;
19 generate
20 for (i = 0 ; i < ARRAYSIZE - 1 ; i = i + 1 ) begin : array
21 for (j = 0 ; j < VECTORSIZE - 1 ; j = j + 1 ) begin : vector
22 assign vec[i * VECTORSIZE + j] = mem[i][j];
23 end
24 end
25 endgenerate
26
27 endmodule
18行
genvar
i,j;
generate
for (i = 0 ; i < ARRAYSIZE - 1 ; i = i + 1 ) begin : array
for (j = 0 ; j < VECTORSIZE - 1 ; j = j + 1 ) begin : vector
assign vec[i * VECTORSIZE + j] = mem[i][j];
end
end
endgenerate
generate
for (i = 0 ; i < ARRAYSIZE - 1 ; i = i + 1 ) begin : array
for (j = 0 ; j < VECTORSIZE - 1 ; j = j + 1 ) begin : vector
assign vec[i * VECTORSIZE + j] = mem[i][j];
end
end
endgenerate
genvar與generate是Verilog 2001才有的,非常強大,可以配合for做一些規律性的assign,這在Verilog 95無法達成。
11行
input
[VECTORSIZE
-
1
:
0
] mem [ARRAYSIZE
-
1
:
0
],
則是Verilog 2005才支援的,允許input與output為memory。
完整程式下載
memory_to_vector.7z
Conclusion
這些花俏的寫法,寫起來爽度當然很高,但就怕只能寫TestBench而不能合成,不過所幸以上的寫法在Quartus II 7.2/8.1都可以合成,可以安心使用。
See Also
Adamite的(原创)verilog2001中generate的精妙用法