版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。0 P& O: A H. _4 \! R7 a
; u* P2 B$ ^+ |4 k( H5 M+ A9 a3 q
! G2 R7 \8 z5 `2 V3 B& j
7 ?: }, {( c0 K; j二维数组作为输入输出port报错5 b, t% _( t" r, \- f
作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):
! H) E3 o1 }+ _7 a. ~0 z
3 O( b2 ?2 Z& Z, ^; Ktask s00_axi_write;
$ p9 ^2 R! o* a3 x5 ?0 a* j O9 I3 m5 e( _
input en_write;5 e/ |8 R4 F2 z0 j; X
9 l1 n0 B/ H% C+ v! A c: i
input [31:0] wdat [255:0];
# s2 ^9 i9 x* a6 M; z3 H% k4 W1 k# R% z) A& }4 C
begin% C6 e+ t3 m1 K" }
$ f3 u6 ~3 b: `@(negedge clk);$ Q- n) K( W. f9 N5 {2 T! ~
8 a6 x7 A: Q5 s/ K- m9 u
if(en_write)
: Y0 O+ ~0 }2 H$ a( ]7 k; X Y2 B
s00_axi_wdat <= wdat[0];
- z2 @! q- P8 C: n
3 K. a7 N; c* i# X. }5 {! Uend. t3 I( [, z6 E( [
! ?# Y6 Q" U3 o- h1 ]8 l" A: P- @" T
endtask
7 f$ J Q0 P# ?) D( k; a0 @, A L# \7 G$ g4 ?
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
3 Q) g U* h! @. T
9 D# J8 X8 N# ~
1 c9 R# x9 W5 f! m4 Gtask s00_axi_write;
" O. Y% N, q0 W6 r" D# h% B! p! b& }- X5 ?+ U/ f, A" g, T
input en_write;" U% f! D) s; d& W# X( T2 `
" s, D, S. K# M, r* t4 M
input [32*256-1 :0] wdat ;2 ^3 d& Y+ f& F/ K8 o8 F/ ~
4 ?& [- \7 e) pbegin
; U$ \* ?% f' z4 T( H, d. f& V s! Y( U5 V3 @9 F
@(negedge clk);& U. Z( D0 q G i: `
, I: w0 P* C! T9 G! eif(en_write)6 v# }( T% M# ~$ r. v e
# _% R) o+ ^' w& t) X
s00_axi_wdat <= wdat[32-1 : 0];0 e/ L5 e9 ^ ]& [7 p
W/ B7 A% A1 @/ g" D" Y
end% N" x# E* g2 d1 y2 ]# \3 l9 X
: O1 w; b5 z9 ~# ]# Eendtask
8 o5 Z9 t7 H# @) ^& b# T6 _* j+ b# f& [) s/ ~& H: k
' k' ]- X1 Y/ @7 [1 |0 J% R3 }
2.二维数组初始化# g+ o$ p K9 A
/ v6 F5 W5 x$ u% A& K* K: q4 z1 e/ S
: |6 A1 G7 o7 m5 R2 D如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;8 s5 h5 }5 o; s$ `9 t" T
& d! |- |( [3 L/ G+ {4 W; L6 `3 H, J$ L5 P# I' Q
, H) l( v' l) R$ F用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):7 }7 L j, Y+ N4 _0 |$ ?6 J3 X
7 @) j1 y4 _. }0 R' g3 g
reg [7:0] mem_2d [99:0];: ~- a9 f. |; B! }
% F3 h& E% O0 I U! Ninitial begin0 U; i9 B* u3 |1 c7 M0 F
4 W: I, | M/ V% ]2 c
$readmemb("simu.txt", mem_2d);* ?- i# O9 G& w' ^2 h
& N: M& R: L0 D3 h- R
end
& H& r# ^1 ?- P- [) D$ n: j5 h. ^ I
; D- f* C$ q' m' |1 k0 L/ r
! K" {* x5 T7 a4 E% ~用generate 的方式(相当于依次给每个元素赋值)如下:4 g, J# d; P9 Q2 e# M
8 q7 ]; Q. `6 \) R
wire [7:0] mem_2d[99:0];
( Z6 H* o. h) e; O: S, Y3 O) @' M3 ^( r4 C0 s
generate
. e* ?+ s0 v2 w- X# s" W* L8 L
/ n7 i2 B8 P# `: d. |# G0 }0 f2 y3 ^) }genvar i;$ \% Q- E) l2 q; p6 E+ ]
3 C' ~+ g7 _ C7 |( [4 v2 O! u& [
for(i=0;i<=99;i=i+1) begin : BLOCK0* t8 n/ d6 z. J
, z' @8 s2 x# uassign mem_2d[8*(i+1) : 8*i] = i;2 n, Y. D* D( E7 _$ n+ s
5 a/ \! ?* m; v, E! g3 Eend
. `: n. H2 n0 u$ `% M1 u
) {4 l, s! Z, _2 ?# P& Aendgenerate: c" |! R @- j. J2 L2 f9 W6 d
$ p8 Z' Z* y8 ^" y. W6 y2 `, O
也许大家会认为可以用如下的for循环来初始化数组:
$ E+ T+ a2 Y. z& e
# E6 j/ P5 ^1 t7 r; U8 Hreg [7:0] mem_2d[99:0];% w; w2 B$ d4 @& S! ^' v' q
8 h1 e( z4 @. m* ?
initial begin2 E& Q* i6 j& g C. G! z% M- h
$ n( E5 F; ?2 R
for(i=0;i<=99;i=i+1) begin, P7 V$ {7 Q9 }9 b4 {# t, s
! K( e) B! Y1 mmem_2d <= i;& l5 s/ |2 B5 z0 \+ t1 S. h
, s! ^- b6 i. W' l! T1 h+ |end
) ~& |' |# A* A j8 O
8 o4 c" B) o; v% i6 z6 {end
8 v) t: P- l9 `/ k3 U& h5 N' Z1 c1 y6 ~! o$ K* O9 R9 H: r+ l
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。, X2 y# V3 p6 f: M: k
---------------------
4 r' C7 j6 q; ^) S作者:carlsun80 % r; ~) B% M3 S( L. M/ u- j
来源:CSDN . _$ ], a; P) l$ L* H( `& i
原文:https://blog.csdn.net/carlsun80/article/details/77726060 + p$ E+ M" Z: L: O! t
版权声明:本文为博主原创文章,转载请附上博文链接!
, ^, ~: m& c- y$ @ W
6 S7 ]4 k1 D) O3 W1 Y* K |
|