一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

【verilog语法】二维数组

[复制链接]
发表于 2019-4-12 17:19 | 显示全部楼层 |阅读模式
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。
+ X6 V5 i# Q/ T' ~  C4 v- s8 ]. n4 Z' I6 S7 _" G! ^' r) J5 z+ T
* j# k/ d- h6 s% k; M3 ]7 Z

  p# h6 W# U; ~, i( S/ }二维数组作为输入输出port报错8 p2 F  Q4 X7 @5 X
作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):1 m8 a1 `6 Y$ d) S
' I6 I( X/ y. x6 y; ~; \8 f
task s00_axi_write;0 Z, \6 B" K0 d* H8 c, y! O5 |

3 L# e- R% \3 W- `$ S* @, Tinput           en_write;
$ s3 t7 B. J. E5 D$ R
7 Z/ I" }. k! b" vinput [31:0] wdat [255:0];2 o# J$ d" R' M* D, m% Y2 `
- z4 T* E5 F  ~4 B5 i' k& X4 h: V) ]
begin
7 s8 @  s6 z2 M- W% o# z# [# k" n1 Y: l* Y% G; x' C( t
@(negedge clk);
1 O4 k+ O% k0 b3 l4 C+ }! V& o: u$ ~5 c) w, d
if(en_write)
& o7 F9 x2 J2 R: w' t' o
' B/ i/ Y' I8 |% P' Z* Ms00_axi_wdat <= wdat[0];" ]% R  ?) A' v8 J& t

  y5 w7 j6 ]6 oend
5 N% t9 {: x" W& ?& P% f" n, U1 G4 [
" ^- V% s; s$ n. m2 [7 Tendtask
# L; Z0 N% N3 w# p8 C% b' h( E7 o# x! C
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:5 W$ a* v6 |7 v: i( F9 l

+ g; [( S) R7 j% \! @! F/ X5 u' ^$ \* S7 K. T
task s00_axi_write;
( M( W9 N# f# ?# Q
4 l: M) w  o( Ninput           en_write;
6 S* x2 |- K3 {) c% @  k
) ~  I! e2 j4 t( g/ Finput [32*256-1 :0] wdat ;
! \! g9 n% q8 @* `% _* p( ?4 K/ F/ c3 ~- @% h7 a* {% e/ g4 W* }
begin! t9 }! G4 t. m7 a: a0 I

7 _( R8 i& x1 a( ^' g@(negedge clk);
% Y! E1 ?9 V4 T, z
1 ?& Y7 l1 _7 F0 i0 t7 V& a3 Vif(en_write)6 y6 v6 u5 D- _5 M. T

5 I: A5 N% s' os00_axi_wdat <= wdat[32-1 : 0];8 o+ t' F+ Z1 P$ c# [3 y$ Y; \3 F4 d5 H
5 Q3 D) l0 ^: C! S8 Q, e
end& {% n; b& r; \
1 x1 @, @) W) Y
endtask
6 U. G+ R3 ~, L: S) C: u4 N: B9 C1 y0 }# J* v( a4 J. B! f- x+ W
0 D+ s! z+ P& x  h, H: o  K7 i/ N
2.二维数组初始化
% _$ @: g/ _3 j6 a, r" _( r# O$ v+ n& ~" y8 k! X$ l

6 b6 f3 {% r: M# W  J) m. ^如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;) n% Y' ?: K5 o6 C4 d- W  r# T$ c
' r! O6 K* x# G

. v2 a1 P. C8 x+ Y# e" ]) I9 i
1 d% r. E! ]. L2 @1 N7 |用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):0 |$ k/ E5 u" G  k* O) Q' {

# n8 m- O% C/ x& d* u, treg [7:0] mem_2d [99:0];  h: {! l" T, g( \
2 q( ~, `) H0 P6 u% Z5 [- @2 s( }
initial begin8 f3 N  K" z0 w* U1 p6 T+ X
+ v, Q! _1 O2 O7 i; a
$readmemb("simu.txt", mem_2d);3 B8 ^0 f* ?7 P2 h
% ^) k; P5 M6 @3 |& g
end: l" n; c5 g4 g  P3 ^% j9 x/ S& Q

& r' j3 j$ X3 ?7 b7 f
7 l9 Z5 a! @1 C, d4 W* Y/ d. r: z' F# |* r; Y
用generate 的方式(相当于依次给每个元素赋值)如下:
. s4 A1 r8 g* J5 l) k2 C" Z/ {' ]' T
wire [7:0] mem_2d[99:0];' I9 V5 n9 l! L* O5 @. ?
3 }! D7 B; S1 P% b
generate$ [9 Z! G1 q0 w# D1 R0 B
7 O, F, a' ?, G  {) K4 p
genvar i;
& C/ R, C- ?# h) S# L# Y! f
0 m$ n1 ?2 g& x: gfor(i=0;i<=99;i=i+1) begin : BLOCK0
1 b1 l, J/ B, |: i7 |) T
: u& R% z+ h: {: h7 d6 q6 V+ h; m& qassign mem_2d[8*(i+1) : 8*i] = i;) h; L; U# K8 `- u2 x2 |
- _& }, N4 p$ ?# o/ U8 S
end1 e% F: D* \4 e+ o8 F9 H
0 c6 z+ Q; i% p* y& x0 l9 v' _; I* W2 |) O
endgenerate
8 I  Z. }* W) h, x8 G& l1 F# F# N+ I1 K6 w. L+ f
也许大家会认为可以用如下的for循环来初始化数组:
' v0 ~, ?2 d/ l6 s* M/ J  `9 x9 y7 X. ]& z# |5 E3 u
reg [7:0] mem_2d[99:0];
6 A7 X6 o9 F7 s, K+ p& [& W$ z6 P3 a$ Q! t: j7 T
initial begin, [* r& |7 H6 d8 i

# K- A; l# q( A  nfor(i=0;i<=99;i=i+1) begin
/ E, M8 \0 S1 i  |! }; l9 \
( ^/ n% q3 K* z3 B! N$ B' Ymem_2d <= i;
! b7 e- C  o0 t  X, I4 ~5 u0 Z
end: H+ m7 [5 x) S# I

1 d  d8 K/ J6 @2 [3 @" G6 ^end  V9 [) m. c& r, ~* w
+ ~$ T# v+ e$ v/ N# `2 L" D
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。
9 F% h3 R# C  q( F. h4 ^* O--------------------- * ~# `! D! f& S* I4 p( e
作者:carlsun80
- j6 |" ], G2 a% a来源:CSDN
! u  v  X5 S& @6 P原文:https://blog.csdn.net/carlsun80/article/details/77726060
0 x5 U2 Y4 t5 p' ^' L版权声明:本文为博主原创文章,转载请附上博文链接!
' Q& N% B5 L: L9 m, i( w; ]6 J8 M& V- ?) B# ?; R5 j+ `
发表于 2019-4-15 10:07 | 显示全部楼层
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。
1 o! U% s% a5 @; }5 t# g+ D; ~一把电线是不能保存数据的,输入没了,线上的值也没了,寄存器才有保存功能6 a4 e3 r, M( C
这种for循环一般都是不可综合的,用来在仿真的时候写激励/ j+ z, p/ {4 R% W  P/ s8 F6 s
完全是用软件的思维在设计硬件

点评

for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,只不过是用在input 上的,当然最好是用在reg上,它只是一个例子不要太认真。  详情 回复 发表于 2019-4-15 11:22
 楼主| 发表于 2019-4-15 11:22 | 显示全部楼层
本帖最后由 kenson 于 2019-4-15 11:24 编辑
& j. ^0 `9 l- l
wlianmin 发表于 2019-4-15 10:07
  @" T- `7 J8 U9 k: f把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。/ p$ q7 T+ t- e! k" C% U
一把电线是不能保存数据的,输入没了,线上 ...

9 M0 K% W" `- W. Mfor 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,当然最好是用在reg上。. u# d! T" D' g6 R2 K  w
6 X0 n4 N+ ?6 ^+ t3 C; d

本版积分规则

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

GMT+8, 2024-5-17 10:29 , Processed in 0.050123 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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