在進行FPGA調試的過程中,進行行為仿真,能觀察設計的邏輯是否正確,通常情況下需要進行run all的運行,這樣才能看到信號在運行過程中的狀態(tài),
在調試的過程中遇到如下的報錯:
# ** Failure: ERROR:add_1 must be in range [-1,DEPTH-1]
# Time: 128 ns Iteration: 1 Protected: /top_tb/DmodInst0/FirD40/U0/<protected>/<protected>/<protected>/<protected>/<protected>/<protected> File: D:/Xilinx/Vivado/2019.1/data/ip/xilinx/axi_utils_v2_0/hdl/axi_utils_v2_0_vh_rfs.vhd
# Break in file D:/Xilinx/Vivado/2019.1/data/ip/xilinx/axi_utils_v2_0/hdl/axi_utils_v2_0_vh_rfs.vhd
run -all
# ** Failure: ERROR:empty_1 and not_empty_1 are inconsistent
# Time: 128 ns Iteration: 1 Protected: /top_tb/DmodInst0/FirD40/U0/<protected>/<protected>/<protected>/<protected>/<protected>/<protected> File: D:/Xilinx/Vivado/2019.1/data/ip/xilinx/axi_utils_v2_0/hdl/axi_utils_v2_0_vh_rfs.vhd
# Break in file D:/Xilinx/Vivado/2019.1/data/ip/xilinx/axi_utils_v2_0/hdl/axi_utils_v2_0_vh_rfs.vhd
run -all
# ** Failure: ERROR:rd_avail asserted when rd_valid deasserted
# Time: 160 ns Iteration: 1 Protected: /top_tb/DmodInst0/FirD40/U0/<protected>/<protected>/<protected>/<protected>/<protected>/<protected> File: D:/Xilinx/Vivado/2019.1/data/ip/xilinx/axi_utils_v2_0/hdl/axi_utils_v2_0_vh_rfs.vhd
# Break in file D:/Xilinx/Vivado/2019.1/data/ip/xilinx/axi_utils_v2_0/hdl/axi_utils_v2_0_vh_rfs.vhd
用的是vivado 2019.1聯合modelism 10.7進行的仿真過程,用vivado內置的仿真也是同樣的報錯信息,建議用modelsim進行仿真,速度快。
因為存在報錯,所以仿真程序是不能連續(xù)運行的。如何解決這個報錯,讓程序連續(xù)運行?
如下為解決這個問題的思路:
1.從打印的報錯信息來看,這個錯誤的字段是add_1和empty_1和rd_avail的錯誤,但是實際上自己編寫的Verilog代碼是沒有這個變量的,所以這個應該是其他內部的錯誤。
2.判斷是哪個內部的錯誤,基本上可以判斷是調用的IP核的內部報錯,但是如何判斷是哪個IP核使用過程中引起的呢,在利用vivado內部的仿真工具是是無法看到其他信息的,但是在利用modeisim仿真的時候,可以看到程序停止時,停在了打開的fir_complier_v7_2_vh_rfs_vhd,在這里判斷應該是調用的Fir的IP核引起的錯誤。
3.定位了IP核,因為每個人使用IP核的習慣可能不同,所以最直觀有效的辦法是把用的fir的IP核都注釋掉,讓程序運行,看是否還存在該報錯信息。通過自己的測試,注釋掉之后確實可以,接下來對IP核的使用過程重新例化。
4.在不使用如下的ARESET和ACLKEN時,共有六個接口,可以逐一排查,
FirR your_instance_name (
.aclk(aclk), // input wire aclk
.s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
.s_axis_data_tdata(s_axis_data_tdata), // input wire [31 : 0] s_axis_data_tdata
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata) // output wire [63 : 0] m_axis_data_tdata
);
在排查的時候重點是s_axis_data_tvalid和s_axis_data_tready,這個兩個信號一個輸入,一個輸出,這個是可以利用輸出與其他信號做邏輯運算然后給到輸入的,重點是在初始化的時候保證s_axis_data_tvalid要有效,因為本人在例化的時候沒有采用aclken接口,而且沒有注意輸入信號的初始狀態(tài),導致s_axis_data_tvalid信號在開始時存在一段不確定狀態(tài),為X,導致了上述的報錯內容。
5.把信號的初始狀態(tài)搞定,不讓存在X即解決了該錯誤,最終程序能夠run all,不報錯。文章來源:http://www.zghlxwxcb.cn/news/detail-618133.html
總結:出現這種add_1等的內部IP核的錯誤的時候,要有一個清晰的思路,在不確定的時候用控制變量法,一點點增加,然后注意保證IP例化的過程中數據一直有狀態(tài),而不是X,這樣的思路去解決問題最后應該都能夠解決文章來源地址http://www.zghlxwxcb.cn/news/detail-618133.html
到了這里,關于FPGA:調試報錯Error:add_1 must be in range [-1,DEPTH-1]解決辦法和調試思路的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!