版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。 J3 N# }' Z5 `. A% V$ f8 g) Q8 p
g% |8 P2 _7 L* U
4 b7 ^4 y. N3 ~4 ^# C. J# N/ ]* q% V2 }: B. t+ w
二维数组作为输入输出port报错
8 y6 l* J6 {& q作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):
0 k) X3 S) I3 @: E8 L/ C$ f1 X: J# X# t
" d5 h# P6 [; l( M; T! atask s00_axi_write;3 l6 v& O8 I2 t) h9 a6 g
( q; [$ {3 x8 ^& Einput en_write;
1 U) o% Q% j( Q3 B$ g/ g3 [+ o
* f3 B @. j. C j$ k. xinput [31:0] wdat [255:0];
' s5 B$ w1 v9 P# N4 d; S7 v% e/ a
& S0 z$ ~) ^2 q2 vbegin
5 Q& n& ~ E: z1 R8 `6 }, R( o) S9 A7 u5 D
@(negedge clk);" x" Z0 [& c' d% I
$ Y5 M, l+ ?& p2 E$ [if(en_write)3 [, S4 u1 H E4 }0 v8 K; d
P; E- y g; Q9 e/ B5 a
s00_axi_wdat <= wdat[0];
# m# p/ i7 T5 h; z$ _
8 |) c- L N- S3 K* D wend* O( f9 _+ n# i' {4 f* L( R
1 B; `& F4 }- J; c4 u8 I/ h
endtask
, w" g8 t0 |9 Q$ n4 y9 L' q0 [# r8 E* w# q* M
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
, u6 Y3 Q7 }* K6 M4 L# I
! ?, R* g0 r1 H3 h3 L% X8 z6 j$ X. V/ D
task s00_axi_write;
4 N' `- m" B3 G: y
# j) U' O$ y5 a8 j; c% i. Einput en_write;
4 U4 d1 H9 Y0 C: a! l4 u6 v; }! d# E
input [32*256-1 :0] wdat ;
$ G' D' E: a" J, s6 {- M2 r2 w& J5 U: w, T- q8 j% u8 U' m
begin6 E/ y+ f) }+ y: Z3 D$ q: O
: w2 p: p: y2 Y) k: U' c2 G" n/ ]@(negedge clk);, j- O6 J& R) q6 r. k7 ~
0 [6 h: @; k7 o2 u6 x. V
if(en_write)2 M% O; \. P/ v: z, n
$ H- W7 F9 b7 B/ v
s00_axi_wdat <= wdat[32-1 : 0];
1 `* x4 e) ~ F+ k# C
' h4 }& n6 n8 y x vend
( R) T' J1 I4 }$ T
2 @: B& x2 x% pendtask) u* B% W* u) x9 q: L2 S/ R
5 D1 E3 I, {8 m
% O' V, ~! Q% |9 `. x5 Y, x. L2 E2.二维数组初始化
; r3 i. {: b2 E$ m2 R F( `! R8 p: M) b4 [* C }2 ~
$ Z3 Z F x0 t5 C
如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;
" W ^6 p" f, B) B7 T o+ ~1 T/ o* N5 A! F, `5 l+ F
& ]/ o6 ~/ D' f0 e( k3 B
3 U" ^* V* i3 r4 h用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):8 R7 F8 }, B/ y# ` W. Z4 g t: M
. i) h# h% @3 ?' Y' X1 areg [7:0] mem_2d [99:0];
5 C9 m; G; k) ?* F$ M& [5 ^2 c6 X3 x5 G/ u) ^
initial begin/ A- ~- a- Y( }. o- G0 y9 z& L8 X
% q6 M6 U, V, k/ W$readmemb("simu.txt", mem_2d);
$ q2 S6 X$ o2 ]3 T+ t: _- U( C O+ W/ A8 c
end
) T1 `7 N8 ^8 t5 x8 s2 o
6 ^4 W" r+ U; N5 f" o: _' Z" |9 o: T
3 t0 t" ^2 i+ h% v4 N
用generate 的方式(相当于依次给每个元素赋值)如下:1 k% C+ c ^* J$ l1 w$ m: Q
' ^& [3 q7 p4 _9 K" }) Z, V0 n& swire [7:0] mem_2d[99:0];
; G$ X9 x% t* M0 _! h5 X8 R: ~1 v* ^
4 Q+ _& X) k0 t6 E+ mgenerate4 b) C O. R' Y( l5 e4 Z$ X% A. K
$ E7 U) v0 I4 r- n/ C: L! ]1 j' {; \
genvar i; z% S1 l3 I0 G$ Q
* o5 F9 W( B8 T) s0 D; o t6 V$ Ffor(i=0;i<=99;i=i+1) begin : BLOCK08 O; `7 B8 C Y. l6 v
& n& _& q% ?1 J* B; ]+ R$ `. K' I8 e
assign mem_2d[8*(i+1) : 8*i] = i;; W3 e) J6 t+ I n( ]
A6 r: \% j! c! w' u3 W3 z( f
end1 t' ?, _# G* G" c; N% Q% ^# a( b
" ^7 M. p# I; t" L4 @( T
endgenerate
. @1 Y7 u2 k4 T! M2 P- R8 O& _+ U1 ^# s: E7 \3 n6 `
也许大家会认为可以用如下的for循环来初始化数组:
# m# g- G" F# r" N$ i7 d3 ~
" e E1 F+ ^3 @0 R2 Ereg [7:0] mem_2d[99:0];, z, \8 [* L! j4 i% H
( ~/ B7 V, U; |1 Q1 Cinitial begin, G4 r+ U, j6 D, j1 J& y
5 D ~8 t7 `% j7 r- C1 Ffor(i=0;i<=99;i=i+1) begin
1 F. u1 v3 f' ]; y) S( R1 H8 k- I
7 W) E5 P+ `( [0 V% H) qmem_2d <= i;
/ ?. v% k1 {( }
$ A. f7 C8 f. } ]. r' `end, Y3 ~' N$ }! J2 w: B3 Q
! s7 S% O5 ]6 s5 u& I, \
end5 R e+ X W$ N3 N' n
& X4 }' M! h. q5 D3 a% |/ G
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。
: }+ }# M( G `; c5 p; P---------------------
9 g0 }0 |$ r6 C1 f6 n \作者:carlsun80 : p: G6 k& n4 `+ Z( F* D
来源:CSDN
1 h: N. g' P3 N5 I原文:https://blog.csdn.net/carlsun80/article/details/77726060
4 j/ V7 E7 a7 F7 s" K+ B+ }版权声明:本文为博主原创文章,转载请附上博文链接!3 o$ E+ P7 h1 h/ x. Y6 _, `: H
, L; Q# i! ~1 W, Q |
|