一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4676|回复: 2

【verilog语法】二维数组

[复制链接]
发表于 2019-4-12 17:19 | 显示全部楼层 |阅读模式
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。+ f! A- G$ h* K5 L& S
% s% v& ?) T/ N9 X
9 T" n" t! C5 M, @

, S0 R6 \( e1 F; D+ |1 H二维数组作为输入输出port报错
: d. w2 a. f3 B+ i' W作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):) ^0 M. ]+ k4 @$ \7 r. ^
. T- Y& e5 v9 ~9 U! d
task s00_axi_write;0 y0 c0 \% ^2 j+ R. y6 C

( U; c5 h5 R0 b5 H: a& h- Oinput           en_write;. y7 }  T$ E# g
  b' D# `' v& w
input [31:0] wdat [255:0];: S6 ?& v! b# Y9 S- B. t6 [9 _

4 ^3 b' {% }( K4 O6 ~begin- X0 E; L" ~8 z' t$ K5 o/ J+ o
9 Q) c8 l' G" _2 O2 ^% D- u9 V" L
@(negedge clk);
4 B/ L" ?  A" b& _& ~' s9 y& G
& D4 m% X, R2 [% m7 Dif(en_write)5 Y1 c9 N( c. K7 l# B

3 @" i$ @7 _0 g9 h, o3 a$ Ts00_axi_wdat <= wdat[0];# D: F6 @1 n5 \& @
/ @3 o, p) F0 g: c+ c: J
end: ]9 _: |+ j$ U- I

9 [; }1 Q$ G$ s. E/ j* l1 P" Gendtask# V3 u/ ]* I' a% F% ^

' h1 A2 F$ w- Z3 [2 ]: k- x如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:0 n& B, B  \0 P3 _- Q: m
1 T- A% x" B* r& }7 ?$ ]; ?
: C% d/ H( u' G) @. K
task s00_axi_write;4 ?2 q" ~. q- r5 n5 E

, B$ n% X5 c# K. ^input           en_write;! o3 Z' {3 c2 S! G% ?+ e( |

  k3 e! d4 m) K3 ]- vinput [32*256-1 :0] wdat ;
' t- Z/ c+ o# x9 ^2 W: O" k! z% j4 i0 y) N. t
begin
, r) y# P0 p: C+ c+ c' [  B/ ~3 N0 s* y1 ]
@(negedge clk);/ j/ m" ^1 |5 C: G3 m! z
# X: o) T( z5 v3 r' R. |. B# ?
if(en_write)& V/ o( k6 g/ \
0 i1 H1 R9 V5 ?, T- m
s00_axi_wdat <= wdat[32-1 : 0];" V" d9 _  g& H/ g/ L* g
; B4 M  ^- Q- L; s9 Z1 C6 u
end
2 d  T4 t4 V$ s
7 ^) ~6 d: b8 v/ a! yendtask
& b7 l* o: R2 v. V3 L$ K
5 I6 m' v: S+ r& @8 X& J( [1 S: L% Y
: a5 Z/ U' E* y% P6 E! _- _' t2.二维数组初始化# d4 O% }& q- A) b7 p1 `7 X" u# T

; `  N# q* h' u/ S4 i5 t: D7 r" z. I! ]6 P
如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;) w1 E2 M2 _9 G) X' B

: Z* d4 Q( L4 V3 x: Q' R3 k
8 I  O3 h0 j% Z- a- G) O. x" b4 \6 d6 Q4 u8 s1 `2 n
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):3 C  t+ o# w/ ]9 k
( ^% \& O1 V: k. t' F! Y' u
reg [7:0] mem_2d [99:0];
1 I- n9 d) r  u2 n6 q
2 s! z) I) |. E7 Q% o# d  |% Q. Tinitial begin
  g  o* a  E4 q0 z" C  t; B' H0 n
$readmemb("simu.txt", mem_2d);$ y3 k0 {% y  e
4 u, v3 L& ]3 q2 k% c) g
end$ `4 ^- D' ?3 J9 t

- w* [. L# _" }( B. L! t% c! A' p
+ [' u( E3 C: T. C7 _7 O3 e! r2 r. ~' n, ^8 O8 H+ H
用generate 的方式(相当于依次给每个元素赋值)如下:, D7 l+ ?4 J' _7 q& L: Q2 n# s
  N+ ]3 T. G7 \4 F
wire [7:0] mem_2d[99:0];
0 j) [$ O1 v* z1 |, `
+ b% f- S+ X8 x/ V' o3 {generate
9 a0 d7 I- L2 x7 e- I& R) [
) ~' E0 @- y; F" pgenvar i;
9 N- E: Y: \6 K/ K! w( [9 M1 W/ M4 s/ X7 m& [7 Q/ z; E8 f; O4 o
for(i=0;i<=99;i=i+1) begin : BLOCK0
, {+ @( d. H- J
- R9 F0 X- O9 F4 ^- a* Sassign mem_2d[8*(i+1) : 8*i] = i;' R5 V) Z3 N$ i, d7 K% ^' T

5 x% Z) v& U8 I' \$ z3 k) c4 B% t* `# Tend
; u$ R6 q* Q/ E7 w3 t( _3 k2 s3 j4 R# o  z4 i8 U% v" G1 @
endgenerate
' g( y5 c  |: F, j# x) @
" o' W$ r% }- y% T# a2 {6 y* B5 @! k也许大家会认为可以用如下的for循环来初始化数组:; ^& j5 J! S) [1 @* i
" [0 r8 \* O9 g& H
reg [7:0] mem_2d[99:0];9 m; w6 W, q0 t

+ E8 O: Y# a+ Y! Y) p$ Tinitial begin" E! A3 v5 c+ M2 w. I" X

! ]# D1 e7 F& _for(i=0;i<=99;i=i+1) begin. p) O3 }5 Q' K7 g! h( O. i6 b
5 B3 |# K9 k) \8 L3 l3 I4 |1 M
mem_2d <= i;
! }; j# V7 h+ L5 v9 n1 T- x
- _' {9 [7 w& K# M/ i, j! yend
/ b6 _0 T; S$ k5 @; w  E& `: H4 J' @
end
' R9 \+ v! h3 p3 W
" Q' }' ~; Z, E3 j1 K  A但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。6 K: y. [3 S# |8 {9 B; G, ^
--------------------- % V9 M* I3 n! `! l5 ^/ i  }, D
作者:carlsun80
2 k! [( i( a; c. \来源:CSDN
$ h4 r4 y" m- a1 V原文:https://blog.csdn.net/carlsun80/article/details/77726060
2 V8 _* g9 v; W0 h$ @0 m$ H5 F- T& N版权声明:本文为博主原创文章,转载请附上博文链接!
5 l$ Y4 w5 D  w, v( _& @/ k% B" y9 n* R
发表于 2019-4-15 10:07 | 显示全部楼层
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。7 D- X4 f, H8 L. f
一把电线是不能保存数据的,输入没了,线上的值也没了,寄存器才有保存功能$ H4 m5 Z7 c: X6 T& m: i
这种for循环一般都是不可综合的,用来在仿真的时候写激励+ r8 T( ?5 y0 z& L# N
完全是用软件的思维在设计硬件

点评

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

使用道具 举报

 楼主| 发表于 2019-4-15 11:22 | 显示全部楼层
本帖最后由 kenson 于 2019-4-15 11:24 编辑
+ K# l: u1 b  g# y* w8 u$ S
wlianmin 发表于 2019-4-15 10:075 ?+ ]# b; {) |" B
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。
2 Q: R% n% h. L( x; L一把电线是不能保存数据的,输入没了,线上 ...
8 O7 q" L# Z: B
for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,当然最好是用在reg上。
# u1 a% o- t- ~, m$ V
7 o7 P) h: k6 [2 C7 ^& _
回复

使用道具 举报

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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