• Vivado简单调试技能


    Vivado简单调试技能

    1.关于VIO核的使用

    首先配置VIO核:

    配置输入输出口的数量5,5

    配置输入口的位宽

    配置输出口位宽和初始值。

    例化与使用:

    vio_0 U1 (
      .clk(clk_27M),                // input wire clk
      .probe_in0(),    // input wire [0 : 0] probe_in0
      .probe_in1(),    // input wire [0 : 0] probe_in1
      .probe_in2(),    // input wire [0 : 0] probe_in2
      .probe_in3(),    // input wire [0 : 0] probe_in3
      .probe_in4(),    // input wire [0 : 0] probe_in4
      .probe_out0(),  // output wire [0 : 0] probe_out0
      .probe_out1(qpllreset),  // output wire [0 : 0] probe_out1
      .probe_out2(),  // output wire [0 : 0] probe_out2
      .probe_out3(),  // output wire [0 : 0] probe_out3
      .probe_out4()  // output wire [0 : 0] probe_out4
    ); 

        一定要注意的是,准确给定这个核的时钟,probe_in端口目前还不知道怎么用,只使用了probe_out端口。使用场景就是让这个核输出某个数值到相关的信号线,比如:.probe_out1(qpllreset),  // output wire [0 : 0] probe_out1;可以在调试阶段控制这个核输出0或者1qpllreset信号,由此我们可以手动对QPLL进行复位控制了。

     

    2.ILA核的使用

     

    配置ILA核:

     

    配置probes的个数,和数据采样的深度。

    分别配置每个probe的位宽。

     

    例化与使用ILA核:

     

    ila_0 U5 (
        .clk(drpclk), // input wire clk
        .probe0(current_state_W), // input wire [0:0]  probe0  
        .probe1(next_state_W), // input wire [0:0]  probe1 
        .probe2(timeout_cntr_W),
        .probe3(clear_timeout_cntr_W), // input wire [0:0]  probe3 
        .probe4(plllock_timeout_W), // input wire [0:0]  probe4
        .probe5(reset_timeout_W), // input wire [0:0]  probe5 
        .probe6(init_period_done_W), // input wire [0:0]  probe6 
        .probe7(refclk_stable_ss_W), // input wire [2:0]  probe7 
        .probe8(refclk_stable_s), // input wire [0:0]  probe8 
        .probe9(pll_lock_ss_W), // input wire [2:0]  probe9
        .probe10(pll_lock_s), // input wire [0:0]  probe10 
        .probe11(rxresetdone_ss_W), // input wire [2:0]  probe11 
        .probe12(assert_pll_reset_W), // input wire [0:0]  probe12 
        .probe13(assert_gt_reset_W), // input wire [0:0]  probe13 
        .probe14(assert_done_W), // input wire [0:0]  probe14 
        .probe15(assert_fail_W), // input wire [0:0]  probe15 
        .probe16(assert_drp_req_W), // input wire [0:0]  probe16 
        .probe17(assert_drp_busy_out_W), // input wire [0:0]  probe17 
        .probe18(inc_retry_cntr_W), // input wire [0:0]  probe18 
        .probe19(clear_retry_cntr_W), // input wire [0:0]  probe19 
        .probe20(max_retries), // input wire [0:0]  probe20
        .probe21(rxresetdone_s) // input wire [0:0]  probe21
    );

     

        同样,也需要给这个核输入时钟,probe()端口需要接入wire类型的信号,在调试的过程中我们经常需要抓取reg类型的信号进行分析,因此可以这样处理,将reg型转为wire型:

     

     

    reg                                 assert_pll_reset;
    wire assert_pll_reset_W;
    assign assert_pll_reset_W = assert_pll_reset;
    
    reg                                 assert_gt_reset;
    wire assert_gt_reset_W;
    assign assert_gt_reset_W = assert_gt_reset;
    
    reg                                 assert_done;
    wire assert_done_W;
    assign assert_done_W = assert_done;
    
    reg                                 assert_fail;
    wire assert_fail_W;
    assign assert_fail_W = assert_fail;
    
    reg                                 assert_drp_req;
    wire assert_drp_req_W;
    assign assert_drp_req_W = assert_drp_req;

        烧写完程序之后,就可以抓这些信号的波形,得到的波形图如下:

    3.关于set up debug的使用:

    Set up debug算是一种自动添加ILA核的方法。在下面的对话框中加入我们要查看的信号,然后重新进行综合布局布线生成bit文件,烧写程序完成后出现波形界面。

    注意其中信号的时钟域不同,生成的ILA核就不同:

    手动添加的ILA核

    时钟域为clk_27M

    时钟域为:SDI0/SDI/CLK

    时钟域为:SDI0/SDI/CLK

  • 相关阅读:
    C#中的代理(Delegate)
    动态栈C语言
    AMS算法
    动态队列实现C语言
    带头结点的循环单链表C语言
    静态栈C语言
    不带头结点的单链表C语言实现
    带头结点的双向循环链表C语言
    带头节点的单链表C语言实现
    使用函数指针模拟C++多态
  • 原文地址:https://www.cnblogs.com/chensimin1990/p/6964398.html
Copyright © 2020-2023  润新知