xilinx fpga硬件调试

fpga硬件调试 (一)----mark_debug

最近两个月开始用Vivado做项目,之前一直用ISE开发,个人觉得ISE方便好用,而Vivado编译又慢,还占内存,打开一个工程就需要好半天,可视化界面感觉也没什么用处,不如模块化的代码来的简单,而且还有一些bug。无奈xilinx公司不再开发ISE,到14.7就结束了,以后的芯片只能用Vivado做设计了,只能用它了,现在已经更新到了2014.4版本,我现在用的是2013.4版本,开发板是zedboard。

用Vivado进行硬件调试,就是要插入ila核,即“集成逻辑分析仪”,然后将想要引出来观察的信号连到这个核的probe上。

首先第一步,需要把想要观测的信号标记出来,即mark_debug,有两种mark_debug的方法,我用verilog写了一个简单的流水灯程序,只有几行代码,如下:

  1. module main(
  2. input            clk,
  3. input            rst,
  4. output reg [7:0] led
  5.     );

  6. (*mark_debug = "true"*)reg [23:0] counter;
  7. always @(posedge clk) begin
  8. if(rst) begin
  9. counter <= 0;
  10. led <= 8'b00000001;
  11. end
  12. else counter <= counter + 1;
  13. if (counter == 24'hffffff)
  14. led <= {led[6:0],led[7]};
  15. end

  16. endmodule
例如,要观察counter信号的波形,那么在第7行定义reg型信号counter时,前面加上(*mark_debug=“true”*),这样就把counter信号标记了出来。如果用vhdl语言实现的话,这句话用该这样写:
  1. signal counter : std_logic_vector (23 downto 0);
  2. attribute mark_debug: string;
  3. attribute mark_debug of counter : signal is "true";
另外添加xdc约束文件,内容如下:
  1. set_property PACKAGE_PIN Y9 [get_ports clk]
  2. set_property PACKAGE_PIN T18 [get_ports rst]

  3. set_property IOSTANDARD LVCMOS33 [get_ports clk]
  4. set_property IOSTANDARD LVCMOS18 [get_ports rst]

  5. set_property PACKAGE_PIN T22 [get_ports {led[0]}]
  6. set_property PACKAGE_PIN T21 [get_ports {led[1]}]
  7. set_property PACKAGE_PIN U22 [get_ports {led[2]}]
  8. set_property PACKAGE_PIN U21 [get_ports {led[3]}]
  9. set_property PACKAGE_PIN V22 [get_ports {led[4]}]
  10. set_property PACKAGE_PIN W22 [get_ports {led[5]}]
  11. set_property PACKAGE_PIN U19 [get_ports {led[6]}]
  12. set_property PACKAGE_PIN U14 [get_ports {led[7]}]

  13. set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
  14. set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
  15. set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
  16. set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
  17. set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}]
  18. set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}]
  19. set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}]
  20. set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}]
之后run synthesis综合,之后open synthesized design,在左上角选择debug layout,在debug窗口中netlist看到counter信号前面有一个绿色的小蜘蛛,表示counter信号被标记出来了。

     在信号前面加入mark debug的好处

      这其实是一种比较繁琐的方法,更为方便的方法是,直接综合工程,在之后打开综合设计,在netlist中直接选中想要查看的信号,右键选择mark debug,即可将信号标记出来。但是采用第一种方式的好处是,如果工程比较复杂的话,一些信号可能会被综合优化掉,加上模块层层实例化,在netlist中可能找不到要观测的信号,这时在代码里面mark_debug,依旧可以将该信号引出来。
 
    

接着第二步就是插入调试内核了,在Vivado界面下方,找到Unassigned Debug Nets,右键选择 set up debug,在接下来的对话框中列出了counter信号的lk domain是CLK_IBUG_BUFG,其trig和data项都打了对勾,表示counter信号既作为触发信号也作为数据信号。
选择next,在接下来的对话框中将enable advanced trigger mode 和enable basic capture mode勾选上,继续next,最后finish,在界面下方的debug窗口显示如下:
 
右键dbg_hub,选择implement debug cores,接着在打开的schematic中,可以看见插入的ila核,其probe端口与counter相连,打开xdc文件,在最后几行多出来这几行代码:
  1. create_debug_core u_ila_0 labtools_ila_v3
  2. set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
  3. set_property ALL_PROBE_SAME_MU_CNT 4 [get_debug_cores u_ila_0]
  4. set_property C_ADV_TRIGGER true [get_debug_cores u_ila_0]
  5. set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0]
  6. set_property C_EN_STRG_QUAL true [get_debug_cores u_ila_0]
  7. set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
  8. set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
  9. set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
  10. set_property port_width 1 [get_debug_ports u_ila_0/clk]
  11. connect_debug_port u_ila_0/clk [get_nets [list clk_IBUF_BUFG]]
  12. set_property port_width 24 [get_debug_ports u_ila_0/probe0]
  13. connect_debug_port u_ila_0/probe0 [get_nets [list {counter[0]} {counter[1]} {counter[2]} {counter[3]} {counter[4]} {counter[5]} {counter[6]} {counter[7]} {counter[8]} {counter[9]} {counter[10]} {counter[11]} {counter[12]} {counter[13]} {counter[14]} {counter[15]} {counter[16]} {counter[17]} {counter[18]} {counter[19]} {counter[20]} {counter[21]} {counter[22]} {counter[23]}]]
  14. set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]

到此为止,成功将要观察的信号引出来,完成了插入调试内核,接着直接运行generate bitstream,即可生成bit文件。

最后一步,连上zedboard开始调试,用impact将bit文件下载到板卡上,或者在后面hardware manager中选择program device也可以。打开hardware manager,然后open new target,一直next直到结束,即可打开Vivado硬件逻辑分析仪,如下图所示:

要查看波形,必须要有信号触发,将counter信号拖入右方的basic trigger setup窗口,可以设置,想要counter等于何值时触发,右键counter,选择run trigger,并将counter信号添加到波形窗口中,接着便可以在打开的波形窗口中观察counter信号的变化。

硬件调试的流程大致如上述所示,这只是非常简单的一个例子,作为对官网视频教程的一个翻译加补充吧,如果工程较大的话,debug时还会遇到各种问题,就需要一步步慢慢摸索解决啦。

参考官网视频教程,另外在xilinx官网上也可以搜到debug的文档:

http://china.xilinx.com/training/vivado/inserting-debug-cores-into-the-design.htm
http://china.xilinx.com/training/vivado/programming-and-debugging-design-in-hardware.htm

附加两点我曾遇到的小问题:

(1)在进行综合之前,需要将先将xdc约束文件添加到工程中,否则最后write bitstream时出错。Vivado的一个问题就是,有好多ise中综合时就能检测出的错误,而Vivado要等到生成bitstream时才报错。

(2)在打开hardware manager之后,提示vcseserver没有开启,在vivado/2013.4/bin下面运行vcseserver的bat程序即可。

fpga硬件调试 (二)----mark_debug

Vivado和ISE相比ChipScope已经大幅改变,很多人都不习惯。在ISE中称为ChipScope而Vivado中就称为in system debug。下面就介绍Vivado中如何使用debug工具。

Debug分为3个阶段:
1. 探测信号:在设计中标志想要查看的信号
2. 布局布线:给包含了debug IP的设计布局布线
3. 分析:上板看信号

一 探测信号
探测信号有2种方法一种是直接在HDL源代码中用(*mark_debug = “true”*)标识出要探测的信号 另一种是 在综合过后的网表文件中添加标志。

1 .在HDL源代码中添加标志

然后点击open Synthesized Design

然后点击Tools-> Set Up Debug

点击 Next

点击Add/Remove Nets

点击find会出来所有信号。如果需要添加debug的信号,从左边框中选择所需信号,点击按 钮加到右边来。如果需要去除不需要的debug信号,从右边框中选择所需信号,点击按钮就 去除了。选好信号之后,在右下角点击Ok按钮。

在此框中为所有debug信号选择时钟域,选择debug信号,右键选择Select Clock Domain。注意每一个时钟域对应一个单独的ILA 2.0core。

在此框中选择所需时钟,点击ok

点击next

然后继续下面的Implement 流程

点击Save保存修改后的工程


后面像以前一样等工程跑结束。

2.在网表文件中添加标志
网表文件添加标志,第一步也是打开综合后设计。如下图所示

第二步是打开debug窗口


Open synthesized Design之后,有2种方法来标志debug信号

(1) 第一种方法是在Netlist窗口中选择信号,右键点击Mark Debug

(2) 第二种方法是在Tools中选择Setup Debug 推荐使用此方法


然后和前面一样继续跑工程。

二 上板调试
上板的时候选择Open hardware session ,然后Open a new hardware target

选择next

选择next

选择Next

选择FPGA来配置文件

注意移到另一台电脑看debug信号时,必须将debug_nets.ltx 文件和bit文件一起移过去。如下图红框所示

如果需要设置触发条件,选择Windows –> Debug Probes

在Debug Probe窗口中选择需要设置的信号,然后设置触发条件。在Trigger Pos中可以设置抓取到触发信号跳变前N个时钟周期可以被抓到

fpga硬件调试 (三)----mark_debug

在Vivado下在线调试是利用ILA进行的,Xilinx官方给出了一个视频,演示了如何使用Vivado的debug cores,下面我根据这个官方视频的截图的来演示一下:

官方的视频使用的软件版本为2012.2,不过在2015.3下也是差不多的。


第一步:标记需要debug的信号

例如:

VHDL:attribute mark_debug of sineSel  :  signal is "true";

             attribute mark_debug of sine       :   signal is "true";

Verilog: 在需要debug的信号前加上 (* MARKDEBUG = "TRUE" *) 


第二步:设置debug

首先打开synthesis design,可以看到之前标记的debug信号,然后点击tools,选择set up debug

点击find nets to add,可以找到之前标记的信号,把信号添加完毕,检查Clock Domain是否正确,点击下一步。



在下图中,将Capture control和Advanced trigger打上勾,这样在后面的调试中可以使用高级的捕获功能,再下一步,这样ILA的设置工作就完成了。



可以在debug视图中看到,Vivado自动帮我们插入了dbg_bug和ila,接下来生成bit文件,写入FPGA中,在Vivado的调试界面上就能进行在线的波形输出了。


fpga硬件调试 (四)----mark_debug
在vivado中fpga功能验证比ise中方便了很多,主要体现在debug的ip核生成以及最后的波形观察和调试上,下面我就从这两个方面说一下vivado的fpga验证调试。

    fpga验证的步骤一般是:

    × 在代码中加入关键字,表示信号要被调试.

    × 进行elaboration和synthesis.

    × 打开synthesis, 设置debug核.

    × 重新进行synthesis和implement以及write bitstream.

    1,vivado中debug核的生成:

    原来在ise中,要进行fpga的验证,必须生成两个debug核,一个是ICon,另外一个就是ILA,分别对应是控制和收集波形。但是在vivado中,我们只需生成ILA即可,不需生成ICon。

    在生成ILA之前,我们要指定哪些信号应该被调试,原来在ise中,如果不用例化的方式的话,我们就必须一点点去net中找哪些信号应该被调试,很不方便,但是在vivado中,我们可以事先在源代码中加入关键字mark_debug="true"来告诉软件这个信号是要被调试的,从而在生成debug核的过程中,这些被调试的信号就直接显示出来了。如下所示:

    

[plain] view plain copy 在CODE上查看代码片派生到我的代码片
  1. (* mark_debug="true" *)output reg [17:0]  wr_addr,                       // Memory Write Address  
  2. (* mark_debug="true" *)output reg [7:0]   wr_be,                         // Memory Write Byte Enable  
  3. (* mark_debug="true" *)output reg [31:0]  wr_data,                       // Memory Write Data  
  4. (* mark_debug="true" *)output reg         wr_en,                         // Memory Write Enable  
  5. (* mark_debug="true" *)input              wr_busy                        // Memory Write Busy  
    接着我们对加入关键字的代码进行elaborate和synthesis。等到综合完成之后,我们就要生成debug核了,生成debug核的方式有好几种,这里只说我感觉比较方便的一种,及Open Implemention Design下的Set Up Debug选项,如下所示:


    上图中的信号就是我们在verilog源码中标记的要debug的信号,在生成debug核之前,首先要为debug核生成时钟信号,即上图蓝色圆圈标记的部分。这里Set UpDebug是自动为所选信号生成debug核,也就是说我们可以全选上面的信号,然后点击Next就自动生成所需要的debug核。

    2,观察调试信号

    在debug核生成之后,我们要对设计重新synthesis和implementation,然后生成比特流下载到fpga上进行验证。在配置好bit流和debug文件之后,就会自动出现调试波形接口,如下所示:

    

    在调试窗口中,可以设置Tigger Setup,这里要说一个对实际观察波形非常方便的一个功能,就是在Trigger Setup窗口中可以选择一个信号,然后编辑enumeration,就是现实信号所代表的含义,而不是只现实数值,这在状态机观察中非常方便,如下图所示:

    

    然后在点击Trigger程序就可观察实时的波形了,如下图所示:


   


             如何保存vivado中ila采集到的数据

        最后可以选择保存收集到的波形,可以看出上图中的Enumeration的作用(例如PIO_RX_WAIT_STATE不是数值而是名称),这个比chipscope方便多了,因为在chipscope里面好像就无法保存收集到的波形(至少我现在还没有找到),保存(上图蓝色圆圈标记的部分),可以选择不同的格式,Native(vivado本身波形的格式),CSV和VCD,保存成VCD格式,其他软件就能打开了。

       导出csv或者vcd文件,vcd文件为通用波形文件,只能用来查看;所以只能通过csv文件解析数据。

fpga硬件调试 (五) ----找不到ila核问题及解决

问题 一:

  1. WARNING: [Xicom 50-38] xicom: No CseXsdb register file specified for CseXsdb slave type: 0, cse driver version: 0. Slave initialization skipped.
  2. INFO: [Labtools 27-1434] Device xc7k410t (JTAG device index = 0) is programmed with a design that has no supported debug core(s) in it.
  3. WARNING: [Labtools 27-3123] The debug hub core was not detected at User Scan Chain 1 or 3. You must manually launch hw_server
  4. with -e "set xsdb-user-bscan <C_USER_SCAN_CHAIN scan_chain_number>" to detect the debug hub at User Scan Chain of 2 or 4.
  5. To determine the user scan chain setting, open the implemented design and use: get_property C_USER_SCAN_CHAIN [get_debug_cores dbg_hub].
  6. WARNING: [Labtools 27-1974] Mismatch between the design programmed into the device xc7k410t_0 and the probes file D:/Vivado/xc7k410t-2ffg900/ddr_slave_410t_20150527_1/ddr_slave_410t_20150527_1.runs/impl_1/debug_nets.ltx.
  7. The device design has 0 ILA core(s) and 0 VIO core(s). The probes file has 1 ILA core(s) and 0 VIO core(s).
  8. Resolution:
  9. 1. Reprogram device with the correct programming file and associated probes file OR
  10. 2. Goto device properties and associate the correct probes file with the programming file already programmed in the device.
复制代码


大概是说设计里没有ILA core,但是debug文件里有ILA core,而且debug probes窗口下什么也没有。但是,我综合后明明插入了debug core呀,而且在约束文件里也自动生成了相关信息,查看schematic,也添加了debug相关的两个元件,为毛program时就是看不到呢?

不知道有没有人遇到过类似的情况,求指点,万分感谢!



解决:


1: VIO 和 ILA 的CLK 有问题。


2: 我查的Xilinx的论坛,貌似也这么说,说是要用free running clock,但我也没弄明白什么样的叫free running clock。我用的就是那些寄存器本来的时钟,如果换个时钟的话,怎么能保证采样不会出问题呢?还是不太明白,能否详细指教?谢谢啦!

       所谓的free running clock就是上电就跑的时钟,而不是依赖某些条件才有的。补充一点,FREE CLOCK的确是要求上电无条件运行的时钟。有一次我碰到一种情况。用MMCM或者PLL输出的时钟作为采样时钟,但是如果MMCM或者PLL这个输入并不是上电就来的话,而是等FPGA程序运行了之后时钟输入才来,那么下载程序之后还是在ILA调试界面看不到任何信号。把MMCM或者PLL的输入时钟改为晶振的时钟,那么就可以正常使用ILA了。这是我的个人感觉,没有经过大量验证,所以希望大家多多指教。补充一点,FREE CLOCK的确是要求上电无条件运行的时钟。

        其实不用FREE CLOCK也没问题。比方用ZYNQ PS产生的CLK也可以。上电后做PS初始化,再把需要的寄存器设定一下,然后更新一下DEVICE,就可以找到ILA了。


3 : 这个问题我遇到过,其实第一种情况是你的时钟信号可能没加入成功(比如外部输出时钟信号没进来或者幅度太小,内部时钟可能没有lock);第二种情况是,你输入到ila核的时钟频率不合适。其实,ila就是个采样你需要的查看的信号的始终,因此最好是直接用外部始终的mmcm生成大于你需要采集信号的最高频率来采样(具体多大频率,看你采样点数的需求和你信号的频率了)。


4: 这个问题是时钟引起的。当bit file program完成之后,fpga/vivado会自动检测ila的clock是否存在,如果不存在(在本例中是pll/mmcm没有lock),它就会report 这个warning。这个时候我们只要让时钟工作起来,refresh一下device,ila就会启动--ila的窗口就会出来了。


5 : 你试试直接用外部输入的时钟(可经过时钟buf)作为ila的clk,不要用其它模块产生的时钟。



问题 二:

我在vivado下进行调试,调用了ILA IP Core。如果ila采用晶振输入作为clk时(也即全局时钟),在顶层RTL级,可以看到ila的数据和时钟都连上了。Debug时也能在Hardware下看到XADC和ILA。
但如果ila的clk,采用逻辑计数办法分频后的时钟信号、或者采用clock wizard倍频后的时钟信号。在顶层RTL下看ILA的clk并没有和上述时钟源连接上。此时将bit流下载后Debug,也只能看到XADC而看不到ILA核。
  
想知道使用ILA时,ila的clk的输入源是不是有什么特殊限制?


解决:


1 : 难道是:(Xilinx PG172)
The clk input port is the clock used by the ILA core to register the probe values. For best results, it should be the same clock signal that is synchronous to the design logic that is attached to the probe ports of the ILA core.
  
  




2 : 首先确保你的分频结果是有效的。
然后,如果你非要用分频结果的话,过一个bufg试试。

// BUFG: 全局时钟缓存(Global Clock Buffer),只能以内部信号驱动  
// Xilinx HDL库向导版本,ISE 9.1  
BUFG BUFG_inst (  
.O(O), //时钟缓存输出信号  
.I(I) // /时钟缓存输入信号  
);  
// 结束BUFG_ins模块的例化过程 



阅读更多
个人分类: xilinx vivado
想对作者说点什么? 我来说一句

Xilinx_FPGA芯片底层单元的使用

2013年01月11日 734KB 下载

没有更多推荐了,返回首页

不良信息举报

xilinx fpga硬件调试

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭