版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。
; J+ V9 m: d4 ~( e; ^
5 Z6 j: j& u# f- x6 _- b+ X
3 ~5 f7 v, ?1 |: W4 d% n0 W! K' a6 O. {, l. P5 t6 ^
二维数组作为输入输出port报错
* X$ ]4 ^8 `! m作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):7 f- }/ Y% U% J" y4 \/ x2 C
: j% X7 I, _5 Q
task s00_axi_write;
+ |2 x! ]* r/ a0 j: S: R) e' q* `: \: _; n# p! |3 F
input en_write;3 h W& a! Y/ B
6 a ^) t7 m' U0 }9 G% `input [31:0] wdat [255:0];
0 T8 z; q2 L! v ^" b
0 d* a: ^+ m8 Y5 L! c0 Vbegin8 B) }! P( w1 a
8 z) H \" ]4 ~: U8 o" X
@(negedge clk);7 |7 t# V( K( x7 j
/ I: q* l0 A( w; t) }1 p, }
if(en_write)
' q0 w! s7 x. O! i7 E9 ^
2 W `4 d# P/ ], c% r5 y T" u1 Gs00_axi_wdat <= wdat[0];: ], J, G0 F9 A: t q
0 f$ S8 E/ i( r: _3 |
end
2 V1 p# S# k! H; c8 q( G! n
8 S% b2 j2 P9 Aendtask) q6 y4 _# b; h$ V! j1 n
$ k( P! s/ Y" A" X! P$ M* J/ U
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
. Z* d7 }/ w$ c5 x1 h( t
. k& Q f/ h- g8 M* [3 }# V: Z0 q/ ]1 _& K" c: w( \! X+ I3 J r
task s00_axi_write;2 i% Z6 [5 z( ~7 A% O. M7 W7 I
( b2 m' x/ T- c/ \3 v
input en_write;
7 V1 F8 f( ^4 a6 m/ M* a
" q' `2 `7 q9 ^1 ainput [32*256-1 :0] wdat ;
/ x% E- l, H+ u1 _/ x) t; z3 L# s u, l* Q
begin. }3 c- g& e: {) z! P* h. b
; ?% |* B5 ]8 r# Z@(negedge clk);
0 J& b- `& `' R% Y- \" W _( J. n1 X A% l1 ]) T( l8 @( F
if(en_write)
2 X- D; P5 [$ K2 X2 M. o
# a* O" ?# k; g; V- Ws00_axi_wdat <= wdat[32-1 : 0];# W" k+ K% o, v. x# o; @2 C: l" x
+ _" E& L! @0 b
end1 S" m. U3 f3 g; \% V. E2 Z
0 `4 a, T3 V) N+ F! b5 n+ a! Q. v6 t
endtask
3 ]& h: F! H; z# B
6 V! M4 f/ m% ` t
& u9 c8 o" r( E# i1 s3 j2.二维数组初始化
/ j( s7 h+ o8 n( f$ s# A9 p% ]3 d2 D- \/ _/ M
* X1 U6 y$ J% u3 p- t5 @
如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;. P0 P; D7 R- k, e5 s- _
% j* I8 f: L, p; C
' w/ j, W) [3 r; v
9 Y O% S. B6 h z4 U9 s$ z用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):* m, j/ t$ l: A, j
5 L; C8 H( q( E W& I
reg [7:0] mem_2d [99:0];
% o$ ?; b' P, O) i0 q* s6 n& \+ ?
4 @9 v+ G& S0 @3 d9 y: U, `1 Jinitial begin
& F: S7 O" [9 Q# G( k& U$ u. R* {7 R8 u2 m c3 b4 G. s" e9 T
$readmemb("simu.txt", mem_2d);
+ A5 M3 x) T _ o+ ~( [# X2 S: l# U! N' r) G
end
% g* u( o' [, `0 _* ^* x) a9 G; n
1 t. Q- F, N9 a0 T7 I8 K2 Y0 S+ E) L( f7 u' N" e1 U% ]
+ H" @" x: C) q% U用generate 的方式(相当于依次给每个元素赋值)如下:
! e; [. p2 y. N/ K/ h$ D, Y: B- g: ~; W
wire [7:0] mem_2d[99:0];" }: N5 Y% M- b* c5 Y
" n5 t0 `& f. K6 J
generate
7 s+ k( y7 w0 G& ]4 e0 q% n( N
8 C& z7 Z* [" `4 Mgenvar i;& b: ^9 H8 n( @5 h# V
* e5 { ?2 _% Q) h
for(i=0;i<=99;i=i+1) begin : BLOCK0
/ m/ [! M9 u8 j$ ? I, l; ?$ f& x" @# H! m; g" ^/ a
assign mem_2d[8*(i+1) : 8*i] = i;
6 [: @, O4 j; F8 P+ w
% v! s8 f9 m1 `6 t9 xend6 A+ E! o4 e2 B5 V5 T- P# @6 w( @% c
" [# R+ R# f5 y0 A$ b( a. Oendgenerate
; p7 b. L7 B5 G# C& H0 \4 l, Y* [7 ~# R6 H3 H" i2 C
也许大家会认为可以用如下的for循环来初始化数组:* X m+ d# Q# S0 T5 l8 q
8 y. T, u8 c- Y: I
reg [7:0] mem_2d[99:0];+ w7 H! `+ ?6 B9 g
" A3 g0 Y- w. j5 Q
initial begin& B3 V2 y! \6 c, H
- m4 j& x& u8 U. V! efor(i=0;i<=99;i=i+1) begin; W. }$ \4 s. ?/ V' N
2 k9 G5 p5 g: a: N/ Jmem_2d <= i;3 h, E- Z' X. J2 G: f
r$ \, w7 R5 x& E2 s3 O3 \& Fend
& f2 O* F K5 `
1 @ i' Y. Z# D% z3 T0 fend
$ X4 u3 P* K* |" q- j$ C4 f2 W5 Y& c# v
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。
: G. A2 P& j2 _. h( [7 x--------------------- 0 C1 R' x( D6 x$ T
作者:carlsun80 - R% U2 p2 P, ~- w; F* V7 n5 f
来源:CSDN # x% E: m% [2 _" c" V" i n
原文:https://blog.csdn.net/carlsun80/article/details/77726060
) W" z4 o- Z6 [& w版权声明:本文为博主原创文章,转载请附上博文链接!/ n V/ P* @3 L* d- c9 r8 ^0 y
2 T1 P; x U/ t
|
|