版主
  
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。% a6 q# F4 c0 j7 W
6 \4 c- }) _/ x5 Y7 h/ s' m
# X1 y% T1 i8 a! l$ E3 B( m; v0 D7 d
( F p4 T& V: b7 G二维数组作为输入输出port报错
F% q6 O# Y) f6 J2 d作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):, k9 y1 d' h' p* `
; x5 X5 l3 F! D
task s00_axi_write;
6 f' K' z) n1 N+ K( K: Q" A$ j
" ?" u% ^8 @9 c* m7 |# iinput en_write;8 H1 _9 g, A) ?) n6 t
' @, A" @" L5 G
input [31:0] wdat [255:0];) m9 _) R! `4 J9 k0 D* n+ i5 R
% F! B# |3 a7 ]2 _# p& ^4 N8 v
begin( _6 D$ W* n4 a4 C7 j& X
( e8 z- K6 V3 D G# {4 Y9 ^
@(negedge clk);
" J I% h4 S! ` O; s) s( H+ f2 j' C5 B& V& c
if(en_write)/ m) y0 a4 a7 g( U) k
4 @! b; Q {6 G& U. gs00_axi_wdat <= wdat[0];
% J$ z6 G9 c$ {
+ G3 ?' a+ k9 d1 g# F' a' Qend" C7 J/ h) f: h, J4 n; S9 S8 T/ y
% g r8 E; T0 e. E5 C {* V0 Aendtask( n& `7 h# B( @2 j) n0 `! I! q. e
( ~5 J' u: r2 [! P如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
9 G& r* s; S5 _6 n5 R1 K
( O8 ~: M6 q# Z9 l! J+ o" d( ?2 U; m$ i# u8 m2 @
task s00_axi_write;3 Y" J* y) b" ?. y; b. C
D. W& }5 D/ B) U: h
input en_write;
. k& R4 J8 d2 n9 d$ [* a+ P. ]3 h) ^8 u2 R2 N* S8 f# g3 |. a
input [32*256-1 :0] wdat ;8 C9 E3 b' L+ i. Z
' O0 I& g) j/ Q/ L% S
begin
) H- Z9 N( N. s" y8 R1 T' S% R1 h' W0 h& T# [+ J
@(negedge clk);
+ X# j" {* d/ E5 V* R6 Y, J2 P: F$ m/ J
if(en_write)/ J/ s' Y* g2 V6 `1 G+ j
F& j1 @5 d2 h: G+ k' ^
s00_axi_wdat <= wdat[32-1 : 0];
$ B1 G; h" `9 G. S+ ]! v+ q3 D, @5 N& W$ z4 w) o7 C7 {) J9 n
end0 o6 C8 j; t& W% Y
, R& T0 k: W- s
endtask
' r. M; O4 I6 C
# G! J3 C* v- {) g$ g6 m+ r
7 E3 I$ a- G. D' u2 }2.二维数组初始化
0 @, c* o( _- \, v0 H5 t' {1 @6 F3 [2 c: K) @! |0 ^
3 t2 }5 z/ }# q7 U/ }- o+ H
如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;
- z9 B- _, f( W1 f0 J- d# i
( u- r' p. I- q
V1 Z3 L* e; D7 l7 ?
8 y; {8 h! i5 Q0 `用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):
& J- {( E' B- b& `' I8 I9 P3 }
8 T- E) ^. U. z5 d6 e6 a7 ?reg [7:0] mem_2d [99:0];
; i) z1 S! T6 `, N3 {3 P5 p# o+ W3 W; y3 C# u2 B W
initial begin
2 _3 t9 F. Y2 k
3 n. b8 D; t) k! x8 T$readmemb("simu.txt", mem_2d);
* l2 }2 O# |, ^0 F
1 a4 j! u9 `1 e% T: H- W/ R9 zend, q- N% o# b. R6 K; {$ ]& A- t
* [1 c5 h! _# {$ s1 t9 x# A' p
! D) L3 R3 M" ^: Y' v
. s: K. h7 y0 k, h( {用generate 的方式(相当于依次给每个元素赋值)如下:
3 v) h2 `6 I, _0 w t0 L5 f w
5 d, e' Y/ X. d& X) swire [7:0] mem_2d[99:0];
* L+ L& O/ C& K" h+ `
; A, ^; W1 d! f; S' Q5 Ugenerate
( p. @! m" A; X5 s m2 h. p8 ?" {- w t
genvar i;
( k, i6 {5 I* |8 |+ a6 ~# }, O4 M. h; D) a; B+ }
for(i=0;i<=99;i=i+1) begin : BLOCK06 p- X( z5 a. P
: |, L3 Y: L- F) s3 Uassign mem_2d[8*(i+1) : 8*i] = i;
( Y0 v5 U: v$ B8 H8 h# m; [4 U; y+ R. f. [( d: z- R- m! F
end0 Y# X0 T$ o5 I/ {- N
8 o" W) ^1 g5 {! g# {" }$ H
endgenerate
: {2 g6 ?' Z0 x5 j
9 c" o) P2 S5 B( ?6 n, C+ C" D也许大家会认为可以用如下的for循环来初始化数组:
( ]6 c. }0 E, _4 c, R
5 R2 u% U* {, e5 Q7 D6 ~4 Mreg [7:0] mem_2d[99:0];
' A1 k) U3 e+ }8 S1 q- J+ v* r O$ n
initial begin1 Z7 @- d9 C; M
5 }. I2 M! Y c/ ~6 g6 d% Efor(i=0;i<=99;i=i+1) begin5 f& ~: C4 p# L
$ @# W* F3 d! ~# ~% }% l* ]mem_2d <= i;# Q- k0 I! W8 k6 s+ A; X/ z+ F9 M
, o$ n }! N3 p$ R- ~; ~* z ^
end* P: a3 ?" O4 U9 L
$ J4 f4 @- T6 x. B" f Z
end1 z' p% k; B- q9 G
4 ~1 q* E% M3 I; T* Y, c, S' N8 @但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。: Q& S& e" U) y& a- Y8 H, |8 \
--------------------- & I; S2 |5 i( E% I1 G6 \. S
作者:carlsun80
' z: {$ k3 A% @3 A来源:CSDN
! [* T9 D1 F; t2 _: R: u4 ?3 V原文:https://blog.csdn.net/carlsun80/article/details/77726060 ) p: `4 x* Y. o O
版权声明:本文为博主原创文章,转载请附上博文链接!
, c) }0 A/ W, z, Q0 y
( t ]2 l4 U8 d( Z$ d2 ~ |
|