Vivado:使用 ILA 进行在线调试

目录

一、ILA介绍

二、ILA使用步骤

(1)设计部分

(2)调用ILA IP核

(3)例化ILA IP核

(4)编译综合

三、ILA在线调试

(1)手动运行

(2)运行触发条件

(3)连续触发

一、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核

        1.按照如下步骤搜索ILA调用IP核,双击" ILA(Integrated Logic Analyzer)"

        2.进入ILA配置界面,完成基本设置:设置名称、探针数、样本数据深度。其他参数一般用不到保持默认。

(我要看波形的信号有:rst_n、led、count、state所以有4个探针,样本数据深度够用默认1024,即每个有效clk采样一次,采样1024个clk时的数据)

        3.接着再当前界面继续设置探针宽度:

(根据rst_n、led、count、state4个信号宽度,依次设置好位宽即可)

        4.再点击OK之后,会弹出该界面,选项保存默认点击“generate”生成IP核,

        5.这个时候要等一段时间等ip核生成完毕(转圈即正在生成),完毕之后可以看到文件多了一个IP核即ila_o模块。

(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

        途中会发现count和state是设计模块内定义的寄存器,无法直接连接,此时只需要以“u_LED_ILA.count”的方式连接,因为ILA可以读取模块寄存器内容。

        此外不同探针位宽可能不同,注意匹配待检测信号位宽,可以双击IP核查看探针位宽情况

(4)编译综合

        接着按照常规流程走:编译、综合、配置管脚、生成比特流文件、烧录开发板。准备进行ILA在线调试。

三、ILA在线调试

        程序烧录到开发板后,Vivado界面会自动弹出ILA的波形窗口如图所示:不过此时这个窗口是空的,是因为还没有触发采样。

         因为ILA是数据采样,不可能一直不停采,只能采有限个数据,即有信号触发或手动时开始对探测的信号进行数据采样。下面将介绍如何使用ILA在线调试:

(1)手动运行

        如图所示:点击运行按钮波形会立刻更新,此时红色光标的位置就是你点击运行按钮时的时刻(默认中点),它会在触发点周围进行1024次采样。

        当然你也可以在左下角设置触发点的位置:比如我设置触发点为第100个后,再运行一次,在波形里可以看到触发点位置改变了。(此外还可以设置波形显示的数据个数等等)

     

(2)运行触发条件

        如果我想看特定时刻附近的信号变化情况,手动触发就不适用了,我需要将该特定时刻作为触发点位置,因此需要添加触发条件实现自动触发:

        假如我想查看复位时刻其他信号的情况,就需要将复位时刻设置为触发条件,右下角位置添加触发信号并设置条件,我选的是rst_n,同时条件为该信号“1到0转变”时触发。

        设置完成后再运行一次,会发现界面提示“等待触发”:

        这个时候只要你按下开发板的复位按钮(让rst_n产生一个1到0的转换的触发条件),波形界面就会刷新数据,如图所示:

       将黄色光标设置移动到触发点附近的位置将波形放大,就可以清楚看到其他信号变化情况了,可以看出复位时所有信号都成功复位:

        此外触发条件设置多种多样可以根据你的需求进行设置,这样debug起来更加方便快捷,比如要设置某信号到特定值时触发,我可以设置count计数到666的时候触发,运行效果如图所示:

(3)连续触发

        这个按钮就是连续触发,当选中这个按钮后不需要手动运行,只要满足触发条件他就会自动运,比如当你设置count计数到666时触发,并选中“连续触发”,count计数每次到666时,波形界面就会刷新一次波形。