版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
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
|
|