一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4447|回复: 2

【verilog语法】二维数组

[复制链接]
发表于 2019-4-12 17:19 | 显示全部楼层 |阅读模式
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。
; J+ V9 m: d4 ~( e; ^
5 Z6 j: j& u# f- x6 _- b+ X
3 ~5 f7 v, ?1 |: W4 d% n0 W! K' a6 O. {, l. P5 t6 ^
二维数组作为输入输出port报错
* X$ ]4 ^8 `! m作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):7 f- }/ Y% U% J" y4 \/ x2 C
: j% X7 I, _5 Q
task s00_axi_write;
+ |2 x! ]* r/ a0 j: S: R) e' q* `: \: _; n# p! |3 F
input           en_write;3 h  W& a! Y/ B

6 a  ^) t7 m' U0 }9 G% `input [31:0] wdat [255:0];
0 T8 z; q2 L! v  ^" b
0 d* a: ^+ m8 Y5 L! c0 Vbegin8 B) }! P( w1 a
8 z) H  \" ]4 ~: U8 o" X
@(negedge clk);7 |7 t# V( K( x7 j
/ I: q* l0 A( w; t) }1 p, }
if(en_write)
' q0 w! s7 x. O! i7 E9 ^
2 W  `4 d# P/ ], c% r5 y  T" u1 Gs00_axi_wdat <= wdat[0];: ], J, G0 F9 A: t  q
0 f$ S8 E/ i( r: _3 |
end
2 V1 p# S# k! H; c8 q( G! n
8 S% b2 j2 P9 Aendtask) q6 y4 _# b; h$ V! j1 n
$ k( P! s/ Y" A" X! P$ M* J/ U
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
. Z* d7 }/ w$ c5 x1 h( t
. k& Q  f/ h- g8 M* [3 }# V: Z0 q/ ]1 _& K" c: w( \! X+ I3 J  r
task s00_axi_write;2 i% Z6 [5 z( ~7 A% O. M7 W7 I
( b2 m' x/ T- c/ \3 v
input           en_write;
7 V1 F8 f( ^4 a6 m/ M* a
" q' `2 `7 q9 ^1 ainput [32*256-1 :0] wdat ;
/ x% E- l, H+ u1 _/ x) t; z3 L# s  u, l* Q
begin. }3 c- g& e: {) z! P* h. b

; ?% |* B5 ]8 r# Z@(negedge clk);
0 J& b- `& `' R% Y- \" W  _( J. n1 X  A% l1 ]) T( l8 @( F
if(en_write)
2 X- D; P5 [$ K2 X2 M. o
# a* O" ?# k; g; V- Ws00_axi_wdat <= wdat[32-1 : 0];# W" k+ K% o, v. x# o; @2 C: l" x
+ _" E& L! @0 b
end1 S" m. U3 f3 g; \% V. E2 Z
0 `4 a, T3 V) N+ F! b5 n+ a! Q. v6 t
endtask
3 ]& h: F! H; z# B
6 V! M4 f/ m% `  t
& u9 c8 o" r( E# i1 s3 j2.二维数组初始化
/ j( s7 h+ o8 n( f$ s# A9 p% ]3 d2 D- \/ _/ M
* X1 U6 y$ J% u3 p- t5 @
如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;. P0 P; D7 R- k, e5 s- _
% j* I8 f: L, p; C

' w/ j, W) [3 r; v
9 Y  O% S. B6 h  z4 U9 s$ z用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):* m, j/ t$ l: A, j
5 L; C8 H( q( E  W& I
reg [7:0] mem_2d [99:0];
% o$ ?; b' P, O) i0 q* s6 n& \+ ?
4 @9 v+ G& S0 @3 d9 y: U, `1 Jinitial begin
& F: S7 O" [9 Q# G( k& U$ u. R* {7 R8 u2 m  c3 b4 G. s" e9 T
$readmemb("simu.txt", mem_2d);
+ A5 M3 x) T  _  o+ ~( [# X2 S: l# U! N' r) G
end
% g* u( o' [, `0 _* ^* x) a9 G; n
1 t. Q- F, N9 a0 T7 I8 K2 Y0 S+ E) L( f7 u' N" e1 U% ]

+ H" @" x: C) q% U用generate 的方式(相当于依次给每个元素赋值)如下:
! e; [. p2 y. N/ K/ h$ D, Y: B- g: ~; W
wire [7:0] mem_2d[99:0];" }: N5 Y% M- b* c5 Y
" n5 t0 `& f. K6 J
generate
7 s+ k( y7 w0 G& ]4 e0 q% n( N
8 C& z7 Z* [" `4 Mgenvar i;& b: ^9 H8 n( @5 h# V
* e5 {  ?2 _% Q) h
for(i=0;i<=99;i=i+1) begin : BLOCK0
/ m/ [! M9 u8 j$ ?  I, l; ?$ f& x" @# H! m; g" ^/ a
assign mem_2d[8*(i+1) : 8*i] = i;
6 [: @, O4 j; F8 P+ w
% v! s8 f9 m1 `6 t9 xend6 A+ E! o4 e2 B5 V5 T- P# @6 w( @% c

" [# R+ R# f5 y0 A$ b( a. Oendgenerate
; p7 b. L7 B5 G# C& H0 \4 l, Y* [7 ~# R6 H3 H" i2 C
也许大家会认为可以用如下的for循环来初始化数组:* X  m+ d# Q# S0 T5 l8 q
8 y. T, u8 c- Y: I
reg [7:0] mem_2d[99:0];+ w7 H! `+ ?6 B9 g
" A3 g0 Y- w. j5 Q
initial begin& B3 V2 y! \6 c, H

- m4 j& x& u8 U. V! efor(i=0;i<=99;i=i+1) begin; W. }$ \4 s. ?/ V' N

2 k9 G5 p5 g: a: N/ Jmem_2d <= i;3 h, E- Z' X. J2 G: f

  r$ \, w7 R5 x& E2 s3 O3 \& Fend
& f2 O* F  K5 `
1 @  i' Y. Z# D% z3 T0 fend
$ X4 u3 P* K* |" q- j$ C4 f2 W5 Y& c# v
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。
: G. A2 P& j2 _. h( [7 x--------------------- 0 C1 R' x( D6 x$ T
作者:carlsun80 - R% U2 p2 P, ~- w; F* V7 n5 f
来源:CSDN # x% E: m% [2 _" c" V" i  n
原文:https://blog.csdn.net/carlsun80/article/details/77726060
) W" z4 o- Z6 [& w版权声明:本文为博主原创文章,转载请附上博文链接!/ n  V/ P* @3 L* d- c9 r8 ^0 y
2 T1 P; x  U/ t
发表于 2019-4-15 10:07 | 显示全部楼层
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。
6 o: |6 l% u  E4 s) K一把电线是不能保存数据的,输入没了,线上的值也没了,寄存器才有保存功能
% r" ]/ h0 I7 ?( R这种for循环一般都是不可综合的,用来在仿真的时候写激励
& {5 f( r; {, n2 d! C完全是用软件的思维在设计硬件

点评

for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,只不过是用在input 上的,当然最好是用在reg上,它只是一个例子不要太认真。  详情 回复 发表于 2019-4-15 11:22
回复

使用道具 举报

 楼主| 发表于 2019-4-15 11:22 | 显示全部楼层
本帖最后由 kenson 于 2019-4-15 11:24 编辑 % ~4 `* f5 o, `; j6 a5 E/ z- y  j
wlianmin 发表于 2019-4-15 10:07: A2 ~' f3 s2 ~! C5 X" |% k- w
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。
( `% @$ `* T6 i7 c0 v# W一把电线是不能保存数据的,输入没了,线上 ...
8 Z* r% {- E* d6 l2 m8 ~
for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,当然最好是用在reg上。
' O. l  r. Q/ I& m: ?* w% F; k, A: Q# v$ V" R
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-20 09:08 , Processed in 0.031796 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表