赞
踩
由于最近已经也刚刚接手项目,遇到特别多的问题,所以把遇到的问题记录一下,自己学习的同时,把过程分享出来,希望对大家有一定的帮助,共同进步。
下面就是ISE调试过程中经常遇到的几种warning,以及解决办法,自己整理成文档,以供参考:
1、Redeclaration of ansi port XX is not allowed
“不允许重新声明ansi端口XX”。
出现的原因是在程序中声明了两遍端口信号
measure_freq(
output measure_end_reg1,
);
wire measure_end_reg1;//20181204
解决方法为:声明一遍信号即可:
measure_freq(
output wire measure_end_reg1,
);
2、Assignment to XX ignored, since the identifier is never used
忽略对 XX的赋值,因为从没使用此标识符。
ISE会对一些没被使用过的变量或者标识符进行优化,即使进行(KEEP=“TRUE”)的声明,但是在CDC文件上依然找不到,即不存在这个变量了。需要自己将这个XX变量取影响其他变量就可以关联起来了,这样综合器就不会丢下它不管,生成CDC文件就可以看到了
3、Net does not have a driver.
XILINX官方给出的解决方案是:This message appears when the Net or REG does not have driver。
官方给出的例子如下:
module (din ,clk, rst, out);
input din;
input clk;
input rst;
input out;
reg temp_reg;
reg Outdata;
always @ (posegde clk, posedge rst)begin
if(rst)
Outdata <= temp_reg;
else
Outdata <= din;
end
endmodule
In the above example ,the register ‘temp_reg’ is not driven by a source (drive)
4、Size mismatch in connection of port . Formal port size is 16-bit while actual signal size is 8-bit.
XILINX 官方给出的解决方案:This message appears when there is mismatch in size of argument and parameter. argument bit length differs from the parameter bit length for the port.
官方给出的例子:
Consider the following RTL:
file :ram .v
module ram (clk, we ,en,addr,di ,do);
input [13:0]addr;
……
//instantiating
module (clk, we,en,addr,di,do);
…….
input [13:0] addr;
…….
ram ram_inst(clk,we,en,addr[12],di,do);
endmodule
The creation of instance ram_inst for ram, the parameter port is of bit length 14(13:0),for input port addr,but the argument passed is of 1-bit length(i.e 12th bit)
5、Empty module remains a black box.
这个意思是fpga综合的时候当做黑盒对待,,即直接和其他部分连接,可以忽略此警告,也可以在模块例化的时候,顶上加一句(BOX_TYPE=”user_black_box”)
6、Result of 25-bit expression is truncated to fit in 16-bit target.
位数不统一。25bit的结果被截断成16bit,这个需要查看设计中是否是正常需要进行截取低位。
7、Using initial value of ad_reg0 since it is never assigned
ad_reg0 没有分配初始值
8、Port read_en is not connected to this instance
端口read_en未连接到此实例,需要查看程序中是否是按照作者意图没有连接,还是忘记连接。
9、‘PLUG1_1’, unconnected in block instance ‘T9GS5L14_ctrl_u’, is tied to GND.
“Plug1_1”(在块实例“T9GS5L14_ctrl_”中未连接)绑定到GND
10、Input <PLUG1_1> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.**
输入PLUG1_1没有使用到。如果此端口属于顶级块或属于子块,并且此子块的层次结构被保留,则此端口将被保留并保持不连接。
11、Signal <temperature_data> is used but never assigned. This sourceless signal will be automatically connected to value GND.
使用信号<温度数据> ,但它从未分配。此无源信号将自动连接到值GND上。
12、Property “KEEP” (value “TRUE”) has not been applied on proper HDL object.
属性“keep”(值“true”)尚未应用于正确的HDL对象。
13、FFs/Latches <ad_read_back_en<0:0>> (without init value) have a constant value of 0 in block <adc_reg_ctrl>.
这句话是指adc_reg_ctrl模块中的ad_read_back_en信号是个固定值0,
14、FF/Latch <data_PLUG_back_11> (without init value) has a constant value of 0 in block <translater_u>. This FF/Latch will be trimmed during the optimization process.
这句话是指adc_reg translater ctrl模块中的data_PLUG_back_11信号是个固定值0,在优化过程中将被优化掉。
15、Node <data_send_15> of sequential type is unconnected in block <send_u1>.
序列类型的节点<data_send_15>在block<send_1>中未连接。
VIVADO中遇到的问题:
1、用vivado2016进行波形的仿真,在调用modelsim的过程中,时间过长,总是卡在进度条的位置怎么办?
原因:代码出现错误,通过查看TCL console的窗口信息,找到ERROR,进行错误的修改,修改完成后,再次调用,就可以打开modelsim了。
2、在每次修改完testbench后,需要综合后在进行run simulation吗?
答:不需要,修改完代码进行保存,保存完成后,直接进行run simulation 就可以了。
3、assign a = 100 + 200; assign b= a +300; assign c = a + b;如果出现同一拍子的多个组合逻辑时候,会在仿真的时候有很小很小的延时,可以通过波形看到,会对系统有影响吗?
答:基本不会,但是不建议这么使用。如果不放心,可以在得到a和b的数值以后,在计算C时使用时序逻辑。
4、always @ (clk)这句话的仿真结果是clk的高低电平都会引起数值的变化
5、 always @ (*)
begin
if(rst)
cnt = 10’d0;
else if(a)
cnt = 10’d0;
else if(b)
cnt = cnt + 1’b1;
else
cnt = cnt;
end
这段代码当b从0变成1后并且一直拉高时,cnt会一直卡在1这个位置,分析原因是因为b从低电平调到高电平只发生了一次,并没有其他电平发生变化,所一直cnt会卡在1这个数值,并不会持续的累加,应该修改成时序逻辑进行控制。
6、 关于set_debug的问题,对于不同时钟域的信号,不能够把时钟域设置成一个时钟域,会出现波形采集不正确的情况,对于不同时钟域的信号,在仿真的时候,软件会自动把不同的信号通过ila进行分配,另外需要在采集的信号前加上约束(* MARK_DEBUG=“ture” *)。建议还是使用ila的ip核。在抓取波形的时候可能还会使用到vio的ip,来进行数据的数值控制。
7、关于状态机的问题
8、高低位如何实现顺序颠倒,如:输入 1010 0001 转换后 1000 0101。
方法1:
定义两组电线 wire_in[7:0],wire_out[7:0];
assign wire_out[0] = wire_in[7];
assign wire_out[1] = wire_in[6];
assign wire_out[2] = wire_in[5];
assign wire_out[3] = wire_in[4];
assign wire_out[4] = wire_in[3];
assign wire_out[0] = wire_in[7];
assign wire_out[0] = wire_in[7];
方法2:
直接用花括号{},组合输出。
比如 [7:0] wire_a 的反序输出可以表示为:
{wire_a[0],wire_a[1],wire_a[2],wire_a[3],wire_a[4],wire_a[5],wire_a[6],wire_a[7]}
把这个当成一个数直接用就好了。
方法3:
genvar i;
generate for(i = 0; i < 8; i = i + 1) begin
Assign wire_b[i] = wire_a[7 - i];
end
endgenerate
**9、**如何对bram/ram进行初始化赋值呢?
首先对于常规的情况,即加载.coe文件的方式实现初始化(与rom相同)
点击load initial file, 在右侧可以直接添加.coe文件,或者选择edit进行手动编辑(数据量不大的情况下可选,但是不推荐),那么.coe文件的格式是什么样的呢?
新建txt文本,将后缀改为.coe,对内容开始编辑,头部增加如下两句话:
MEMORY_INITIALIZATION_RADIX = RADIX ;
MEMORY_INITIALIZATION_VECTOR =VECTOR ;
RADIX为数据进制类型,包括十进制、二进制、十六进制。
VECTOR为数据,其中数据以",“为间隔进行分开,最后以”; "结尾(每个数据中间以逗号隔开,最后以分号结尾)。
其次第二种方法是针对数据量不大的情况下,自己定义一个二维数据作为ram使用,对这个二维数组的ram进行初始化赋值即可
**10、**两种常见的计数器触发条件
always @(posedge clk)
begin
If( & a) //当a为全1时给计数器赋值
cnt <= 10’d0;
else
cnt <= cnt + 10’d1;
end
always @(posedge clk)
Begin
If(a)
cnt <= 10’d1;
else If( | cnt ) //当cnt 为非0时计数器递增加一
cnt <= cnt + 10’d1;
else
cnt <= cnt;
end
11、现有一状态机,在one状态的时候想启动一个计数器,计数到11,状态跳转到two,在未计到11之前一直停留在one状态(状态机跳转顺序是idle–one–two)该怎么写计数器?这种写法很常用
**12、**头文件中已经写了include “./define.v但是仿真还是报错?
答:文件名需要写绝对路径,即使这个文件和工程其它文件在一个目录上。
例如只写成 include “define_file.v” 是不行的,要使用绝对路径,
如 `include “F:/Test/rtl/define_file.v”。
**13、**出现如下,显示211然后10s退出,这里通过更换版本解决由10.2c变成10.5
**14、**在安装破解modelsim的时候,直接考别人已经有的license ,把图中绿色的部分改成自己电脑的ip地址(dos窗口cmd----ipconfig -all查看),在环境变量中添加(不建议如此操作)。
然后在安装目录下考别人的modelsim.ini文件,以及编译好的库文件考到自己电脑并记住路径,将ini文件中的库文件路径的路径改成自己的库文件的路径,即可
15、modelsim仿真的时候(电脑上有debussy),窗口已经打开,但是总是会load 软件debussy目录下面的novas.dll文件,提示error。(这里我是从32位的modelsim改成了64位的modelsim,软件debussy只能联合32位的modelsim进行仿真)
解决方案:步骤一
红色箭头处的库文件路径不是vivado编译库的路径,要改成你工程下面的临时库文件的路径,vivado会去把你用的库考到这个文件下临时使用,我的路径为
C:/Users/Administrator/Desktop/AH330G/par/AH330G.cache/compile_simlib/modelsim
步骤二,确认仿真的编译库的文件路径和modelsim的路径,tools—options下拉就会有如下界面
16、testbench文件中如何写差分时钟对
17、QPLL和CPLL之间的联系和差别
如果需要高性能QPLL时,必须实例化GTXE2_COMMON/GTHE2_COMMON原语。若速率要求不高,则可以每个通道用CPLL。用QPLL时,每个QUAD块上若用多个GTX接口,则需要有主从之分。
Xilinx的7系列FPGA随着集成度的提高,其高速串行收发器不再独占一个单独的参考时钟,而是以Quad来对串行高速收发器进行分组,四个串行高速收发器和一个COMMOM(QPLL)组成一个Quad,每一个串行高速收发器称为一个Channel。另外这里需要说一下的事aurora里面的channel_up和lane_up,如果有四个lane,当四路的lane_up全部拉高以后,channel_up才会拉高,使用的时候需要把两个信号结合在一起使用。
QPLL和CPLL的区别,在于两者支持的线速率不同,对于CPLL来说,支持的线速率位1.6GHz到3.3GHZ之间,而对于QPLL来说,GTX支持的线速率分两档,Lower Baud支持5.93GHz~8.0GHz,Upper Baud支持9.8GHz12.5GHz,对于GTH则不分档位,支持的线速率为8.0GHz13.1GHz
**18、**利用此种方式类似于多路选择器,输出不同定义的参数
**19、**利用crc校验模块,一拍就能够计算出结果
20、Error: ambiguous clock in event control
是复位信号出现了问题,例:rst为低电平复位,但是在always@ (posedge rst)写成了上升沿
**21、**例化成例化四个一样的fifo,每个深度都为4K,但是在vivado中只会显示一个
22、vivado生成edf文件(这里在设置完成文件后,需要打开design,然后再敲入tcl命令)
https://blog.csdn.net/chuoshumi7080/article/details/100759628?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160972939916780262014534%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fblog.%252522%25257D&request_id=160972939916780262014534&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_v29-1-100759628.pc_v2_rank_blog_default&utm_term=edf
23、在进行模块话设计的时候,需要注意ready和link是否有效的条件,如果有效的话才保留数据,如果无效就直接丢弃数据,或者锁存信号进行处理
24、 在tb文件中增加ASCII码,可以在modelsim中查看状态机的名称
25、 aurora选择了全双工模式,只插一根线的时候,另一根不插光纤线的link是起不来的
26、 当两个同时钟域的信号在上板子debug时候出现在两个ila界面,不利于观察,这时候的解决办法是在代码中增加ila的ip核,然后两个信号就会在debug的时候出现在一个lia中
27、设置jtag的下载速率在哪里设置,打开open implemation design后,点击bitstream settings,在最上方显示,点击(下面的那个选项enable external是选择外部时钟):
28、 一个通道就是等于一个message ID(8位),一个message ID就等于多个IU,一个IU就相当于一个oxid,一个OXID包括多个seq_id,一个seq_id包含多个seq_cnt。
29、当第一个框里面的时钟低于3M的时候,下面那个框的使能应该选NO就选择了上升沿(YES默认是下降沿)
30、 vado2015生成波形保存tcl命令:
write_hw_ila_data C:/Users/Administrator/Desktop/debug/s_axis_tresp_data [upload_hw_ila_data hw_ila_7]
31、 调试srio的问题:
分为四种端口,I/O port,Message port,User defined port,Maintenance port,其中主要用到的是I/O port,(Maintenance port主要用来进行一些链路的训练,寻找device id),I/O port分为压缩I/O和initial/target I/O,会有两种模式HELLO和SRIO Stream模式;doorbell的包是门铃包,类似于中断的作用;采用hello模式传输数据过来的时候格式是头+数据;另外使用hello模式下的axi_user总线的内容为32位的source id + 32位的device id。
32、 vivado固化程序的时候,程序能烧进去,最终会烧写失败,报错:Invalid option:Byte 2487337 does not match (E7 !=F3)**
造成此现象的原因是因为flash写进去和读出来的数据不一致,导致检验失败,解决方法:首先通过vivado烧写flash的速率降到最低,再次烧写,如果此办法不行的话,只能更换flash芯片(造成此现象大多是一些国产化的flash芯片)
还有一种可能是因为连接的CPU板出现异常,导致FPGA加载flash失败
这里使用impact 将整个flash擦除,第一个选项和第二个选项均选择full_chip,擦除完再烧写,即可成功
33、 关于过时钟约束
当遇到时序分析报告没有报错,但是怀疑使用的时钟频率可能存在某些问题时,此时可以增高所用工作时钟的频率来再次综合(此处可以理解为时序分析变的更严格了),查看综合后的结果,进一步分析问题;此种方式是作为一种调试手段来使用
**34、**关于异步时钟约束
其中include_generated_clocks的意思是找到sys_clkp下的所有的衍生时钟,下面两句话效果一样(clkout0 clkout1 clkout2 clkfbout_1是由sys_clkp衍生出来的)
set_clock_groups -asynchronous -group [get_clocks -include_generated_clocks {clkout0 clkout1 clkout2 clkfbout_1 sys_clkp}]
set_clock_groups -asynchronous -group [get_clocks -include_generated_clocks sys_clkp]
35、 关于时钟约束是否生效
在添加完xdc约束后,不确定自己写的约束条件是否正确或者不确定约束条件是否生效,首先综合结束后打开你的综合窗口,在TCL CONSOLE窗口下敲入你的约束命令,来查看是否有错误(或者直接敲入约束命令中括号中的内容)。
36、 关于时钟穿越的问题,
如图所示,这里需要对clk_p和clk_n进行时钟约束,约束的语句如下:
create_clock -period 4.600 -name mgt_ref_clk_p_i -waveform {0.000 2.300} [get_ports mgt_ref_clk_p_i]
set_clock_groups -asynchronous -group [get_clocks -include_generated_clocks mgt_ref_clk_p_i]
但是在这里由于时钟不能穿越,所以还需要对CLK_1再次约束一次,约束的内容与上述约束的语句内容一致,但是查看约束报告中的时钟树可以发现,在增加约束之前clk_1是属于衍生时钟,增加约束后,clk_1作为单独的时钟来使用。这个问题出现在将vivado2015的版本移植到vivado2018上,前者跑版本无问题,后者出现了问题,发现图中CLK_1已经在时钟报告上看不到了,因此,由IBUFDS_GTE2出来的**.o(信号);时钟只能用来供给GT核使用,而.div(分频信号);**若供给给其他模块作为驱动时钟使用的话,需要接一个BUFG增强驱动能力,重要的是在这个BUFG出来的时钟即为图中的CLK_1需要用约束语句将它进行约束,才能正常使用。
需要强调的是若使用了上述单端的信号直接作为驱动时钟,那么在生成bit流的时候会出现错误。
37 出现定义信号为0,可是实际信号为1,管脚实际数据和定义值不一致的异常情况。
问题:在某次调试过程中出现了这么一种情况,用wire 定义了一个顶层的输出管脚,写法为 wire 【1:0】 a =0;在逻辑里面没有用,只是定义了它的数值来输出, 但是烧写程序后发现此信号管脚为高电平,即数值为1,查找综合后的原理图为:
解决方案:整个逻辑对没有使用到的信号,只有一个赋初值输出的情况下,赋值的时候写成assign a = 2‘d0; 可解决此问题,综合后的原理图为
38****utilization post implementation 中bram的个数单位是什么(以xinlin的k7325t为例,bram的个数为445个,那它的单位是什么呢)?
答:7系列的设备都有偶较大容量的 36Kb block RAMs,每个36Kb block RAM包含两个独立控制的18Kb RAMs。所以这里的单位是36 Kb Block RAM。
这些36Kb的block可以级联可以在最小的时序损失下,实现深度更深或者位宽更宽的存储。查表可知7K325T的Block RAMs分为7列,每一列有70个,共有445个36 Kb Block RAM,其中少了45个可以认为被处理为其他用途了。
39 当使用软核生成bit流的时候生成成功但是报错: Could not find a BMM_INFO_DESIGN property in the design. Could not generate the merged BMM file:
解决办法:
1、加入elf文件后,再生成bit流
Please check to ensure any BMM and ELF files in the design have correct proper scoping specified.
2、在generate 语法下,begin后面不准命名,如下图所示,begin:gt_top是不允许的
3、你的block design 中例化的例化名不准带"microblaze",修改例化名可以直接在block design 设计里面修改
You are correct changing the Microblaze instant names should solve this problem
4、如果还不行请按如下思路尝试:
40 使用ISE14.7 IMPACT进行烧录时出现闪退、ID CHECK失败的问题
我是在win10下面使用ISE 14.7的impact,在添加flash的时候直接闪退,解决步骤如下:
1、在ISE的安装目录下找到如下路 D:\Xilinx\14.7\ISE_DS\ISE\lib\nt64,在此目录下找到libPortability.dll 文件,将它后缀名修改为 libPortability.dll.orig;其次,在相同目录下找到libPortabilityNOSH.dll,将它在此目录下直接进行复制,可以得到libPortabilityNOSH_副本.dll文件,将此副本文件修改名称为libPortability.dll,因此在此目录下就会新得到一个libPortability.dll 文件。
2、在ISE的安装目录下找到如下路 D:\Xilinx\14.7\ISE_DS\common\lib\nt64,将步骤1中,在最后新得到的libPortability.dll 文件进行复制,复制到步骤2中的目录下,进行直接文件覆盖(替换)
由上述两部即可完成impact添加flash的闪退问题。
在项目中会遇到使用国微的flash,在烧录过程中出现id check失败的问题,解决方式如下:
1、右击计算机属性,进入高级系统设置,进入系统属性,选择高级中的环境变量
2、新建环境变量,变量名为XIL_IMPACT_SKIPIDCODECHECK,变量名设置为1
3、确定后重启电脑
由上述3部即可解决id校验失败的问题,成功烧写程序到flash中。
另外我的fpga的全部资料和笔记在这里哦(欢迎浏览查看):https://blog.csdn.net/weiyunguan8611/article/details/100934712
如果觉得对你有帮助请帮忙点赞关注,有误的地方欢迎各位铁汁留言,谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。