一、ILA 介绍
Vivado 中的 ILA(Integrated Logic Analyzer)即集成逻辑分析仪,是一种在线调试工具。ILA 允许用户在 FPGA 上执行系统内的调试,通过实时抓取 FPGA 内部数字信号的波形,帮助我们分析逻辑错误的原因,从而更有效地进行 debug。类似于 Quartus 中的 SignalTap II,也类似于片上的逻辑分析仪。
相较于编写 testbench 仿真文件仿真 debug 的方式,使用 ILA 调试的方法不写 tb 仿真文件从而节省时间,可直接上板调试并查看波形。
二、ILA 使用步骤
ILA 常以 IP 核的方式调用,可以在 IP Catalog 中搜索 ILA,找到该 IP 核后进行配置。配置选项包括:样本数据深度、探针数量、探针位宽等等。配置完成后,在顶层模块 RTL 代码中例化 ILA IP 核,接着正常烧录程序上板调试。
(1)设计部分
假设已有一个编译成功的工程需要 debug 调试,这里给出一个案例。
工程实现的功能为:通过状态机来实现 4 个 led 灯循环点亮,时间间隔 0.5 秒。
`timescale 1ns /1ps
module LED_ILA( //状态机实现 4 个 led 灯循环点亮,时间间隔 0.5 秒
input wire clk, //100MHz,10ns
input wire rst_n,
output reg [3:0]led
);
reg [25:0]count = 26'd1;
reg [2:0]state = 3'b000;
reg [2:0]next_state = 3'b000;
parameter count_max = 26'd5000_0000;
parameter IDLE = 3'b000;
parameter s1 = 3'b001;
parameter s2 = 3'b010;
parameter s3 = 3'b011;
parameter s4 = 3'b100;
always@(posedge clk or negedge rst_n)begin//计数器
if(!rst_n) count <= 26'd1;
else if(count == count_max) count <= 26'd1;
else count <= count + 26'd1;
end
always@(posedge clk or negedge rst_n)begin//state 状态转换
if(!rst_n) state <= 3'b000;
else if(count == count_max) state <= next_state;
end
always@(*)begin//next_state 状态转换
if(!rst_n) next_state <= 3'b000;
else begin
case(state)
IDLE: next_state <= s1;
s1: next_state <= s2;
s2: next_state <= s3;
s3: next_state <= s4;
s4: next_state <= s1;
default: next_state <= IDLE;
endcase
end
end
always@(*)begin//led 输出信号
if(!rst_n) led <= 4'b0000;
else begin
case(state)
IDLE: led <= 4'b0000;
s1: led <= 4'b0001;
s2: led <= 4'b0010;
s3: led <= 4'b0100;
s4: led <= 4'b1000;
default: led <= 4'b0000;
endcase
end
end
endmodule
接着 TOP.v 顶层模块文件,把上面这个模块例化进去即可。不过之后还要例化 IP 核,所以代码在后半部分写完后再给出。
(2)调用 ILA IP 核
-
按照如下步骤搜索 ILA 调用 IP 核,双击"ILA(Integrated Logic Analyzer)"
-
进入 ILA 配置界面,完成基本设置:设置名称、探针数、样本数据深度。其他参数一般用不到保持默认。(我要看波形的信号有:rst_n、led、count、state 所以有 4 个探针,样本数据深度够用默认 1024,即每个有效 clk 采样一次,采样 1024 个 clk 时的数据)
-
接着再当前界面继续设置探针宽度:(根据 rst_n、led、count、state4 个信号宽度,依次设置好位宽即可)
-
再点击 OK 之后,会弹出该界面,选项保存默认点击'generate'生成 IP 核
-
这个时候要等一段时间等 ip 核生成完毕(转圈即正在生成),完毕之后可以看到文件多了一个 IP 核即 ila_0 模块。
(3)例化 ILA IP 核
接着在 TOP.v 顶层模块文件内例化 ILA IP 核。并完成连接端口信号:
`timescale 1ns / 1ps
module TOP(
input wire clk,
input wire rst_n,
output wire [3:0]led
);
LED_ILA u_LED_ILA( //例化设计的模块
.clk (clk),
.rst_n (rst_n),
.led (led)
);
ila_0 u_ila_0( //例化 ILA IP 核
.clk (clk),
.probe0 (rst_n),
.probe1 (led),
.probe2 (u_LED_ILA.count),
.probe3 (u_LED_ILA.state)
);
endmodule


