一乐电子

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

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 4446|回复: 2

【verilog语法】二维数组

[复制链接]
发表于 2019-4-12 17:19 | 显示全部楼层 |阅读模式
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。/ l, P5 l( ~) H- |" S& X

4 |& o/ X5 [; Z3 L' I- }+ S/ O9 k( a; Q* L2 W' n% b$ y& Y) u4 B: M3 e

/ b; {' U2 y6 u" c6 Q5 F: u0 x二维数组作为输入输出port报错
6 I  u& ^0 x+ ]: P$ u9 G作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):+ J! ]4 G; }" M; T
' U0 g5 c! l! m% H7 [
task s00_axi_write;* t9 }$ V! G8 H  ~+ j  |

' X* M0 H: c5 I7 K) minput           en_write;. F$ B- V( K# M% m  I- ]
4 ?  q- }- f: Y: c, Z, ]: _4 D7 f4 ~1 o7 @/ g
input [31:0] wdat [255:0];& |5 C+ x3 I+ p) ]# |

% _; O  k, d! {" S/ B1 k/ Dbegin% s% y9 I) ]* A! b8 Z  r/ u
7 q6 K; O0 ~. a
@(negedge clk);" @% ^: Y7 ?1 u+ H
% X8 [) a+ c+ p- o5 \% T" y  E
if(en_write)
! f: D6 \  k% j; k( @9 {' Q1 j- i) o
s00_axi_wdat <= wdat[0];
7 i, v/ ?* ^; X, X" T/ D% G1 `
* H2 C/ f6 F0 t( _8 G, f2 S( Fend0 ?' v8 N( `/ X3 B) v; j
8 L3 @; I2 j; ^0 x5 v: M- O
endtask" v' I( n( F! B1 v+ Q9 m" X
, l8 x% Y1 j$ @- q2 R
如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:. P+ N+ \- K$ g# g% O% D  X+ x

. B* {: D' s4 P3 {) i
5 v8 |4 ]) H6 ttask s00_axi_write;
5 V6 s% D) f7 G, J1 q# @/ R5 N4 _( [( K( v. C6 J  [
input           en_write;
2 f* j) U2 ]" P+ w- c2 w. O# }, M) K3 }! K  X0 K9 ]6 T  e
input [32*256-1 :0] wdat ;
' W4 }- A4 z9 O6 v' V# i. Q, S8 l' ]# C0 b' S6 T" a
begin; {# E  F8 n+ o4 @- o
5 |  P( m! m- h0 F) Z  b
@(negedge clk);2 Z  Z2 c$ X# |: e$ ]" u; O
$ u2 q% f; a  V2 w
if(en_write)
; i) s6 y" ?8 ?7 P9 s+ A- {: h
0 m. L/ d9 }  n& Z+ hs00_axi_wdat <= wdat[32-1 : 0];
' q( b) s( A1 ~3 h- Z8 O9 l
5 M# h4 q- T* D3 ?# [# V; Aend& |7 q+ P4 C0 J- K% Q" U% m# e
( D# p$ L5 {- s2 t  v
endtask
" ~( E/ X2 D( Q. G
5 ?8 c2 \( O/ _  M; e7 h
( s( H7 D) p0 C) z' J2 y+ Y2.二维数组初始化: k) k+ L  q: C0 v
% a+ d6 b5 p  L# A
' g7 X) o; s% f: O
如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;
0 c9 W) `0 C2 u9 v3 I8 @# p; k* S% n8 ^; ^1 \5 S

' |2 n/ u! m9 B' u7 K7 n9 ?8 d4 X0 z
; q3 Y* E7 E/ r) S1 ?! [9 h用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):
" C; v% [0 d# P+ H8 |5 Z. O- E. F2 R9 }
reg [7:0] mem_2d [99:0];
+ G$ [$ P5 [2 L' F8 i+ w9 s. l3 c" P+ m, Q. `. W* _4 H" s/ D
initial begin" @9 p- u* X0 Q2 Z: E

. Z9 h  |$ W% D  ^$readmemb("simu.txt", mem_2d);8 E& l0 d( ]: R6 F5 r9 [: L+ Y
1 f2 Z7 Q+ y5 ?! r
end! \8 a% \5 I# v2 {; J
' `/ i( L9 n$ j; ]* X

/ B) y; l2 O* \* Y2 K' @9 T  d/ D  l* E& S# ~; A* |% ~3 E
用generate 的方式(相当于依次给每个元素赋值)如下:& Q/ a- X! t5 A7 z0 U$ K& x7 z( z) }7 {

# [$ U9 y+ ^- uwire [7:0] mem_2d[99:0];
3 x- i* C4 x; `4 ^
1 p+ f  k+ _3 J4 `/ Kgenerate
' H9 k2 P( Y! c/ k6 A+ g
; [9 W; j4 [1 _) D6 T' y+ e1 |0 ggenvar i;: P/ m- B) ?/ j1 J' B" y. S

9 ^5 d& l1 Y# v( R+ }9 mfor(i=0;i<=99;i=i+1) begin : BLOCK0' ?8 T1 M. N) X+ p
1 D$ R- k8 g6 _) I' L
assign mem_2d[8*(i+1) : 8*i] = i;0 e$ e6 M5 r- h0 c
1 ?! Q# Y1 k( G- n& S
end
: l( f, P# Q9 r! g6 }$ w- k5 g" g* B4 x; ]4 F" X; l
endgenerate
+ U  Z! D5 O% ^' h. z1 x
6 t6 B# v& |. M( t+ e7 }也许大家会认为可以用如下的for循环来初始化数组:
# G$ I0 r- b0 z  e( F: o: x/ e4 G& \) T* _3 `# |. ?
reg [7:0] mem_2d[99:0];
2 w: B& Q* U# A6 O" V, O( j8 S. `1 t3 h5 Q: M% x1 V, x# e' \
initial begin
; b0 A, ]% u; [6 G: K+ \6 M- O4 ^1 `9 S' \% X8 X
for(i=0;i<=99;i=i+1) begin
2 ^/ b& n* n% v0 S9 K  l0 `0 h: R1 L8 _
mem_2d <= i;
4 d3 W# Z: M: b9 h4 F3 Y
1 }9 o+ S# @; j4 Y) H1 `$ m7 P2 gend
8 e1 ?$ F' M5 T. s1 i0 T3 @6 |  v' [& \* k
end& J) B  s0 q2 `! u) t
: }5 h" f( h3 g9 N5 k/ P
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。% t* v" i0 ^. u( D
--------------------- $ ~6 O* J& }" P, o5 N
作者:carlsun80 * E% O  j* p" k* G/ O! C7 p
来源:CSDN 3 Y! R( P: R! H8 [5 U' n
原文:https://blog.csdn.net/carlsun80/article/details/77726060
5 k* D/ @$ M7 B7 b% V版权声明:本文为博主原创文章,转载请附上博文链接!9 @. y2 V  S2 \% a8 T, B7 J& U
6 L3 H0 |5 h- d+ l4 O2 P) L
发表于 2019-4-15 10:07 | 显示全部楼层
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。) L% ?# n5 r7 e; [' M/ Q. v
一把电线是不能保存数据的,输入没了,线上的值也没了,寄存器才有保存功能! n9 V, v' q7 p% j9 X- Q7 s/ t9 B
这种for循环一般都是不可综合的,用来在仿真的时候写激励
) h% j1 i+ ]% [完全是用软件的思维在设计硬件

点评

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

使用道具 举报

 楼主| 发表于 2019-4-15 11:22 | 显示全部楼层
本帖最后由 kenson 于 2019-4-15 11:24 编辑
# c3 k' I9 S8 x2 w/ J
wlianmin 发表于 2019-4-15 10:07
) V3 z; l# Z+ R. ]把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。
- `$ d. J+ M9 ~1 O一把电线是不能保存数据的,输入没了,线上 ...
3 G. I+ t. G6 N4 J
for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,当然最好是用在reg上。( d) v* {7 Z: x- W8 Y+ \

, J( h5 ^7 r3 a# \. y, u
回复

使用道具 举报

本版积分规则

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

GMT+8, 2025-8-20 08:58 , Processed in 0.047121 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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