第二种方法:
: [, b( m/ q0 e8 x2 @+ t3 ]3 u
“网表插入调试探针流程”需要在综合后的网表中,将要进行调试观察的各个信号,标记“Mark_Debug”属性,然后通过“Setup Debug”向导来设置ILA IP核的参数,最后工具会根据参数来自动创建ILA IP核。我们点击“Flow Navigator”窗口中的“Open Synthesized Design”按钮,如下图所示:
3 n+ s! A9 ^$ r! B
$ j5 k3 K) C& ^* {( x0 k" b8 D( g
^2 {' U1 i1 r* c
- G2 y+ X9 ~+ a, Z' [8 c
在综合后设计的窗口布局选择器中,我们选择“Debug”窗口布局,如下图所示:
9 @4 x9 H3 ^& J# y
p- p7 b1 V1 Y8 l8 ]
, S2 a; s. _1 u+ @; L( e8 e) P* y
3 `) v2 X- N" W# ~" b5 \& a9 _
" N; b; Y& }; n) `; Y! Z7 W
此时,Vivado打开了“Netlist”子窗口、“Schematic”子窗口以及“Debug”子窗口。其中,“Netlist”子窗口和“Schematic”子窗口都用于标记要进行观察的信号,“Debug”子窗口用于显示并设置ILA IP核的各个参数。如下图所示:
2 l& L) N! N+ F2 t7 k' w# \
: A6 [) l/ q M. Z# S! [# G; P% | h+ F5 Z O" {% X$ v
在“Debug”子窗口中,又包含两个选项卡“Debug Cores”和“Debug Nets”。这两个选项卡都用于显示所有的已标记为“Mark_Debug”的信号。不同之处在于,“Debug Cores”选项卡是一个更加以ILA IP核为中心的视图,所有已标记为“Mark_Debug”的信号并且已经被分配到ILA探针的信号都会被显示在各个ILA IP核的视图树下,已标记为“Mark_Debug”的信号但是还没有被分配到ILA探针的信号被显示在“Unassigned Debug Nets”下,当然也可以在其中查看和设置ILA IP核的各种属性和参数。“Debug Nets”选项卡仅显示已标记为“Mark_Debug”的信号,但不显示ILA IP核,所有已标记为“Mark_Debug”的信号并且已经被分配到ILA探针的信号都会被显示在“Assigned Debug Nets”下,已标记为“Mark_Debug”的信号但是还没有被分配到ILA探针的信号被显示在“Unassigned Debug Nets”下。
! Y# ?& J3 H& X, [/ {
我们首先标记要进行观察的信号,以led信号为例,在“Netlist”子窗口中的“Nets”目录下,找到“led_OBUF”网络,右击该网络(此时右边的“Schematic”子窗口也会自动地高亮选择此网络,因为“Netlist”子窗口中的对象和“Schematic”子窗口中的对象,两者之间是交叉选择的),在弹出的菜单中心选择“Mark Debug”命令,如下图所示:
1 u S: b& X B7 r4 K
5 L! z: g n' j. O" k2 ]+ I/ x' Y
% \0 h: q; u/ ~
3 d; x( B9 ^$ ]: R$ y
也可以在“Schematic”子窗口中选择网络,然后右键选择“Mark Debug”命令,如下图所示:
! S0 }# H9 m$ v) M, H( x% i4 o
+ b+ O& c3 \( ]! ?) a _4 d( k
' Q4 R+ J/ w' t8 R
* Z- S/ M3 D! i+ q6 S+ }
* ^' R x0 l. o% @
另外,也可以在HDL源代码中为想要观察的reg或wire信号添加“Mark Debug”属性,例如:(* mark_debug = “true” *)reg [25:0] cnt ; 其中“(* mark_debug = “true” *)”必须紧挨在变量声明的前面。这样,在综合完之后打开综合后的设计,counter信号就自动被标记了“Mark Debug”属性。此时在“Debug”子窗口的“Debug Nets”选项卡的“Unassigned Debug Nets”目录下就会出现我们刚刚标记的“led_OBUF”网络。
2 y( {! `3 v& e
. ]; ~- Z; d0 _4 l. G
此时“Debug”子窗口的“Debug Nets”选项卡的“Unassigned Debug Nets”目录下就有了“led_OBUF”和“cnt”两个信号,如下图所示:
( ~; ]% k5 P0 a! S ~
; O. m( M# E6 P; C
+ j, a$ D' _ j- [
* t7 U6 p7 ]2 Q8 Y7 S9 v1 U$ l# ]
之后我们点击“Debug”子窗口中的“Setup Debug”按钮,如下图所示:
: f5 H# [- F6 y1 e/ g
% z" b# R" ?) ?4 t' \& }) b8 |
; G% @ _4 n) C/ D Q) V
6 Y& z+ l& h/ b, w! w
: G# j0 \0 ^( y( U& a- S# K
( k2 F4 q2 G( |弹出“Setup Debug”向导,我们直接点击next,如下图所示:
- Y& Z) i4 q4 z# v0 Q
6 i4 p! o' ~, w3 b
O6 Y% s* H" a9 M+ [& a6 [0 y4 h7 ^* Q8 L4 D
$ q& c7 c/ F. }( Y
4 a" z" b N1 \; `+ q
+ ]( w1 Z+ k( A: R9 ^ N6 @
接下来的页面是选择用于采样待测信号的时钟域,Vivado会自动识别出各个待测信号所属的时钟域并将其自动设定为其采样时钟,例如,我们刚刚添加的这“led_OBUF”和“cnt”两个信号就属于“sys_clk_IBUF”时钟域,并且Vivado也已经自动将“sys_clk_IBUF”时钟设置为了这两个信号的采样时钟,如下图所示:
; X2 m) R) |! b, t% ^9 d4 H7 D
/ s& W7 j8 ~6 L" u9 ~, w
) @! l! Q* ]; O3 w5 {6 R. A% J
- j( o0 O f" J; ?1 @6 Y
5 R3 E7 O2 R( ~4 k
6 D8 i; [4 f- w A7 K- S6 e
1 V6 w: O7 p. M& K# X4 U
2 [5 F% u) x9 ^当然,用户也可以手动指定各个用于采样待测信号的时钟域,右击待测信号,选择“Select Clock Domain”,弹出“Select Clock Domain”窗口,如下面两个图所示:
" R5 Q9 d, g* k0 W7 w0 ^$ ]
4 Y O$ [2 w' w5 C# q/ X# @1 |: J# \/ S( `5 T" c/ K: T
1 A R" ]4 J2 e. f- g( Q4 G/ q
4 P6 I% C) Q- q7 y/ V8 C# n2 A: K: s3 p( k
$ S" C. L; Y% A5 Z l
: d( @& [5 z2 @& D5 y
% j$ `6 N: E' S! ^/ f- u! O
! P, G) A6 R! M3 G9 z/ }& z5 @+ f0 j0 I/ E! [: D& g
8 @6 _# D( L" w
在“Select Clock Domain”窗口中就可以选择用于采样待测信号的时钟了。“Setup Debug”向导会为每个采样时钟生成一个单独的ILA IP核,由于本例程中只有一个时钟,所以这里最后只会生成一个ILA IP核。设置完采样时钟后,我们点击next,接下来的页面用于设置ILA IP核的全局设置,如下图所示:
+ I+ P# @& V; a8 Q8 J
, S5 {) o2 K' }5 y4 p) @
) u' D+ ^5 }: T: Z. B: G
7 n( U; x* m+ r: ]" @5 d y; e/ L+ e9 t, _/ S; n5 D, _' K
2 h8 L# k! _ \
3 a( ?, P M$ N8 p& p( H其中“Sample of data depth”用于设置采样深度,“Input pipe stages”用于设置待测信号和其采样时钟之间的同步级数。如果在上一个设置时钟域页面中,存在与其采样时钟之间是异步的待测信号,则为了避免亚稳态,此数值最好不要低于2。由于本例中的两个待测信号的其采样时钟是同步的,所以可以设置为0。我们点击next,就进入了最后的概览页面,确认无误后直接点击finish即可,如下图所示:
, v! ?3 k9 I, b$ g( y
5 X" ^' [4 ^, g: P, Z, r! ^5 Z6 C, {5 o% y
" A' Q8 t( T+ t
) A0 p" v9 B) U0 p% `
& m& ?8 _) f/ D/ B- _5 }* l x
! O9 W% ^( [8 x) @$ V6 M& g3 I
4 M7 D( _4 W3 f# f
@' Y5 V+ ^- ]2 l9 G# x
在“Debug”子窗口中的“Debug Cores”选项卡中,可以看到Vivado已经添加了ILA IP核,并且“Unassigned Debug Nets”目录下已经没有未被分配的信号了,如下图所示:
- n8 l0 w2 C. Z5 C& Z, ]& K! Y2 \- _3 h9 L$ f7 b4 @; N2 d" s
* d7 u. Q. I6 g5 Q. f* z" ]
- ]! N% C |; `, u1 y
) ]. |) p+ t$ D7 o7 x; {& F
@9 G- X/ p2 E7 d% t5 q" b! @5 b( Q4 ]* A9 h
% m3 j/ `% g% `
' a) w+ N# ]& V" F) Z
& @6 [# z: o, l' `9 y) f2 S+ P7 O
6 F& B( [5 A4 u! G/ q C
网表中被标记为Mark Debug的信号也变为了虚线,以表示其完成了ILA IP核的分配,如下图所示:
- \. L7 S; y% A2 N3 W: ]6 w
6 I( T; E% i: P- D; h" L
+ N- L* L; k$ J5 P! a
6 t, Z6 m4 i4 v. x2 J( e9 r! ?
2 H6 g3 k( ]4 ?. n1 C# q/ s
1 H1 a7 J6 r* J: w2 a- j z/ B u1 T6 c
1 Q9 A6 u! ]2 O! O3 `
: i$ R2 E j( H6 M1 {
+ W+ ?7 L/ r0 ~! v/ F前面我们提到过,在“网表插入调试探针流程”中,用户设置的调试信息会以Tcl XDC调试命令的形式保存到XDC约束文件中,在实现阶段,Vivado会读取这些XDC调试命令,并在布局布线时加入这些ILA IP核。此时,我们所做出的所有的更改和设置,都还只是停留在电脑内存中,我们需要将其保存在硬盘的XDC约束文件中,点击工具栏中的保存按钮,如下图所示:
4 A; B4 q: n1 P/ g& ], B
. h- Z% H' g' A% O2 P# A- j3 j1 ~
% T5 k0 R6 D4 R/ l7 O8 C/ r! l+ h7 s! O+ I" k; T
9 E! p, g1 K$ T2 l3 f: G* N) C0 D$ S& u# E$ s
1 Y4 l7 Q* v1 o& B" s& ^
0 x2 T% W. |4 L
7 f7 H4 T# n" E1 B$ \+ D8 w/ `在出现的对话框中直接点击OK,如下图所示:
- r w- Z0 {* ?
' Q) m& r! {7 X! t {. a& H9 A; |
3 ~+ ] m( o7 e( E: ?: n ~: x/ w; R9 K; G0 N
5 q. d! k# N% h3 t8 i/ l' @
: T# `' o% @1 E' f5 A! I
3 z* D4 U% V; E. W/ _
) E) x6 M- {8 h
, Q; Y* B! b1 V; F) B
弹出的“Save Constraints”窗口中,用于询问用户将约束保存在哪个XDC约束文件中,本例的工程中只有一个XDC约束文件,如下图所示,我们直接点击OK即可:
/ V1 p" }. ]& `' e
; s7 A6 p/ ^/ A: \ u
7 G# R1 I9 g7 p; D/ U9 O
9 ?# c6 v$ X! {% U! E3 [
: k, [& C& S' U
+ P# z* m; G' i- u$ h5 C$ w
8 k) Z% F: m/ w
$ [" I7 r) v7 q1 l+ g7 a% s& z; Y, r) V! d( l- n: m( O
. ]! X* H7 C9 y此时,我们打开led_twinkle.xdc,就会看到在用户约束的下面,Vivado自动写入了用于debug的约束,如下图所示:
! i% R, G. }1 m' {2 z: }4 ~6 K5 _' h. _0 N8 r7 h; @
! s" _* i+ Z9 o* ^! ^$ `, N
( i" M& k: R0 A) C! l4 u
6 T/ f8 n- b0 [; ?2 F8 r) A
$ e$ {; s; i% n4 O3 r# o/ _7 x" |8 h0 f8 m/ U8 w
2 l# o4 w% u- M* ^, y6 C- X) y c3 \" i
1 A7 L- w% a8 M l8 G/ v
在实现阶段,Vivado会读取这些约束,并按照这些命令的参数来自动地在布局布线时加入ILA IP核。至此,我们就成功地使用“网表插入调试探针流程”将ILA IP核添加到了设计中。接下来就可以将实现设计并生成比特流,最后将比特流下载到FPGA中,以对信号进行在线观察,这一部分内容在上面第一种方法里面已经介绍过了,在此不再重复介绍。
% H% z6 V' O2 _4 K C0 q% c; y1 x0 e# m( Y* P* b5 f/ I4 s