版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。+ f! A- G$ h* K5 L& S
% s% v& ?) T/ N9 X
9 T" n" t! C5 M, @
, S0 R6 \( e1 F; D+ |1 H二维数组作为输入输出port报错
: d. w2 a. f3 B+ i' W作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):) ^0 M. ]+ k4 @$ \7 r. ^
. T- Y& e5 v9 ~9 U! d
task s00_axi_write;0 y0 c0 \% ^2 j+ R. y6 C
( U; c5 h5 R0 b5 H: a& h- Oinput en_write;. y7 } T$ E# g
b' D# `' v& w
input [31:0] wdat [255:0];: S6 ?& v! b# Y9 S- B. t6 [9 _
4 ^3 b' {% }( K4 O6 ~begin- X0 E; L" ~8 z' t$ K5 o/ J+ o
9 Q) c8 l' G" _2 O2 ^% D- u9 V" L
@(negedge clk);
4 B/ L" ? A" b& _& ~' s9 y& G
& D4 m% X, R2 [% m7 Dif(en_write)5 Y1 c9 N( c. K7 l# B
3 @" i$ @7 _0 g9 h, o3 a$ Ts00_axi_wdat <= wdat[0];# D: F6 @1 n5 \& @
/ @3 o, p) F0 g: c+ c: J
end: ]9 _: |+ j$ U- I
9 [; }1 Q$ G$ s. E/ j* l1 P" Gendtask# V3 u/ ]* I' a% F% ^
' h1 A2 F$ w- Z3 [2 ]: k- x如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:0 n& B, B \0 P3 _- Q: m
1 T- A% x" B* r& }7 ?$ ]; ?
: C% d/ H( u' G) @. K
task s00_axi_write;4 ?2 q" ~. q- r5 n5 E
, B$ n% X5 c# K. ^input en_write;! o3 Z' {3 c2 S! G% ?+ e( |
k3 e! d4 m) K3 ]- vinput [32*256-1 :0] wdat ;
' t- Z/ c+ o# x9 ^2 W: O" k! z% j4 i0 y) N. t
begin
, r) y# P0 p: C+ c+ c' [ B/ ~3 N0 s* y1 ]
@(negedge clk);/ j/ m" ^1 |5 C: G3 m! z
# X: o) T( z5 v3 r' R. |. B# ?
if(en_write)& V/ o( k6 g/ \
0 i1 H1 R9 V5 ?, T- m
s00_axi_wdat <= wdat[32-1 : 0];" V" d9 _ g& H/ g/ L* g
; B4 M ^- Q- L; s9 Z1 C6 u
end
2 d T4 t4 V$ s
7 ^) ~6 d: b8 v/ a! yendtask
& b7 l* o: R2 v. V3 L$ K
5 I6 m' v: S+ r& @8 X& J( [1 S: L% Y
: a5 Z/ U' E* y% P6 E! _- _' t2.二维数组初始化# d4 O% }& q- A) b7 p1 `7 X" u# T
; ` N# q* h' u/ S4 i5 t: D7 r" z. I! ]6 P
如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;) w1 E2 M2 _9 G) X' B
: Z* d4 Q( L4 V3 x: Q' R3 k
8 I O3 h0 j% Z- a- G) O. x" b4 \6 d6 Q4 u8 s1 `2 n
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):3 C t+ o# w/ ]9 k
( ^% \& O1 V: k. t' F! Y' u
reg [7:0] mem_2d [99:0];
1 I- n9 d) r u2 n6 q
2 s! z) I) |. E7 Q% o# d |% Q. Tinitial begin
g o* a E4 q0 z" C t; B' H0 n
$readmemb("simu.txt", mem_2d);$ y3 k0 {% y e
4 u, v3 L& ]3 q2 k% c) g
end$ `4 ^- D' ?3 J9 t
- w* [. L# _" }( B. L! t% c! A' p
+ [' u( E3 C: T. C7 _7 O3 e! r2 r. ~' n, ^8 O8 H+ H
用generate 的方式(相当于依次给每个元素赋值)如下:, D7 l+ ?4 J' _7 q& L: Q2 n# s
N+ ]3 T. G7 \4 F
wire [7:0] mem_2d[99:0];
0 j) [$ O1 v* z1 |, `
+ b% f- S+ X8 x/ V' o3 {generate
9 a0 d7 I- L2 x7 e- I& R) [
) ~' E0 @- y; F" pgenvar i;
9 N- E: Y: \6 K/ K! w( [9 M1 W/ M4 s/ X7 m& [7 Q/ z; E8 f; O4 o
for(i=0;i<=99;i=i+1) begin : BLOCK0
, {+ @( d. H- J
- R9 F0 X- O9 F4 ^- a* Sassign mem_2d[8*(i+1) : 8*i] = i;' R5 V) Z3 N$ i, d7 K% ^' T
5 x% Z) v& U8 I' \$ z3 k) c4 B% t* `# Tend
; u$ R6 q* Q/ E7 w3 t( _3 k2 s3 j4 R# o z4 i8 U% v" G1 @
endgenerate
' g( y5 c |: F, j# x) @
" o' W$ r% }- y% T# a2 {6 y* B5 @! k也许大家会认为可以用如下的for循环来初始化数组:; ^& j5 J! S) [1 @* i
" [0 r8 \* O9 g& H
reg [7:0] mem_2d[99:0];9 m; w6 W, q0 t
+ E8 O: Y# a+ Y! Y) p$ Tinitial begin" E! A3 v5 c+ M2 w. I" X
! ]# D1 e7 F& _for(i=0;i<=99;i=i+1) begin. p) O3 }5 Q' K7 g! h( O. i6 b
5 B3 |# K9 k) \8 L3 l3 I4 |1 M
mem_2d <= i;
! }; j# V7 h+ L5 v9 n1 T- x
- _' {9 [7 w& K# M/ i, j! yend
/ b6 _0 T; S$ k5 @; w E& `: H4 J' @
end
' R9 \+ v! h3 p3 W
" Q' }' ~; Z, E3 j1 K A但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。6 K: y. [3 S# |8 {9 B; G, ^
--------------------- % V9 M* I3 n! `! l5 ^/ i }, D
作者:carlsun80
2 k! [( i( a; c. \来源:CSDN
$ h4 r4 y" m- a1 V原文:https://blog.csdn.net/carlsun80/article/details/77726060
2 V8 _* g9 v; W0 h$ @0 m$ H5 F- T& N版权声明:本文为博主原创文章,转载请附上博文链接!
5 l$ Y4 w5 D w, v( _& @/ k% B" y9 n* R
|
|