最近兩個月開始用Vivado作項目,以前一直用ISE開發,我的以爲ISE方便好用,而Vivado編譯又慢,還佔內存,打開一個工程就須要好半天,可視化界面感受也沒什麼用處,不如模塊化的代碼來的簡單,並且還有一些bug。無奈xilinx公司再也不開發ISE,到14.7就結束了,之後的芯片只能用Vivado作設計了,只能用它了,如今已經更新到了2014.4版本,我如今用的是2013.4版本,開發板是zedboard。dom
用Vivado進行硬件調試,就是要插入ila核,即「集成邏輯分析儀」,而後將想要引出來觀察的信號連到這個核的probe上。模塊化
首先第一步,須要把想要觀測的信號標記出來,即mark_debug,有兩種mark_debug的方法,我用verilog寫了一個簡單的流水燈程序,只有幾行代碼,以下:優化
- module main(
- input clk,
- input rst,
- output reg [7:0] led
- );
- (*mark_debug = "true"*)reg [23:0] counter;
- always @(posedge clk) begin
- if(rst) begin
- counter <= 0;
- led <= 8'b00000001;
- end
- else counter <= counter + 1;
- if (counter == 24'hffffff)
- led <= {led[6:0],led[7]};
- end
-
- endmodule
例如,要觀察counter信號的波形,那麼在第7行定義reg型信號counter時,前面加上(*mark_debug=「true」*),這樣就把counter信號標記了出來。若是用vhdl語言實現的話,這句話用該這樣寫:
- signal counter : std_logic_vector (23 downto 0);
- attribute mark_debug: string;
- attribute mark_debug of counter : signal is "true";
另外添加xdc約束文件,內容以下:
- set_property PACKAGE_PIN Y9 [get_ports clk]
- set_property PACKAGE_PIN T18 [get_ports rst]
-
- set_property IOSTANDARD LVCMOS33 [get_ports clk]
- set_property IOSTANDARD LVCMOS18 [get_ports rst]
-
- set_property PACKAGE_PIN T22 [get_ports {led[0]}]
- set_property PACKAGE_PIN T21 [get_ports {led[1]}]
- set_property PACKAGE_PIN U22 [get_ports {led[2]}]
- set_property PACKAGE_PIN U21 [get_ports {led[3]}]
- set_property PACKAGE_PIN V22 [get_ports {led[4]}]
- set_property PACKAGE_PIN W22 [get_ports {led[5]}]
- set_property PACKAGE_PIN U19 [get_ports {led[6]}]
- set_property PACKAGE_PIN U14 [get_ports {led[7]}]
-
- set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
- set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
- set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
- set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
- set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}]
- set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}]
- set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}]
- set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}]
以後run synthesis綜合,以後open synthesized design,在左上角選擇debug layout,在debug窗口中netlist看到counter信號前面有一個綠色的小蜘蛛,表示counter信號被標記出來了。
這實際上是一種比較繁瑣的方法,更爲方便的方法是,直接綜合工程,在以後打開綜合設計,在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文件,在最後幾行多出來這幾行代碼:
- create_debug_core u_ila_0 labtools_ila_v3
- set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0]
- set_property ALL_PROBE_SAME_MU_CNT 4 [get_debug_cores u_ila_0]
- set_property C_ADV_TRIGGER true [get_debug_cores u_ila_0]
- set_property C_DATA_DEPTH 1024 [get_debug_cores u_ila_0]
- set_property C_EN_STRG_QUAL true [get_debug_cores u_ila_0]
- set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0]
- set_property C_TRIGIN_EN false [get_debug_cores u_ila_0]
- set_property C_TRIGOUT_EN false [get_debug_cores u_ila_0]
- set_property port_width 1 [get_debug_ports u_ila_0/clk]
- connect_debug_port u_ila_0/clk [get_nets [list clk_IBUF_BUFG]]
- set_property port_width 24 [get_debug_ports u_ila_0/probe0]
- 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]}]]
- set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
到此爲止,成功將要觀察的信號引出來,完成了插入調試內核,接着直接運行generate bitstream,便可生成bit文件。spa
最後一步,連上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
硬件調試的流程大體如上述所示,這只是很是簡單的一個例子,做爲對官網視頻教程的一個翻譯加補充吧,若是工程較大的話,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視頻
附加兩點我曾遇到的小問題:server
(1)在進行綜合以前,須要將先將xdc約束文件添加到工程中,不然最後write bitstream時出錯。Vivado的一個問題就是,有好多ise中綜合時就能檢測出的錯誤,而Vivado要等到生成bitstream時才報錯。
(2)在打開hardware manager以後,提示vcseserver沒有開啓,在vivado/2013.4/bin下面運行vcseserver的bat程序便可。