版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。6 ^: I; C+ Y- x9 N
/ s, M1 y1 U# k/ R: Q9 i% L3 k
7 E+ B: x6 Y2 h% s+ [9 x1 s# h( Q. y
二维数组作为输入输出port报错& C4 S2 p$ i4 b
作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):
2 g) C1 S3 K& a |+ {+ d+ N2 B$ e6 Q7 n. K% |
task s00_axi_write;! _( }6 F7 D) c2 @3 ~, ?% C0 r
2 u9 g+ s+ R- |8 `* [
input en_write;: M- g' @7 M E$ z' {
, ?* B/ k1 N5 q! zinput [31:0] wdat [255:0];. V- \$ b r4 p6 r; O" o8 d" [
- I+ E: M& k. ?4 I2 m1 T2 Ibegin
) l% R* f$ A3 w4 ^. j! u. G1 O% a) f, o, H" v
@(negedge clk);
4 b9 s$ y* |* K- n
, e. ]( H- O0 f2 M4 u0 @if(en_write)
/ P1 }9 Q! K- x% m! C% y! T
3 i' K l! `( \; d I9 Z. Vs00_axi_wdat <= wdat[0];( _) t3 y8 ]$ l5 H% M% Q
# d" c9 p# @ O2 Y2 ~
end
- x# p4 P+ r1 f: r9 ~5 s) e9 B- I
8 v J! z5 X* M( f: G/ f iendtask; r. A1 x1 u' A( j" n& I
& h2 O7 e u2 b. C如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
' ]2 \% ^7 `+ T! g4 j
8 Q5 [# ^# W# H6 G* Y. c
$ g7 d2 J7 J7 B& X) ?$ g" \" Etask s00_axi_write;
3 O7 A& l( f4 C( z
) j0 |1 n. |1 b* ]/ L6 yinput en_write;, J, W1 y+ g8 W9 D
+ k1 O6 h5 P; @% c, t/ e/ winput [32*256-1 :0] wdat ;( \- [ U" z e. D4 V7 f1 S
; J; X) |7 ^7 E8 w& r) A; cbegin2 T6 I5 I1 ?' d$ k" n1 v
/ b; o: G: p% V
@(negedge clk);
. l& B) Y* w; P+ A# _. K) \2 R& p+ ]
if(en_write)
% P+ z0 B& r# j& ?# J
6 T( a3 K2 c1 y' |, z7 {5 D7 xs00_axi_wdat <= wdat[32-1 : 0];
5 ^7 h2 U( n' @, ]9 Y- N
9 U3 E' t0 b6 H6 @! eend, v, d" S+ h8 T% R
3 h6 ]7 V7 ]+ v5 T- Y0 \5 n0 M, D; H
endtask
: _; n/ G1 w2 H+ U0 D% s1 h. _. Q3 ?" h9 _3 e# U$ w( Y
8 @5 f* R. I) S' K# \1 j2.二维数组初始化+ G; e% C( q7 n
" L2 D: H7 ]9 x: N; Y
v: L5 O! y# t9 R+ I' y如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;
3 L' N5 i! }0 t( a( h
3 A7 ]5 F4 l9 R9 b* Y4 [+ N: ^" }% \+ ~4 B
& y1 W) `' O% G5 h8 w1 g0 D
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):- l8 g5 N% L+ m# G. c' U) |
* [. \* b" j1 [, }' r8 M3 j+ v z) h
reg [7:0] mem_2d [99:0];
' o C, d" s, D( c! p# \0 s
* E( K" p$ X; O/ ^4 yinitial begin
2 \2 J2 x) a, s& a( [% C, A" p- H; x m! ?
$readmemb("simu.txt", mem_2d);
% q3 c2 S( Y P5 m% A, V3 x5 K! a8 ?) s9 F; u+ o$ N
end% v' J$ i/ @6 z) C8 A( d; R
# I+ A* W1 S; {' ~8 r3 I5 O
( K" F% l1 B, @" j8 o% S9 M
* B/ N& Y, `' ~用generate 的方式(相当于依次给每个元素赋值)如下:/ @6 W0 n$ v% G( z' Q7 r$ X
, e0 R" E, j9 b: s r: t/ }
wire [7:0] mem_2d[99:0];# R8 K. x& ~. K. \$ l8 E
8 W$ | C" Y$ |/ jgenerate
i/ C5 v/ j* a1 o9 d( Y3 `& q5 Z0 w% ?6 Y! a2 w* o' {
genvar i;
5 D+ s. A1 |) Q
4 n" B9 {/ A; K* W" n4 ?for(i=0;i<=99;i=i+1) begin : BLOCK0
. s. t- | h: [/ e7 I$ v) i
3 k& `; j1 [' zassign mem_2d[8*(i+1) : 8*i] = i;
7 K" W1 O5 x0 j( l
6 l/ m; u2 u$ z8 n, v0 z2 zend+ Q2 I4 {4 Y# {
, f" ?2 D8 W' X1 z t
endgenerate2 n' i) g& v7 u2 j7 X
$ s% ?( b5 E N* F) G R6 Q
也许大家会认为可以用如下的for循环来初始化数组:
$ ~% }" A2 A# [# K
3 C0 c% l% `4 lreg [7:0] mem_2d[99:0];, F4 I3 M0 u5 e
: [# `1 i7 @7 \' l& q
initial begin8 r& M5 j, [3 V' G8 h% L% H
) M& Y* A$ p3 \" P
for(i=0;i<=99;i=i+1) begin) X$ d: C) x% p
8 _- V+ A, I! s7 b4 E1 X
mem_2d <= i;
0 v) u7 b! P r# Q7 h: X& c- ]$ I9 k6 e( J3 Z5 x% G7 @
end1 H- e! j+ O' b7 v2 k
2 w8 p* p% E- r; ~
end
/ t: {! T' Q0 N1 C7 o, q9 \! Q/ J6 Y
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。. e" j; l$ F& ^% X
--------------------- : f# K$ W5 s( M; M5 F
作者:carlsun80
! V) c" Y, L; W1 E! Y d/ W来源:CSDN H8 M" U& j; O1 F% U1 L3 j
原文:https://blog.csdn.net/carlsun80/article/details/77726060 ( f# y! i9 L8 S
版权声明:本文为博主原创文章,转载请附上博文链接!
1 Y- E2 M7 M) D
* T* `) M7 s; F; ^: x |
|