版主
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。
+ X6 V5 i# Q/ T' ~ C4 v- s8 ]. n4 Z' I6 S7 _" G! ^' r) J5 z+ T
* j# k/ d- h6 s% k; M3 ]7 Z
p# h6 W# U; ~, i( S/ }二维数组作为输入输出port报错8 p2 F Q4 X7 @5 X
作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):1 m8 a1 `6 Y$ d) S
' I6 I( X/ y. x6 y; ~; \8 f
task s00_axi_write;0 Z, \6 B" K0 d* H8 c, y! O5 |
3 L# e- R% \3 W- `$ S* @, Tinput en_write;
$ s3 t7 B. J. E5 D$ R
7 Z/ I" }. k! b" vinput [31:0] wdat [255:0];2 o# J$ d" R' M* D, m% Y2 `
- z4 T* E5 F ~4 B5 i' k& X4 h: V) ]
begin
7 s8 @ s6 z2 M- W% o# z# [# k" n1 Y: l* Y% G; x' C( t
@(negedge clk);
1 O4 k+ O% k0 b3 l4 C+ }! V& o: u$ ~5 c) w, d
if(en_write)
& o7 F9 x2 J2 R: w' t' o
' B/ i/ Y' I8 |% P' Z* Ms00_axi_wdat <= wdat[0];" ]% R ?) A' v8 J& t
y5 w7 j6 ]6 oend
5 N% t9 {: x" W& ?& P% f" n, U1 G4 [
" ^- V% s; s$ n. m2 [7 Tendtask
# L; Z0 N% N3 w# p8 C% b' h( E7 o# x! C
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:5 W$ a* v6 |7 v: i( F9 l
+ g; [( S) R7 j% \! @! F/ X5 u' ^$ \* S7 K. T
task s00_axi_write;
( M( W9 N# f# ?# Q
4 l: M) w o( Ninput en_write;
6 S* x2 |- K3 {) c% @ k
) ~ I! e2 j4 t( g/ Finput [32*256-1 :0] wdat ;
! \! g9 n% q8 @* `% _* p( ?4 K/ F/ c3 ~- @% h7 a* {% e/ g4 W* }
begin! t9 }! G4 t. m7 a: a0 I
7 _( R8 i& x1 a( ^' g@(negedge clk);
% Y! E1 ?9 V4 T, z
1 ?& Y7 l1 _7 F0 i0 t7 V& a3 Vif(en_write)6 y6 v6 u5 D- _5 M. T
5 I: A5 N% s' os00_axi_wdat <= wdat[32-1 : 0];8 o+ t' F+ Z1 P$ c# [3 y$ Y; \3 F4 d5 H
5 Q3 D) l0 ^: C! S8 Q, e
end& {% n; b& r; \
1 x1 @, @) W) Y
endtask
6 U. G+ R3 ~, L: S) C: u4 N: B9 C1 y0 }# J* v( a4 J. B! f- x+ W
0 D+ s! z+ P& x h, H: o K7 i/ N
2.二维数组初始化
% _$ @: g/ _3 j6 a, r" _( r# O$ v+ n& ~" y8 k! X$ l
6 b6 f3 {% r: M# W J) m. ^如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;) n% Y' ?: K5 o6 C4 d- W r# T$ c
' r! O6 K* x# G
. v2 a1 P. C8 x+ Y# e" ]) I9 i
1 d% r. E! ]. L2 @1 N7 |用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):0 |$ k/ E5 u" G k* O) Q' {
# n8 m- O% C/ x& d* u, treg [7:0] mem_2d [99:0]; h: {! l" T, g( \
2 q( ~, `) H0 P6 u% Z5 [- @2 s( }
initial begin8 f3 N K" z0 w* U1 p6 T+ X
+ v, Q! _1 O2 O7 i; a
$readmemb("simu.txt", mem_2d);3 B8 ^0 f* ?7 P2 h
% ^) k; P5 M6 @3 |& g
end: l" n; c5 g4 g P3 ^% j9 x/ S& Q
& r' j3 j$ X3 ?7 b7 f
7 l9 Z5 a! @1 C, d4 W* Y/ d. r: z' F# |* r; Y
用generate 的方式(相当于依次给每个元素赋值)如下:
. s4 A1 r8 g* J5 l) k2 C" Z/ {' ]' T
wire [7:0] mem_2d[99:0];' I9 V5 n9 l! L* O5 @. ?
3 }! D7 B; S1 P% b
generate$ [9 Z! G1 q0 w# D1 R0 B
7 O, F, a' ?, G {) K4 p
genvar i;
& C/ R, C- ?# h) S# L# Y! f
0 m$ n1 ?2 g& x: gfor(i=0;i<=99;i=i+1) begin : BLOCK0
1 b1 l, J/ B, |: i7 |) T
: u& R% z+ h: {: h7 d6 q6 V+ h; m& qassign mem_2d[8*(i+1) : 8*i] = i;) h; L; U# K8 `- u2 x2 |
- _& }, N4 p$ ?# o/ U8 S
end1 e% F: D* \4 e+ o8 F9 H
0 c6 z+ Q; i% p* y& x0 l9 v' _; I* W2 |) O
endgenerate
8 I Z. }* W) h, x8 G& l1 F# F# N+ I1 K6 w. L+ f
也许大家会认为可以用如下的for循环来初始化数组:
' v0 ~, ?2 d/ l6 s* M/ J `9 x9 y7 X. ]& z# |5 E3 u
reg [7:0] mem_2d[99:0];
6 A7 X6 o9 F7 s, K+ p& [& W$ z6 P3 a$ Q! t: j7 T
initial begin, [* r& |7 H6 d8 i
# K- A; l# q( A nfor(i=0;i<=99;i=i+1) begin
/ E, M8 \0 S1 i |! }; l9 \
( ^/ n% q3 K* z3 B! N$ B' Ymem_2d <= i;
! b7 e- C o0 t X, I4 ~5 u0 Z
end: H+ m7 [5 x) S# I
1 d d8 K/ J6 @2 [3 @" G6 ^end V9 [) m. c& r, ~* w
+ ~$ T# v+ e$ v/ N# `2 L" D
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。
9 F% h3 R# C q( F. h4 ^* O--------------------- * ~# `! D! f& S* I4 p( e
作者:carlsun80
- j6 |" ], G2 a% a来源:CSDN
! u v X5 S& @6 P原文:https://blog.csdn.net/carlsun80/article/details/77726060
0 x5 U2 Y4 t5 p' ^' L版权声明:本文为博主原创文章,转载请附上博文链接!
' Q& N% B5 L: L9 m, i( w; ]6 J8 M& V- ?) B# ?; R5 j+ `
|
|