一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3171|回复: 2
收起左侧

【verilog语法】二维数组

[复制链接]
发表于 2019-4-12 17:19 | 显示全部楼层 |阅读模式
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。
% E1 v8 l- B6 k! ~/ ]' `" R; E$ `2 u  c" ~' ^
2 L! R3 a4 M, W. W
/ M% w2 w# N6 Y* `' P
二维数组作为输入输出port报错
) ^( z' d) c5 _. ?3 t) j作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):
$ m5 h* R$ N* m* g
9 Q; B  j; n# V7 T; s- G% A3 otask s00_axi_write;! B4 {/ z+ t8 ~2 e

/ l4 p7 f3 I# p2 ainput           en_write;
' z% O& d# T- y1 D
/ x; R$ t! M$ B; Binput [31:0] wdat [255:0];/ M' r$ |0 T  q) q3 j

% r/ }! E  M( {8 f2 tbegin
8 S! {" q1 r# c4 |
  x+ `! D! A+ T7 l+ O@(negedge clk);
: a% H% R6 O0 L- @" h% {
) v, W/ F1 V" F' G/ @' wif(en_write)
" X: I& f* B+ K* F( s* F9 f$ A; ^/ ?! s) f7 h) R' I3 W& E
s00_axi_wdat <= wdat[0];+ Q4 e8 r* e2 D' d/ S

7 u! H7 c% }3 _: c- n6 M" Iend
- s) g: V( _+ W& x0 l" P' F
* ?( i$ N; Y2 r2 Vendtask
/ C, w, z& n5 s% l- Q1 m. x2 c1 W; L8 s" E2 e0 r" }0 F
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:2 g9 g8 W# U  X( K( q0 Y
9 s! `. ~& F- h2 y- X
3 \8 T. R- @9 @/ A6 s! r8 d
task s00_axi_write;
0 E/ ?# Q. T0 N2 E" O7 b* Y2 n, ~. c8 [, w8 R
input           en_write;+ I- B* }# d$ _5 C  E
; }2 G0 c' a. k2 O. b
input [32*256-1 :0] wdat ;/ F, n; e- L+ v4 C; Z

1 m/ ^# i( n% N6 s& Tbegin
# L5 E4 k7 D; v- l0 H
+ f4 W7 d& C/ ]/ U/ n% h) ?: N@(negedge clk);
$ l+ ^- R- {+ W- m/ M4 I! a
# Q- I6 M  e! b4 r: u! d) m0 kif(en_write)
  M4 R1 {! t$ H: A( j4 y" ?% a: ]7 `$ n
s00_axi_wdat <= wdat[32-1 : 0];4 W- k8 r9 d: N' J

! {2 U% ^1 R2 Kend
2 D; |2 Y7 H: F4 N) {, R) G8 e  k1 T/ a3 U
endtask
4 Z2 b( K# y5 M7 }4 o& }2 l  l3 X5 _7 z' Y% h) `

1 x4 R% ^2 c/ a2.二维数组初始化
  o3 w1 z' c; E9 y; B" T3 W/ P4 i/ ?% X

4 p) N" k$ e8 k) \7 w8 X" R' U- u如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;5 L4 P% \" r8 f* {0 D8 x8 k
) X3 P' |/ e: L
; M8 `. M0 j' t! G
; S. L4 S" e0 _. M  i+ B
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):+ k. I2 E  p" A' O7 m5 |" E

! |1 M6 z# ]4 q! Xreg [7:0] mem_2d [99:0];2 F; X4 S. H% }% \

* y  h" q" Q: p7 y/ sinitial begin
! H6 g" m% `9 o$ H8 g
; D6 m' P& X1 j$readmemb("simu.txt", mem_2d);! B% O# A1 g- D
0 S0 k& r7 W5 w
end- Y' C9 D# z2 I) l: h

, ~: @% F- X% Q( {" Q7 @# G, x7 Y3 t) x

2 j# z5 Z: j0 O- {6 Q% \用generate 的方式(相当于依次给每个元素赋值)如下:/ d5 n2 e, Q" S, b5 ], z' o
5 \+ I/ }; d: [3 U/ Y+ M" O
wire [7:0] mem_2d[99:0];
% c* Q4 J" z; j0 n8 ]4 Y% r
1 c0 D" r6 V% G8 T& m$ Vgenerate7 s. h) j' v4 n1 n' ?8 p
1 a8 _5 G) @$ G5 f
genvar i;; E! D4 ]9 m3 o6 D4 o4 `$ M
  y% e* i/ A8 n1 x7 }/ @0 n' f+ R
for(i=0;i<=99;i=i+1) begin : BLOCK0
5 U9 I  |( k( u5 P+ B
4 f6 h4 @! ?: \assign mem_2d[8*(i+1) : 8*i] = i;/ O1 a: F* J! w- l5 O  Y
2 a" D" B+ L7 a/ M' P9 @7 A
end+ D0 o5 B7 C9 K; W3 W
$ [) S" C# i4 K3 f
endgenerate
9 B9 L6 ]/ m0 d9 T0 ?1 O8 j2 T0 {
也许大家会认为可以用如下的for循环来初始化数组:
. _5 C; x3 K/ s8 u
3 Z/ @  q$ v' W2 nreg [7:0] mem_2d[99:0];: w- m. X2 h* J- g; B7 c' S

) |3 M! J% r1 L. ]. K0 @# u- Jinitial begin5 |% H) N8 u! O! F
6 v) S: H6 ^' g* G( l4 q
for(i=0;i<=99;i=i+1) begin
; h2 Q2 f% V# Z5 z8 j1 q+ b1 T" M( Z
% a: E7 e0 ^: nmem_2d <= i;; {2 w4 i: x- ]# s6 J% c$ t
# i- j- n$ H, ~- ^+ g1 ]5 M
end
, z1 o" R6 f! w; D! i9 ^  o& i1 |7 K, \) t
end% }; \/ s2 Y6 |" V, W4 N; C& h

" W* v$ U$ R  ?" i但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。
+ ^6 I3 Y$ S6 [! I' H* `7 V, }/ Y8 B6 M--------------------- 2 v0 a1 d8 o7 Z7 S
作者:carlsun80
3 R8 c7 V6 i+ D2 i% k& i6 o, V/ Q来源:CSDN ) V0 l* ~; P; N, w
原文:https://blog.csdn.net/carlsun80/article/details/77726060
* G3 z$ k6 o1 k5 m  n6 V% K版权声明:本文为博主原创文章,转载请附上博文链接!& j5 Y1 e# T$ _, M1 }3 K4 A1 Y( W
  [: \6 I6 b+ x" p% R# ~) {
发表于 2019-4-15 10:07 | 显示全部楼层
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。
4 i/ i8 \7 C3 A9 i3 O一把电线是不能保存数据的,输入没了,线上的值也没了,寄存器才有保存功能
3 D( Q) Y& j6 F8 i4 C; S/ F这种for循环一般都是不可综合的,用来在仿真的时候写激励
; Y6 c" v" q* i完全是用软件的思维在设计硬件

点评

for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,只不过是用在input 上的,当然最好是用在reg上,它只是一个例子不要太认真。  详情 回复 发表于 2019-4-15 11:22
 楼主| 发表于 2019-4-15 11:22 | 显示全部楼层
本帖最后由 kenson 于 2019-4-15 11:24 编辑
$ c8 `0 y* P" ?) a
wlianmin 发表于 2019-4-15 10:07
9 Q+ N( g& o( x# e2 v把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。: ]5 }7 j4 T3 U- H% U% ^# I
一把电线是不能保存数据的,输入没了,线上 ...
/ b& M+ v4 v0 x( @' J) o
for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,当然最好是用在reg上。
% V& Q  w1 t( h7 a/ T  K# m' f, n6 H4 N0 V; a1 @  h) t3 j& H

本版积分规则

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

GMT+8, 2024-5-21 08:54 , Processed in 0.056251 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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