版主
  
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。3 I% j5 F8 N2 y3 G, `
/ @2 ^* N7 x2 y7 X8 g m- A
# g: O+ a. |: A8 b
& }& R8 o8 a7 P: D6 b) }二维数组作为输入输出port报错
$ f* B [* r l T' _, p作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):9 B- I v: J% r3 P" f4 m O- h
7 ]1 ^8 n% ^6 S9 r9 q7 [1 X dtask s00_axi_write;
4 Z* J+ B' R" B6 G9 V( T
3 }6 p! J% O2 N. n# `+ D/ Xinput en_write;
9 _( ?/ J1 K! C& V
; V' M* |) t" D% h; ainput [31:0] wdat [255:0];9 b' j6 C7 K" i
; [3 F3 ]0 d2 o$ o- Hbegin
! _$ j2 w9 f, A/ M& d6 |
) X2 u7 X$ a. u# t@(negedge clk);
s" K- {1 m! _5 U! S( M1 W+ }4 [4 T& w3 [5 s. K; g
if(en_write)- @ X, b" R' o3 F- X
! D- j- l3 ]! k+ Y
s00_axi_wdat <= wdat[0]; ^+ B! s+ x2 C, N6 \1 Q" O
3 N/ a0 T9 |9 [end
; D n e2 H, k
y* C; m! O$ u) t* q; aendtask
5 ^) L0 g! l7 h/ { K. d8 |
% n& o! ?8 `& y7 u如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
$ W- K" J+ q, G7 X6 m6 D* j) k4 r/ p7 x/ j' l
4 \" ?# ] ?2 P8 |% j s, ztask s00_axi_write;! W* C. _8 g+ {( z. T: [$ a- R
/ J* u5 @" X2 ]" a% c9 Ginput en_write;) E. J2 K; x0 |
- H' n1 f; y7 B% ]; U4 t) h4 Finput [32*256-1 :0] wdat ;5 W9 o3 S1 f3 ^0 d( p
4 l# O$ D9 g% r$ y" w- C% V
begin
4 w9 @+ O: c% T% F; ^7 t3 ^, B. m
* l" b5 ~0 C; Z. a k M@(negedge clk);
, `- `- M/ A ^9 ]0 [4 ^7 R0 j& d- p) m) ^* H5 F& N, ^
if(en_write)
- ?. o1 R! `' [
+ _, |/ E! P7 ps00_axi_wdat <= wdat[32-1 : 0];) i; Y. `9 v" ?1 j
/ K% ^0 G3 ~ X1 ?+ S7 @+ l9 b2 S
end
/ B6 d( x8 z$ }8 [5 Z" p0 x3 V1 |: i6 {
endtask
, Q0 h2 s- V1 \0 E' T& L Z& C- p( `( i8 D4 |* z
# i* H! q: Z, w; a
2.二维数组初始化( A) }& V1 f4 O$ o5 w1 \- S
0 ~2 d! \9 o3 l4 X
+ N3 B/ ]8 x3 ^2 W0 p如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;
5 ]$ k, r: m" j; M# ?
% P# u$ q3 j m
/ q b: q9 d. P2 n% h" u3 _$ r: U3 q7 U4 H2 o
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):
4 ?; N7 O# d' z# f3 w1 D7 i- e5 `) _- H. X3 q
reg [7:0] mem_2d [99:0]; M) [/ Y f/ L/ H$ n( n" x
9 `6 k Q$ d$ g; ^$ ainitial begin
# H. y( z7 ~/ c- ]7 v
# S4 n1 ^! Y0 ?4 J. z, {- @$readmemb("simu.txt", mem_2d);1 C- m6 K! d4 J$ A# N9 m. V
0 Z( o, f7 i. o% T4 jend
7 k! l3 e; l9 K) m5 S! @3 a/ Y# r, V: ~
/ _* h- Q+ f; H
3 y ~! p) f h% T8 d1 J用generate 的方式(相当于依次给每个元素赋值)如下:
4 L l3 P; c; b1 F2 t3 Y8 G# _" q2 q! K9 @- a
wire [7:0] mem_2d[99:0];! K4 C9 k9 p/ A. G1 k! ?) X
* D0 l& a1 A F8 Lgenerate2 u; @1 T" Y2 E' c0 J
) k4 q$ |+ q; j5 H6 }
genvar i;
( n8 N/ F: e1 w1 C, [* H0 I: ^- N& D5 m% a: w% C# v8 v
for(i=0;i<=99;i=i+1) begin : BLOCK09 e1 ]0 a4 a6 Y; e( ?9 B8 ?3 S9 P
}) j8 g C2 I8 j
assign mem_2d[8*(i+1) : 8*i] = i;* [( `! P! l4 }; ]
. g9 w/ ]$ W1 t, e7 s) s gend
( w; k: w f/ E0 y# Y/ F1 @
3 ^( t+ A8 j/ p U/ Fendgenerate: o* S. Z2 n, b. K
- a. G" O* U# L5 I也许大家会认为可以用如下的for循环来初始化数组:
5 v' I1 o4 Q) M k* w& E3 f& J
3 e. {0 B* Z' O2 Xreg [7:0] mem_2d[99:0];
9 T* e" r& Y3 K: R B+ _$ y: p# w* H' p
% ]* f* \- ~9 P, v+ binitial begin# c6 T" a$ i' h6 `
( K9 F" M4 y$ h9 N- [( Z! rfor(i=0;i<=99;i=i+1) begin
' D9 B; W) f+ l
A: S/ e1 h# U' v( M3 h( cmem_2d <= i;
+ Q3 z' H1 _1 k$ r) ]( k" |
1 e1 v5 i8 X6 F+ z t: B& Y7 E- g7 Jend
4 H6 x. `7 A; l8 E! F6 p0 v D
: {6 _" M4 F. J! Kend8 d( B: t2 j3 Z1 E' Y! A+ y- G
- J" z# j; `' m* m
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。7 G: {* V% S5 n z: Z* V- d N& [
--------------------- $ ~$ U1 s9 [* z+ { [
作者:carlsun80 0 Q0 H i/ e+ \# W/ W5 z8 J# V
来源:CSDN
0 Z/ s6 ?. b0 D2 k! h原文:https://blog.csdn.net/carlsun80/article/details/77726060
2 b' x& n& w7 z! X版权声明:本文为博主原创文章,转载请附上博文链接!7 v r0 ] ^! j
- j- p4 y; m! \% `6 D6 m, u
|
|