一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5261|回复: 2

【verilog语法】二维数组

[复制链接]
发表于 2019-4-12 17:19 | 显示全部楼层 |阅读模式
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。
! P* B, ]6 p8 ^  n; I8 f: ~, M& c, L/ \. e
9 |) d0 O8 y6 _9 b; |' \

4 R6 F3 U  }6 }2 ?, |二维数组作为输入输出port报错( O4 L1 [) x  Z' W# l  S
作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):( W9 m! b6 ~  Z4 k2 Q% \
& |5 E9 [- r  G, g9 Z
task s00_axi_write;
8 `+ m7 X) S- Q4 L2 C" |% ]: y3 D! m" R8 ^6 b  ^) L
input           en_write;
; w& i4 k) u3 h3 h% W5 B
/ T4 ^. ~. k8 A& z9 iinput [31:0] wdat [255:0];3 E$ G+ Q1 ?4 z9 O
' j8 n1 T- Y% n/ x( m. V0 Y
begin
9 g6 u; q& t0 O3 a4 j6 N3 X/ A0 N8 p, P
@(negedge clk);1 W; ?7 m1 d- v

7 r, A2 P5 q2 t# C0 Y4 Rif(en_write)
% ]7 _; y0 D& k- u, o4 d( n; \3 a* d
0 C, {1 F  _" us00_axi_wdat <= wdat[0];
- M: o: E/ W) G. N* w, E& W6 W. l8 u
end9 D' X: c' P: S- M
% a  J$ i. y7 L# n
endtask
+ r1 |: x( }* a3 z# F
* ?+ V! [1 K$ v( @如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:: D7 a% M# [  Y4 B& K
6 N4 O/ S/ H/ F- q1 y7 o

1 K3 C  S" D/ O4 |/ `task s00_axi_write;+ a# s$ E: F( i1 w4 a: r

! L2 y0 V! X# W, l1 q: l: I9 Cinput           en_write;5 w; x6 a: K2 r+ Y/ ?# v5 s3 [

9 L" ]- n, ~4 X# U7 Q& _6 D  O+ y' Linput [32*256-1 :0] wdat ;
  @$ v7 w2 D1 o5 L5 G
* Z9 t; k0 |9 K) W" E+ |% ], p) _! Obegin
  [2 O2 S, O4 G- L0 {9 H- D& i# A
3 l* c4 J" F9 D0 s+ u@(negedge clk);) o/ c* D8 y( ]% ]" }" n/ h
2 @5 p0 O/ B7 w% v  d, F4 U. g" B
if(en_write)& _7 V3 \' K! F3 n' P# M

1 i" F; J9 `# g# g6 M7 Cs00_axi_wdat <= wdat[32-1 : 0];
! S6 \2 A  C$ c( s: z, U! a5 r
8 f7 @" K3 K8 z- Lend9 J" P" Q% I. G) f# |

' D# q( _1 k& Iendtask
/ A- V. n7 d0 R$ ^
) y) p- N% J/ I) K* j
' x1 W1 _+ g3 M: _" N2 T% ~+ R# m" m2.二维数组初始化
2 j" f3 u# ?& ~$ R
  [8 k- j+ D! V4 h/ v
# b5 y* s; O: J1 m8 V: }5 w如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;" Z0 w8 n. t. W

4 z0 \% O' |  ~  m4 B( u. L* ]* [/ E0 T: w5 e
' [+ ]& U; v7 D% Y5 w2 r
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):+ n0 s/ v! f: O! `9 @
. S; v5 x& X3 @) M; T  t9 Z) u
reg [7:0] mem_2d [99:0];5 r7 M: K1 E* D" a2 ]! ~( P

5 |3 W% E4 ~4 f2 Y$ linitial begin, _* h& v" h- E- t
1 M' i% S: w7 ]7 t9 c; P
$readmemb("simu.txt", mem_2d);" r( P# v# W# J8 b

2 k  ^$ y. ^6 k+ |5 Mend: J+ R! ~7 r% l+ m, R
6 c; }) |/ ~, T8 e

. N' F$ n$ m% x" e
# z( v! h: s. c: @用generate 的方式(相当于依次给每个元素赋值)如下:
3 |: _/ r2 N% b" F! t7 C2 T* M
0 c! D) v5 Y5 R! jwire [7:0] mem_2d[99:0];# ~+ t8 F5 S6 t( X0 A8 f; f

5 b8 N! s  y; r- s( t$ \& zgenerate
8 F4 y+ ^# Z7 p0 I6 S* m/ u$ s$ O- l  p! c! j
genvar i;2 |5 g5 }$ N1 F0 Y+ f& \

3 n, z+ F0 n5 x9 \2 U, Q1 pfor(i=0;i<=99;i=i+1) begin : BLOCK0$ _5 J3 l. H+ I; F( {! T( g

0 `: V- m# u2 z* V5 Uassign mem_2d[8*(i+1) : 8*i] = i;
9 l' N9 ~  C! {; S7 z
: X) r; k4 b9 i4 `. V* U' ~end+ ~$ e: I8 D& G" Z* [0 Y

" }8 t! A- o8 h3 r5 J3 v9 Wendgenerate
, k5 b8 j2 A/ c9 W$ e3 Q3 _! V  a* p# f# u! a+ i9 y& c% k3 U; M& b* T
也许大家会认为可以用如下的for循环来初始化数组:$ j0 m6 D7 Q" r) |$ O. r
9 D( Q# {& u, v0 g' f& N, _9 x9 I
reg [7:0] mem_2d[99:0];% I$ [/ B9 ?# A8 j/ i  ?
8 F4 C) q  {; b' W5 y
initial begin
3 `& \+ X) ]$ q& i: {; I7 d
# @4 B% j( V' c4 k7 Sfor(i=0;i<=99;i=i+1) begin  ~' \1 i! N: Q2 S* m

0 b0 m- E8 K# E; o, b, U# Nmem_2d <= i;
; `; W! g. i  Y8 ^8 X4 Z
) E# c5 R9 {7 `- T4 F& ?7 Send9 X: b" ~. @, c$ D1 _  t  p6 C: [

" x! V* P) W7 D" Y: @end
9 H0 C5 ~4 {$ V/ r/ B) m+ k1 p( C/ Q- ~
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。, Z, j' V6 q1 ]5 p
---------------------
1 D1 h4 @+ _$ f  o- }4 z/ z: |: g! R; C作者:carlsun80
# L0 C5 K/ \; [  x" x0 F6 M& a来源:CSDN
& C1 I: y" D' X7 s7 x- z原文:https://blog.csdn.net/carlsun80/article/details/77726060
+ T) f% q, B8 b" ?6 d# [版权声明:本文为博主原创文章,转载请附上博文链接!! F# V1 M8 U) X
# h+ z% d' L1 H; f6 \0 j0 D) p
发表于 2019-4-15 10:07 | 显示全部楼层
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。
  i% A( k6 k: \一把电线是不能保存数据的,输入没了,线上的值也没了,寄存器才有保存功能7 ^- q( r. v4 G2 J# U0 a9 o
这种for循环一般都是不可综合的,用来在仿真的时候写激励0 k8 F2 X: v% A
完全是用软件的思维在设计硬件

点评

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

使用道具 举报

 楼主| 发表于 2019-4-15 11:22 | 显示全部楼层
本帖最后由 kenson 于 2019-4-15 11:24 编辑
; M5 E/ }' g6 L$ O+ Y
wlianmin 发表于 2019-4-15 10:07: p# R" G: `4 ^3 E4 g
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。% a9 E8 D$ N' k9 v- S. K
一把电线是不能保存数据的,输入没了,线上 ...
7 S' w+ Z& _$ F* |  e- d; H5 B
for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,当然最好是用在reg上。2 z) s" X" C# k" I' s& \# o( N
% |0 o2 |+ E" T) @$ k  X
回复

使用道具 举报

本版积分规则

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

GMT+8, 2026-4-17 16:43 , Processed in 0.033824 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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