1. Xilinx ISE 编译时,place & route 很慢.
个人看法,有两种可能:
1. 你的工程占用资源较多,随着资源的消耗,如果工程很大,ISE需要反复将之前布线好的部分进行优化,以腾出空间给后面的逻辑,所以越到后来布通所花费的时间就越长;
2. 你的约束中有较为苛刻或是不合理的时序约束,ISE需要花大量的优化计算去满足你的约束。
欢迎讨论。
2. ISE 综合时 模块为什么会被优化掉是程序设计的问题吗
一般模块被优化掉是没有模块的没有输入信号,我觉得你应该在你模块的输入信号里仔细检查是否有关键的信号没有被驱动;尤其像时钟信号、复位信号等;代码还要你自己好好检查啊
3. 如果声明的寄存器变量过多,超过机器可用的寄存器是如何处理的
寄存器只是用来做中转的,不要把它当成普通变量来使用。不要声明那么多,而且大多数编译器对寄存器变量只是一个参考,寄存器不够时编译器会把寄存器变量处理成普通变量,这时寄存器变量已经意义不大。实际上现在很多编译器在优化时都会自动识别出那些频繁使用的变量,会把这些频繁使用的变量优化成寄存器变量。
4. 如何防止寄存器被优化掉
Verilog里也可以加keep属性的
lycxy521 (2010-11-01 21:26:04)
谢谢分享,最近正在学,希望有帮助
wangbo19852008 (2011-9-26 16:47:42)
注意:人家问的是在ISE的XST综合工具,你们回答的都是在QII的综合工具或者Synplify综合工具中的防止寄存器优化的约束,我试了就没一个好用的,悲剧,看清楚再回答啊!
Fei_Fly (2011-9-26 17:50:59)
在这个BUF两端的信号线上加上下面的属性(Verilog HDL版本): wire bufin /* synthesis syn_keep=1 xc_props="X" */; 具体解释: 1、syn_keep=1就是保留这个信号线,是它成为一个instance(synplify的),然后就可以对它添加XILINX的约束属性; 2、xc_props=“”是synplify为XILINX保留留的约束属性,可以透传到ISE的实现中去,从而约束实现过程。 3、“X”属性是在MAP时识别的KEEP属性,如果用XST综合就只需要在信号线的两端加上X属性就可以透传到MAP中去。但是synplify并不能识别,因此需要通过以上的方法将X属性透传到MAP中去。 类似在 VHDL中也适用 attribute syn_keep of temp01 : signal is true; attribute xc_props of temp01 : signal is "X";
110500623 (2011-9-27 16:30:44)
可以试下(* KEEP="TRUE" *)
5. 如何提高ISE的编译速度
如果你的cpu够强你应该学会如何利用好它来加速你的代码编译速度,那么你怎么才能够最大限度让你的cpu发烧呢?
下面是一个对比:
比如我的cpu是i7 3770k,
编译cocos2d-x的libcocos2d工程:
不优化:
1>Time Elapsed 00:01:35.25
优化后:
1>Time Elapsed 00:00:21.66
效果显着!!!
参考网页:
Visual Studio 2010中C++并行构建调优(1)
http://developer.51cto.com/art/201003/189235.htm
1>cl : Command line warning D9030: '/Gm' is incompatible with multiprocessing; ignoring /MP switch
解决办法是:
Properties -> Configuration Properties -> C/C++ -> Code Generation -> Enable Minimal Rebuild -> No(/Gm-)
Properties -> Configuration Properties -> C/C++ -> Geneal -> Multi-processor Compilation -> Yes(/MP)
一些含义和拓展资料:
Enable minimal rebuild
通过保存关联信息到.IDB文件,使编译器只对最新类定义改动过的源文件进行重编译,提高编译速度
Enable Incremental Compilation
同样通过.IDB文件保存的信息,只重编译最新改动过的函数
/MP (Build with Multiple Processes)
http://msdn.microsoft.com/en-us/library/bb385193.aspx
/Gm (Enable Minimal Rebuild)
http://msdn.microsoft.com/en-us/library/kfz8ad09.aspx
6. ISE综合(Verilog HDL),信号被优化问题
(1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,mole,negedge,posedge,operators,output,parameter。
(2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。
(3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。
建立可综合模型的原则
要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:
(1)不使用initial。
(2)不使用#10。
(3)不使用循环次数不确定的循环语句,如forever、while等。
(4)不使用用户自定义原语(UDP元件)。
(5)尽量使用同步方式设计电路。
(6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。
(7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。
(8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。
(9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。
(10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。
(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。
(12)避免混合使用上升沿和下降沿触发的触发器。
(13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。
(14)避免在case语句的分支项中使用x值或z值。
不能综合的语句:
1、initial
只能在test bench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial也可以综合,不知道为什么)
2、events
event在同步test bench时更有用,不能综合。
3、real
不支持real数据类型的综合。
4、time
不支持time数据类型的综合。
5、force 和release
不支持force和release的综合。
6、assign 和deassign
不支持对reg 数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。
7、fork join
不可综合,可以使用非块语句达到同样的效果。
8、primitives
支持门级原语的综合,不支持非门级原语的综合。
9、table
不支持UDP 和table的综合。
10、敏感列表里同时带有posedge和negedge
如:always @(posedge clk or negedge clk) begin...end
这个always块不可综合。
11、同一个reg变量被多个always块驱动
12、延时
以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。
如:a=#10 b;
这里的#10是用于仿真时的延时,在综合的时候综合工具会忽略它。也就是说,在综合的时候上式等同于a=b;
13、与X、Z的比较
可能会有人喜欢在条件表达式中把数据和X(或Z)进行比较,殊不知这是不可综合的,综合工具同样会忽略。所以要确保信号只有两个状态:0或1。
7. 如何防止寄存器被优化掉
在这个BUF两端的信号线上加上下面的属性(Verilog HDL版本): wire bufin /* synthesis syn_keep=1 xc_props="X" */; 具体解释:
1、syn_keep=1就是保留这个信号线,是它成为一个instance(synplify的),然后就可以对它添加XILINX的约束属性;
2、xc_props=“”是synplify为XILINX保留留的约束属性,可以透传到ISE的实现中去,从而约束实现过程。
3、“X”属性是在MAP时识别的KEEP属性,如果用XST综合就只需要在信号线的两端加上X属性就可以透传到MAP中去。但是synplify并不能识别,因此需要通过以上的方法将X属性透传到MAP中去。类似在 VHDL中也适用 attribute syn_keep of temp01 : signal is true; attribute xc_props of temp01 : signal is "X";
8. 请教register unsigned long
寄存器变量 register,直接放到cpu中的变量 适合使用频繁的变量,可以提高运行速度。只限于整形,字符型,指针型的局部变量。但一般CPU寄存器是有限的,申请多了是无效的自动降为自动变量,也就是普通变量(auto 缺省)。不同的CPU,可用的寄存器变量时不同的。此外,有时使用寄存器变量或者说某些频繁使用的变量被编译器优化为寄存器变量,将会导致一些问题:我曾经就遇到过,例如说while(i < N){....}在调试时发现i >或 =N时依然在循环中,因为它没有从内存中读值,读的是脏数据,而在调试时,调试器是读的内存,程序运行时是读的寄存器,所以程序看起来就是无法理解,后来在该变量前加上volatile以防止编译器优化它为寄存器变量才解决问题。
9. 如何防止ISE综合时信号不被优化掉
1.右键synthesis,在综合选项里将keephierarchy选择YES
,或者选择soft(在综合时保持层次,在实现时有利用ISE软件自动进行优化),这样有利于你从模块中找到你想抓取的信号和信号名不被更改。
2.在Constraints
的问题。其实ISE的工程设置有“keep_hierarchy”。在程序里面,也可以通过添加一些语句。如果是Verilog:
Place the Verilog constraint
immediately before the mole or instantiation.
Specify the Verilog constraint asfollows:
(* KEEP = “{TRUE|FALSE |SOFT}” *)
假如我们要观察的一个信号cnt:reg[10:0]cnt;,那么就按照
文档中的介绍,要保持此信号不被综合,则:(* KEEP =“TRUE” *)reg[10:0]cnt ,或者(*keep=“true” *)reg[10:0]cnt
这样就可以实现ChipScope的观察而不被优化掉了。类似的VHDL:
Declare the VHDL constraint asfollows:
attribute keep : string;
当然,这些都是针对ISE的综合器XST的,如soft只有在XST里才可以使用,其它的综合工具,可以参看相关的文档,这些问题都有专业而又明确的说明。
10. 怎么指定某段代码不被编译器优化掉
在C语言中, 某些语句,如:
int a;
a = 0;
a = 1;
a =2; 这个可能编译器会把前面两句给优惠掉, 这个如果 前面两句也是必须要执行的, 可以把 int a 改成 volatile int a。
在编译的时候, 编译器可能会预测到某个变量的值, 就把中间的没有必要的语句给优化掉,volatile 关键字就是告诉编译器,不要做这样的预测性优化, 按照文本代码来翻译。