一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4675|回复: 2

【verilog语法】二维数组

[复制链接]
发表于 2019-4-12 17:19 | 显示全部楼层 |阅读模式
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。0 P& O: A  H. _4 \! R7 a
; u* P2 B$ ^+ |4 k( H5 M+ A9 a3 q
! G2 R7 \8 z5 `2 V3 B& j

7 ?: }, {( c0 K; j二维数组作为输入输出port报错5 b, t% _( t" r, \- f
作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):
! H) E3 o1 }+ _7 a. ~0 z
3 O( b2 ?2 Z& Z, ^; Ktask s00_axi_write;
$ p9 ^2 R! o* a3 x5 ?0 a* j  O9 I3 m5 e( _
input           en_write;5 e/ |8 R4 F2 z0 j; X
9 l1 n0 B/ H% C+ v! A  c: i
input [31:0] wdat [255:0];
# s2 ^9 i9 x* a6 M; z3 H% k4 W1 k# R% z) A& }4 C
begin% C6 e+ t3 m1 K" }

$ f3 u6 ~3 b: `@(negedge clk);$ Q- n) K( W. f9 N5 {2 T! ~
8 a6 x7 A: Q5 s/ K- m9 u
if(en_write)
: Y0 O+ ~0 }2 H$ a( ]7 k; X  Y2 B
s00_axi_wdat <= wdat[0];
- z2 @! q- P8 C: n
3 K. a7 N; c* i# X. }5 {! Uend. t3 I( [, z6 E( [
! ?# Y6 Q" U3 o- h1 ]8 l" A: P- @" T
endtask
7 f$ J  Q0 P# ?) D( k; a0 @, A  L# \7 G$ g4 ?
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
3 Q) g  U* h! @. T
9 D# J8 X8 N# ~
1 c9 R# x9 W5 f! m4 Gtask s00_axi_write;
" O. Y% N, q0 W6 r" D# h% B! p! b& }- X5 ?+ U/ f, A" g, T
input           en_write;" U% f! D) s; d& W# X( T2 `
" s, D, S. K# M, r* t4 M
input [32*256-1 :0] wdat ;2 ^3 d& Y+ f& F/ K8 o8 F/ ~

4 ?& [- \7 e) pbegin
; U$ \* ?% f' z4 T( H, d. f& V  s! Y( U5 V3 @9 F
@(negedge clk);& U. Z( D0 q  G  i: `

, I: w0 P* C! T9 G! eif(en_write)6 v# }( T% M# ~$ r. v  e
# _% R) o+ ^' w& t) X
s00_axi_wdat <= wdat[32-1 : 0];0 e/ L5 e9 ^  ]& [7 p
  W/ B7 A% A1 @/ g" D" Y
end% N" x# E* g2 d1 y2 ]# \3 l9 X

: O1 w; b5 z9 ~# ]# Eendtask
8 o5 Z9 t7 H# @) ^& b# T6 _* j+ b# f& [) s/ ~& H: k
' k' ]- X1 Y/ @7 [1 |0 J% R3 }
2.二维数组初始化# g+ o$ p  K9 A

/ v6 F5 W5 x$ u% A& K* K: q4 z1 e/ S
: |6 A1 G7 o7 m5 R2 D如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;8 s5 h5 }5 o; s$ `9 t" T

& d! |- |( [3 L/ G+ {4 W; L6 `3 H, J$ L5 P# I' Q

, H) l( v' l) R$ F用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):7 }7 L  j, Y+ N4 _0 |$ ?6 J3 X
7 @) j1 y4 _. }0 R' g3 g
reg [7:0] mem_2d [99:0];: ~- a9 f. |; B! }

% F3 h& E% O0 I  U! Ninitial begin0 U; i9 B* u3 |1 c7 M0 F
4 W: I, |  M/ V% ]2 c
$readmemb("simu.txt", mem_2d);* ?- i# O9 G& w' ^2 h
& N: M& R: L0 D3 h- R
end
& H& r# ^1 ?- P- [) D$ n: j5 h. ^  I

; D- f* C$ q' m' |1 k0 L/ r
! K" {* x5 T7 a4 E% ~用generate 的方式(相当于依次给每个元素赋值)如下:4 g, J# d; P9 Q2 e# M
8 q7 ]; Q. `6 \) R
wire [7:0] mem_2d[99:0];
( Z6 H* o. h) e; O: S, Y3 O) @' M3 ^( r4 C0 s
generate
. e* ?+ s0 v2 w- X# s" W* L8 L
/ n7 i2 B8 P# `: d. |# G0 }0 f2 y3 ^) }genvar i;$ \% Q- E) l2 q; p6 E+ ]
3 C' ~+ g7 _  C7 |( [4 v2 O! u& [
for(i=0;i<=99;i=i+1) begin : BLOCK0* t8 n/ d6 z. J

, z' @8 s2 x# uassign mem_2d[8*(i+1) : 8*i] = i;2 n, Y. D* D( E7 _$ n+ s

5 a/ \! ?* m; v, E! g3 Eend
. `: n. H2 n0 u$ `% M1 u
) {4 l, s! Z, _2 ?# P& Aendgenerate: c" |! R  @- j. J2 L2 f9 W6 d
$ p8 Z' Z* y8 ^" y. W6 y2 `, O
也许大家会认为可以用如下的for循环来初始化数组:
$ E+ T+ a2 Y. z& e
# E6 j/ P5 ^1 t7 r; U8 Hreg [7:0] mem_2d[99:0];% w; w2 B$ d4 @& S! ^' v' q
8 h1 e( z4 @. m* ?
initial begin2 E& Q* i6 j& g  C. G! z% M- h
$ n( E5 F; ?2 R
for(i=0;i<=99;i=i+1) begin, P7 V$ {7 Q9 }9 b4 {# t, s

! K( e) B! Y1 mmem_2d <= i;& l5 s/ |2 B5 z0 \+ t1 S. h

, s! ^- b6 i. W' l! T1 h+ |end
) ~& |' |# A* A  j8 O
8 o4 c" B) o; v% i6 z6 {end
8 v) t: P- l9 `/ k3 U& h5 N' Z1 c1 y6 ~! o$ K* O9 R9 H: r+ l
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。, X2 y# V3 p6 f: M: k
---------------------
4 r' C7 j6 q; ^) S作者:carlsun80 % r; ~) B% M3 S( L. M/ u- j
来源:CSDN . _$ ], a; P) l$ L* H( `& i
原文:https://blog.csdn.net/carlsun80/article/details/77726060 + p$ E+ M" Z: L: O! t
版权声明:本文为博主原创文章,转载请附上博文链接!
, ^, ~: m& c- y$ @  W
6 S7 ]4 k1 D) O3 W1 Y* K
发表于 2019-4-15 10:07 | 显示全部楼层
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。7 C! A5 u( B0 Q! N1 m
一把电线是不能保存数据的,输入没了,线上的值也没了,寄存器才有保存功能8 U2 [, H: H( b( w' m* O
这种for循环一般都是不可综合的,用来在仿真的时候写激励
# o( S8 E5 k( \. L8 ^$ N: V2 z& u完全是用软件的思维在设计硬件

点评

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

使用道具 举报

 楼主| 发表于 2019-4-15 11:22 | 显示全部楼层
本帖最后由 kenson 于 2019-4-15 11:24 编辑
; @& y3 k0 ~& c4 @
wlianmin 发表于 2019-4-15 10:07
5 g# b, f! q- [2 I' n& z把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。# s& i& T0 ~$ o1 \6 s% @0 I
一把电线是不能保存数据的,输入没了,线上 ...
& h& b, x; ?  D3 A1 T
for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,当然最好是用在reg上。
* f( M( w" M( P+ r1 X5 M: V& K5 g; @6 G4 w; D, O
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-10-27 06:44 , Processed in 0.032243 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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