版主
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。
% E1 v8 l- B6 k! ~/ ]' `" R; E$ `2 u c" ~' ^
2 L! R3 a4 M, W. W
/ M% w2 w# N6 Y* `' P
二维数组作为输入输出port报错
) ^( z' d) c5 _. ?3 t) j作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):
$ m5 h* R$ N* m* g
9 Q; B j; n# V7 T; s- G% A3 otask s00_axi_write;! B4 {/ z+ t8 ~2 e
/ l4 p7 f3 I# p2 ainput en_write;
' z% O& d# T- y1 D
/ x; R$ t! M$ B; Binput [31:0] wdat [255:0];/ M' r$ |0 T q) q3 j
% r/ }! E M( {8 f2 tbegin
8 S! {" q1 r# c4 |
x+ `! D! A+ T7 l+ O@(negedge clk);
: a% H% R6 O0 L- @" h% {
) v, W/ F1 V" F' G/ @' wif(en_write)
" X: I& f* B+ K* F( s* F9 f$ A; ^/ ?! s) f7 h) R' I3 W& E
s00_axi_wdat <= wdat[0];+ Q4 e8 r* e2 D' d/ S
7 u! H7 c% }3 _: c- n6 M" Iend
- s) g: V( _+ W& x0 l" P' F
* ?( i$ N; Y2 r2 Vendtask
/ C, w, z& n5 s% l- Q1 m. x2 c1 W; L8 s" E2 e0 r" }0 F
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:2 g9 g8 W# U X( K( q0 Y
9 s! `. ~& F- h2 y- X
3 \8 T. R- @9 @/ A6 s! r8 d
task s00_axi_write;
0 E/ ?# Q. T0 N2 E" O7 b* Y2 n, ~. c8 [, w8 R
input en_write;+ I- B* }# d$ _5 C E
; }2 G0 c' a. k2 O. b
input [32*256-1 :0] wdat ;/ F, n; e- L+ v4 C; Z
1 m/ ^# i( n% N6 s& Tbegin
# L5 E4 k7 D; v- l0 H
+ f4 W7 d& C/ ]/ U/ n% h) ?: N@(negedge clk);
$ l+ ^- R- {+ W- m/ M4 I! a
# Q- I6 M e! b4 r: u! d) m0 kif(en_write)
M4 R1 {! t$ H: A( j4 y" ?% a: ]7 `$ n
s00_axi_wdat <= wdat[32-1 : 0];4 W- k8 r9 d: N' J
! {2 U% ^1 R2 Kend
2 D; |2 Y7 H: F4 N) {, R) G8 e k1 T/ a3 U
endtask
4 Z2 b( K# y5 M7 }4 o& }2 l l3 X5 _7 z' Y% h) `
1 x4 R% ^2 c/ a2.二维数组初始化
o3 w1 z' c; E9 y; B" T3 W/ P4 i/ ?% X
4 p) N" k$ e8 k) \7 w8 X" R' U- u如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;5 L4 P% \" r8 f* {0 D8 x8 k
) X3 P' |/ e: L
; M8 `. M0 j' t! G
; S. L4 S" e0 _. M i+ B
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):+ k. I2 E p" A' O7 m5 |" E
! |1 M6 z# ]4 q! Xreg [7:0] mem_2d [99:0];2 F; X4 S. H% }% \
* y h" q" Q: p7 y/ sinitial begin
! H6 g" m% `9 o$ H8 g
; D6 m' P& X1 j$readmemb("simu.txt", mem_2d);! B% O# A1 g- D
0 S0 k& r7 W5 w
end- Y' C9 D# z2 I) l: h
, ~: @% F- X% Q( {" Q7 @# G, x7 Y3 t) x
2 j# z5 Z: j0 O- {6 Q% \用generate 的方式(相当于依次给每个元素赋值)如下:/ d5 n2 e, Q" S, b5 ], z' o
5 \+ I/ }; d: [3 U/ Y+ M" O
wire [7:0] mem_2d[99:0];
% c* Q4 J" z; j0 n8 ]4 Y% r
1 c0 D" r6 V% G8 T& m$ Vgenerate7 s. h) j' v4 n1 n' ?8 p
1 a8 _5 G) @$ G5 f
genvar i;; E! D4 ]9 m3 o6 D4 o4 `$ M
y% e* i/ A8 n1 x7 }/ @0 n' f+ R
for(i=0;i<=99;i=i+1) begin : BLOCK0
5 U9 I |( k( u5 P+ B
4 f6 h4 @! ?: \assign mem_2d[8*(i+1) : 8*i] = i;/ O1 a: F* J! w- l5 O Y
2 a" D" B+ L7 a/ M' P9 @7 A
end+ D0 o5 B7 C9 K; W3 W
$ [) S" C# i4 K3 f
endgenerate
9 B9 L6 ]/ m0 d9 T0 ?1 O8 j2 T0 {
也许大家会认为可以用如下的for循环来初始化数组:
. _5 C; x3 K/ s8 u
3 Z/ @ q$ v' W2 nreg [7:0] mem_2d[99:0];: w- m. X2 h* J- g; B7 c' S
) |3 M! J% r1 L. ]. K0 @# u- Jinitial begin5 |% H) N8 u! O! F
6 v) S: H6 ^' g* G( l4 q
for(i=0;i<=99;i=i+1) begin
; h2 Q2 f% V# Z5 z8 j1 q+ b1 T" M( Z
% a: E7 e0 ^: nmem_2d <= i;; {2 w4 i: x- ]# s6 J% c$ t
# i- j- n$ H, ~- ^+ g1 ]5 M
end
, z1 o" R6 f! w; D! i9 ^ o& i1 |7 K, \) t
end% }; \/ s2 Y6 |" V, W4 N; C& h
" W* v$ U$ R ?" i但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。
+ ^6 I3 Y$ S6 [! I' H* `7 V, }/ Y8 B6 M--------------------- 2 v0 a1 d8 o7 Z7 S
作者:carlsun80
3 R8 c7 V6 i+ D2 i% k& i6 o, V/ Q来源:CSDN ) V0 l* ~; P; N, w
原文:https://blog.csdn.net/carlsun80/article/details/77726060
* G3 z$ k6 o1 k5 m n6 V% K版权声明:本文为博主原创文章,转载请附上博文链接!& j5 Y1 e# T$ _, M1 }3 K4 A1 Y( W
[: \6 I6 b+ x" p% R# ~) {
|
|