一乐电子

一乐电子百科

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

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

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

【verilog语法】二维数组

[复制链接]
发表于 2019-4-12 17:19 | 显示全部楼层 |阅读模式
verilog中二维数组使用有些限制,比如不能作为module的输入输出port(如果确实有需要,只能用将等效为展开的二维数组的一维数组来代替了),另外二维数据初始化时,目前看只能用读入文件的方法,或者用generate的方法对二位数据进行初始化。3 I% j5 F8 N2 y3 G, `
/ @2 ^* N7 x2 y7 X8 g  m- A

# g: O+ a. |: A8 b
& }& R8 o8 a7 P: D6 b) }二维数组作为输入输出port报错
$ f* B  [* r  l  T' _, p作为输入输出port的一个例子,这里我写了一个有传递参数的task,用来做一些数据初始化(根据传递参数):9 B- I  v: J% r3 P" f4 m  O- h

7 ]1 ^8 n% ^6 S9 r9 q7 [1 X  dtask s00_axi_write;
4 Z* J+ B' R" B6 G9 V( T
3 }6 p! J% O2 N. n# `+ D/ Xinput           en_write;
9 _( ?/ J1 K! C& V
; V' M* |) t" D% h; ainput [31:0] wdat [255:0];9 b' j6 C7 K" i

; [3 F3 ]0 d2 o$ o- Hbegin
! _$ j2 w9 f, A/ M& d6 |
) X2 u7 X$ a. u# t@(negedge clk);
  s" K- {1 m! _5 U! S( M1 W+ }4 [4 T& w3 [5 s. K; g
if(en_write)- @  X, b" R' o3 F- X
! D- j- l3 ]! k+ Y
s00_axi_wdat <= wdat[0];  ^+ B! s+ x2 C, N6 \1 Q" O

3 N/ a0 T9 |9 [end
; D  n  e2 H, k
  y* C; m! O$ u) t* q; aendtask
5 ^) L0 g! l7 h/ {  K. d8 |
% n& o! ?8 `& y7 u如上面一个简单的task,输入端口中有一个二维数组,用modelsim编译时,会报错误,这个是工具对语法不支持造成的,修改的简单方法是把二维数组输入改成一维数据传递进来,修改后如下:
$ W- K" J+ q, G7 X6 m6 D* j) k4 r/ p7 x/ j' l

4 \" ?# ]  ?2 P8 |% j  s, ztask s00_axi_write;! W* C. _8 g+ {( z. T: [$ a- R

/ J* u5 @" X2 ]" a% c9 Ginput           en_write;) E. J2 K; x0 |

- H' n1 f; y7 B% ]; U4 t) h4 Finput [32*256-1 :0] wdat ;5 W9 o3 S1 f3 ^0 d( p
4 l# O$ D9 g% r$ y" w- C% V
begin
4 w9 @+ O: c% T% F; ^7 t3 ^, B. m
* l" b5 ~0 C; Z. a  k  M@(negedge clk);
, `- `- M/ A  ^9 ]0 [4 ^7 R0 j& d- p) m) ^* H5 F& N, ^
if(en_write)
- ?. o1 R! `' [
+ _, |/ E! P7 ps00_axi_wdat <= wdat[32-1 : 0];) i; Y. `9 v" ?1 j
/ K% ^0 G3 ~  X1 ?+ S7 @+ l9 b2 S
end
/ B6 d( x8 z$ }8 [5 Z" p0 x3 V1 |: i6 {
endtask
, Q0 h2 s- V1 \0 E' T& L  Z& C- p( `( i8 D4 |* z
# i* H! q: Z, w; a
2.二维数组初始化( A) }& V1 f4 O$ o5 w1 \- S
0 ~2 d! \9 o3 l4 X

+ N3 B/ ]8 x3 ^2 W0 p如果要对二维数组初始化,只能用read file从文本文件读进来的方式或者用generate 来对数组初始化;
5 ]$ k, r: m" j; M# ?
% P# u$ q3 j  m
/ q  b: q9 d. P2 n% h" u3 _$ r: U3 q7 U4 H2 o
用read file的方式如下(文本文件为2进制,每个数据占据一行,例如11001111):
4 ?; N7 O# d' z# f3 w1 D7 i- e5 `) _- H. X3 q
reg [7:0] mem_2d [99:0];  M) [/ Y  f/ L/ H$ n( n" x

9 `6 k  Q$ d$ g; ^$ ainitial begin
# H. y( z7 ~/ c- ]7 v
# S4 n1 ^! Y0 ?4 J. z, {- @$readmemb("simu.txt", mem_2d);1 C- m6 K! d4 J$ A# N9 m. V

0 Z( o, f7 i. o% T4 jend
7 k! l3 e; l9 K) m5 S! @3 a/ Y# r, V: ~
/ _* h- Q+ f; H

3 y  ~! p) f  h% T8 d1 J用generate 的方式(相当于依次给每个元素赋值)如下:
4 L  l3 P; c; b1 F2 t3 Y8 G# _" q2 q! K9 @- a
wire [7:0] mem_2d[99:0];! K4 C9 k9 p/ A. G1 k! ?) X

* D0 l& a1 A  F8 Lgenerate2 u; @1 T" Y2 E' c0 J
) k4 q$ |+ q; j5 H6 }
genvar i;
( n8 N/ F: e1 w1 C, [* H0 I: ^- N& D5 m% a: w% C# v8 v
for(i=0;i<=99;i=i+1) begin : BLOCK09 e1 ]0 a4 a6 Y; e( ?9 B8 ?3 S9 P
  }) j8 g  C2 I8 j
assign mem_2d[8*(i+1) : 8*i] = i;* [( `! P! l4 }; ]

. g9 w/ ]$ W1 t, e7 s) s  gend
( w; k: w  f/ E0 y# Y/ F1 @
3 ^( t+ A8 j/ p  U/ Fendgenerate: o* S. Z2 n, b. K

- a. G" O* U# L5 I也许大家会认为可以用如下的for循环来初始化数组:
5 v' I1 o4 Q) M  k* w& E3 f& J
3 e. {0 B* Z' O2 Xreg [7:0] mem_2d[99:0];
9 T* e" r& Y3 K: R  B+ _$ y: p# w* H' p
% ]* f* \- ~9 P, v+ binitial begin# c6 T" a$ i' h6 `

( K9 F" M4 y$ h9 N- [( Z! rfor(i=0;i<=99;i=i+1) begin
' D9 B; W) f+ l
  A: S/ e1 h# U' v( M3 h( cmem_2d <= i;
+ Q3 z' H1 _1 k$ r) ]( k" |
1 e1 v5 i8 X6 F+ z  t: B& Y7 E- g7 Jend
4 H6 x. `7 A; l8 E! F6 p0 v  D
: {6 _" M4 F. J! Kend8 d( B: t2 j3 Z1 E' Y! A+ y- G
- J" z# j; `' m* m
但实际modelsim编译时会报错误,会认为mem_2d应该是一个已知数据,不能用变量。7 G: {* V% S5 n  z: Z* V- d  N& [
--------------------- $ ~$ U1 s9 [* z+ {  [
作者:carlsun80 0 Q0 H  i/ e+ \# W/ W5 z8 J# V
来源:CSDN
0 Z/ s6 ?. b0 D2 k! h原文:https://blog.csdn.net/carlsun80/article/details/77726060
2 b' x& n& w7 z! X版权声明:本文为博主原创文章,转载请附上博文链接!7 v  r0 ]  ^! j
- j- p4 y; m! \% `6 D6 m, u
发表于 2019-4-15 10:07 | 显示全部楼层
把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。! T/ K0 |' e' J) r
一把电线是不能保存数据的,输入没了,线上的值也没了,寄存器才有保存功能
& p. R0 w- l' Z这种for循环一般都是不可综合的,用来在仿真的时候写激励! O7 U9 C- c1 p- y9 u( _/ u3 ^
完全是用软件的思维在设计硬件

点评

for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,只不过是用在input 上的,当然最好是用在reg上,它只是一个例子不要太认真。  详情 回复 发表于 2019-4-15 11:22
 楼主| 发表于 2019-4-15 11:22 | 显示全部楼层
本帖最后由 kenson 于 2019-4-15 11:24 编辑
+ e( y1 R0 M& ]( O! x/ v
wlianmin 发表于 2019-4-15 10:07
3 X1 s7 ?4 Q# R3 C6 {: E1 ~把wire当数组讲也是醉了,至少也得是reg型的才能称作数组啊。8 h' B3 C2 U7 \7 z3 I: o2 U
一把电线是不能保存数据的,输入没了,线上 ...
8 l* Z+ H) g2 N3 ^3 b
for 是可以综合的,vivado上的verilog已用上好多个for了。还有wrie当然也可以用上二维数组,当然最好是用在reg上。9 S& q: B$ ?2 `, g8 E1 L* L( u- t5 J

$ z* h! {, C# X9 k7 Q

本版积分规则

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

GMT+8, 2025-4-28 09:28 , Processed in 0.043529 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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