2009年6月26日星期五

How to speed up emulation/system debug?

2009年5月20日星期三

ISE:After add source (verilog) and set top module, no sub-modules appeared below the top module

在ISE中,我们添加了source file后,ISE软件会自动对这些source file进行分析,然后在Sources视图中显示其层次结构,即top下有哪些子模块,这些子模块下又分别有哪些更小的子模块。有时候ISE不能自动确定top module,需要我们手工设置一下。
现在遇到的问题是,在添加了source file后,在Sources视图中,top module下没有相应的子模块,即没有显示出design的相应层次结构。如果打算使用partition,也会因为无法找到相应的子模块而没法进行。
最开始怀疑是design的coding style有什么问题,但不知道具体是什么问题。在和Xilinx的AE联系后,发现ISE10.1版本在处理大的source file时有些问题,导致无法正常显示design的hierarchy。解决办法有两个:
1. 每个module放在一个文件中,然后把这些文件都添加到ISE中。在我的case里,所有module都放在一个文件里面了,导致这个文件很大(10M左右)。
2. 设置环境变量并改变其值
XILINX_DU_REDUCTION_SIZE 1000000
default值是1000000,表示1M的意思。如果文件很大,譬如10M,则可以将这个值设为15000000(至少要比文件的大小要大)。

2009年5月18日星期一

ISE: Map failed due to timing can not meet

在用ISE Implement Design的时候,在Map阶段就由于timing的问题fail了。Error信息如下:
Pack:1653 - At least one timing constraint is impossible to meet because component delays alone exceed the constraint. A physical timing constraint summary will appear in the map report. This summary will show a MINIMUM net delay for the paths. For more information about the Timing Analyzer, consult the Xilinx Timing Analyzer Reference manual. For more information on TRCE, consult the Xilinx Development System Reference Guide "TRACE" chapter.

由于在Map阶段,还没有考虑wire delay而只有cell delay,所以这个时候timing无法满足是必须要解决的。问题是fail以后,无法生成STA report,这样也就无法确定是哪条path出了问题。解决方法是:设置环境变量set XIL_TIMING_ALLOW_IMPOSSIBLE=1,让ISE在impossible的情况下仍然继续下去。这样可以生成STA report,我们就可以定位critical path并给出相应的解决方法了。

2009年4月25日星期六

在blogpot中显示程序源代码

在blog上写些技术性的东西,总有需要将源代码在帖子中显示的需求。在网上找了好久,相关的资料倒是不少,但自己毫无CSS基础,看了别人的说明自己也搞不定,一个大问题就是不知道这些方法中所提供的CSS代码放置在模板中的哪个位置。最后在下面这篇博文的评论/回复中找到了答案,这段CSS代码需放在模板的HTML代码的</head>前(“布局”-->“修改HTML”)。我放在了下面这段的后面了。
-----------------------------------------------
Blogger Template Style
Name: Rounders 3
Designer: Douglas Bowman
URL: www.stopdesign.com
Date: 27 Feb 2004
Updated by: Blogger Team
----------------------------------------------- */

但是这个解决方法对缩进,"<"和">"的支持好像不是很好,不知是否有更好的解决方法~~

国良先生的博文:
http://klcintw4.blogspot.com/2006/11/blog-post_03.html

2009年4月24日星期五

如何修改DC关于wire的命名规则

用DC综合一个设计,在一个子模块中出现了名字为N110和n110的两个wire,在APR flow中,如果不区分大小写,就会有问题。解决方法如下:
在.synopsys_dc.setup中加入下面这个name rule
define_name_rules Jerry_Rule -restricted "mailto:!@#$%%5E&*%28%29%5C%5C-%5B%5D/" -case_insensitive -first_restricted "0-9 _ \\"
在综合脚本compile后,write netlist前加入下面这句
change_names -rules Jerry_Rule -hierarchy

其中,-case_insensitive 是让DC不产生这种仅大小写不同的wire name的选项。

另外,我写了个Perl Script,可用于check 综合后的netlist中是否有这种仅大小写不同的wire name。

下面的"while() {"实际为"while(<SRCFILE>) {", 下面这个代码框在处理<和>时会有问题,不知道有什么好的解决方法~~

#! /usr/bin/perl -w
use strict;

my $srcfile = $ARGV[0];
my @var;
my $word;
my %var_hash;
my $key;
my $value;
my $module;

open SRCFILE, "< $srcfile" or die "can not open the source file:$!";
while () {
@var = split /\s+\(,;\)/;
if (/\bmodule\b\s+(\w+)/) {
$module = $1;
print "Begin parser module $module...\n";
foreach $key (sort keys %var_hash) {
delete $var_hash{$key};
}
} elsif(/\bendmodule\b/) {
print "End parser module $module.\n";
}
foreach $word (@var) {
unless ($word =~ /(^\s+$)(^$)/) {
unless (exists $var_hash{$word}) {
foreach $key (sort keys %var_hash) {
if (($word =~ /\b$key\b/i) && ($key =~ /\b$word\b/i)) {
print "ERROR: $word and $key are the same except case\n";
}
}
}
if ($word =~ /^\w+/) {
$var_hash{$word} = 1;
}
}
}
}

2009年3月14日星期六

Techniques to improving timing

There are several methods can be used to improve timing.
1. Move critical signal close to output of a gate, this may be used in ECO phase.
2. Move critical signal closer to the output
3. Replicate logic
4. Use Complex Gate
5. Retiming – move logic to next T
6. Retiming - move Logic to prev T

7. Clock Gating
8. Additional methods
1)Use Low Vt cell to improve timing
2)Size up weak gates in the path

2009年1月12日星期一

USB3500作为USB HOST PHY使用时的一些注意事项

1. 在EOP阶段,USB3500不会给相应的TXREADY信号,我们只需要把要发送的数据告诉USB3500即可,USB3500会自己处理SYNC和EOP的事情。
2.HOSTDISC仅在USB3500处于High Speed模式时有效,若不在High Speed模式,则HOSTDISC=0;另外,若发生了disconnect, HOSTDISC的值是每隔1个Micro Frame的脉冲,而不是level信号,这点需要注意。在我们原先的ASIC design中,也会每隔1个Micro Frame去采样EPHY送出来的Disconnect信号,若直接用USB3500的HOSTDISC取代EPHY的Disconnect信号,则由于design和USB3500的采样时刻未必一直,导致design内部看不到USB3500的HOSTDISC信号。解决办法就是在用HOSTDISC取代EPHY的Disconnect信号的同时,取消每隔1个Micro Frame采样Disconnect信号的做法。
3.还有一个需要特别注意的地方,即在TXVALID为高时,USB3500的控制信号(XCVRSEL/TERMSEL/OPMODE) 需保持稳定,否则USB3500的内部状态会乱掉,导致输出不正常。

2008年12月31日星期三

稿费

读研时投的一篇论文,意外的收到了稿费(电子与信息学报),虽然只有400元,但还是有些惊喜~~

2008年12月22日星期一

Tip: Reset and Chirp process when use USB3500 as USB HOST's PHY

In USB3500 datasheet 7.14 “USB Reset and Chirp”, the reset and chirp process is detailed described using one figure and the description text. But if you do the reset and chirp process following the instruction of the figure, you may not get the correct result.
As show in the following figure (Figure 7.9), first you set xcvrselect = 2'b01, termselect = 1'b1 and opmode = 2'b00 before reset to detect device attachment (T0~T2); then you set xcvrselect = 2'b00, termselect = 1'b0 and opmode = 2'b00 to drive SE0 on bus (T2~T3); then you wait ChirpK on bus to translate to the next state, but you can not watch ChirpK on bus through the reset process using the current setting (xcvrselect/termselect/opmode), this is the problem. Why?
As we know, we can not see the DP/DM by using USB3500. We can only get the bus status through linestate. In USB3500 datasheet 7.1 “Linestate”, it gives the usage and meaning of linestate under different conditions. We can see in Table 7.2, when XCVRSEL[1:0] = 00, TERMSELECT = 0 and OPMODE = 00/01, the only valid linestate value is 00 (SE0) or 01 (J-state). So if we set xcvrselect = 2'b00, termselect = 1'b0 and opmode = 2'b00 in T2~T3, even the device drives ChirpK on bus, we can only get J state on bus.
Solution:
From Table 7.2, we know that in order to see the ChirpK on bus, we must set opmode to 2'b10. So there are two solutions to resolve this problem.
1. Set xcvrselect = 2'b00, termselect = 1'b0 and opmode = 2'b10 in T2~T3. As opmode = 2'b10 only have meanings when host drives ChirpJ/ChirpK (Disable bit stuffing and NRZI encoding), this setting can work well when host drives SE0 on bus. With this setting, design can get the correct ChirpK from linestate at T3.
This method is simple but it may seem a little different with the datasheet.
2. At T2~T3, the bus state is SE0 and then the actual bus state is ChirpK, but due to opmode setting (opmode = 2'b00), the linestate value is 2'b01 (J-state). So we can detect the bus state transition between T2 and T3. If we detect the bus state (linestate) changes from 2'b00 to 2'b01, then we set opmode = 2'b10 to observe the ChirpK from linestate.
Both methods work well and can get the correct reset and chirp process.

2008年12月3日星期三

[转载] Xilinx ISE所涉及的一些命令以及Command Line的使用

原文:http://www.edacn.net/bbs/viewthread.php?tid=14174
因为目前进行的一个项目使用了多块容量较大的Xilinx FPGA, 对各块FPGA进行synthesis,map,P&R和generating programming file就成了一个大问题。(惭愧啊,group里没有人有modular design的经验)虽然现在的工作站性能比较强劲,但产生每一个programming file还是要花上好几个小时。所以考虑到在Command Line下面进行所有的编译工作,下面是一点点心得,希望对大家有所帮助(不知道有Westor在那本ISE详解里面介绍过这个没有,偶是没有看过那本书了,不过,要是Westor已经写过了的话,:-(. $#@%%N#%&*^$###@#)。废话少说,言归正传。
1.Command的介绍
要完成一次完整的Xilinx FPGA编译过程,涉及到的Command包括了:
XST:
全称为Xilinx Synthesis Technology,这是Xilinx ISE里面附带的一个免费的综合工具。(呵呵,Synplify Pro的购买正在商洽之中)Synthesis完毕后,你可以用任何的文本工具打开后缀名为“.syr”的文件,察看synthesis的具体运行过程及报告。
NGDBuild:
这个命令,其实就是translate啦。这是implementation的第一步。它会把所有的netlist和design constraint合并到一起,生成一个ngd文件供map工具使用。同样的,NGDBuild的报告文件是后缀名为“.bld”的文件。
MAP:
MAP命令是将NGDBuild命令所生成的ngd文件,映射到具体的FPGA器件里面去。MAP将产生一个NCD文件供PAR使用。你可以用任何文本工具打开后缀名为“.mrp”的map报告文件。
PAR:
Place & Route。这个偶就不多说了。免得被砖头砸到。PAR的报告文件后缀名是“.par”。
TRCE:
这个是用来产生偶们最最关心的timing report的。TRCE会分析你的FPGA的设计并且产生一个后缀名为“.twr”的时序报告。你可以用任何文本工具打开它,也可以用xilinx的Timing Analyzer。Timing Analyzer比较直观,推荐新手使用。
Bitgen:
顾名思义,这个Bitgen就是用来generate programming file啦。
2. 使用举例
介绍完Xilinx提供的这些命令后,让我们来看看如何使用它们吧。Xilinx给我们提供了一个很有用的工具:View Command Line Log File。这个工具位于Process for Source窗口的Design Entry Utitlities下面。
双击这个View Command Line Log File,你看到了什么?哈哈,在右边的文本编辑窗口里面出现了类似于下面的语句:
xst -intstyle ise -ifn __projnav/fpga_a.xst -ofn fpga_a.syr
ngdbuild -intstyle ise -dd d:\projects\hardware\hy_multifpga_nwpci_vhd_new_improvetiming/_ngo -uc ./source/hy/fpga_a.ucf -aul -p xc2v6000-ff1152-4 fpga_a.ngc fpga_a.ngd
map -intstyle ise -p xc2v6000-ff1152-4 -cm area -pr b -k 4 -c 100 -tx off -o fpga_a_map.ncd fpga_a.ngd fpga_a.pcf
par -w -intstyle ise -ol high -t 1 fpga_a_map.ncd fpga_a.ncd fpga_a.pcf
trce -intstyle ise -e 1000 -l 1000 -xml fpga_a fpga_a.ncd -o fpga_a.twr fpga_a.pcf
bitgen -intstyle ise -f fpga_a.ut fpga_a.ncd
对了,上面的这些就是你以前曾经使用过的命令啦。其实,我们用ISE作Synthesis,Map,PAR的时候,ISE就会自动调用上面所说的那些command,ISE其实就是一个GUI罢了。:-)
如果双击View Command Line Log File时,出现了下面的错误提示:
Warning: This process is used to display the running command log file that records some application command lines.
这就说明了你还没有implement过你的design,或者你已经清空过了这个design。(在project目录下面,有一个cleanup project files按钮,可以清空)
接下来,就是最后一步啦。你只需要用任何文本编辑器,把上面这段Command的历史纪录Copy&Paste,再存为一个”.Bat”批处理文件,在windows的command line下面执行就可以了。注意需要把这个.bat文件放在你的项目所在目录下。
3. 几点注意
a. 如果要连续跑好几个project,建议先使用Cleanup Project Files.根据偶的经验,如果不进行清空的话,Synthesis和PAR有时会出错。但是这里会出现一个小问题,清空过后,原有的一些文件可能会被删除,比如__projnav目录下面的*.xst(这个时XST的配置文件,做Synthesis的时候,XST会读这个文件以获得相关配置),再比如*.prj(project文件,里面罗列了一些被你的设计所使用的module)以及*.ut文件(ut是Bitgen的配置文件)。这3种文件,在使用Command Line之前最好确认一下是否存在。偶一般会将这3种文件作备份,到时候好拿出来,改一改就用。
b. 在Xilinx的安装目录Xilinx\doc\usenglish\books\docs下,有关于这些command的pdf文件,如果有需要,可以读一读。不过,经过偶苦读一阵之后,偶发现,其实没有太大必要,有问题再说吧。
4. 总结
这是偶第一次发原创,肯定有很多不足之处,恳请赐教。其实这个话题也比较简单,三言两语也可说清楚,但根据偶过去惨痛的新手经验,偶相信还是比较详细地讲解一些为好。至少可以让新手们多了解一些ISE本身嘛。如果大家觉得有那么一丁点儿用处的话,就请re一下先,也不枉偶打那么多字嘛。嘿嘿。
转载请注明作者spriteice

【转载者注】下面是丁丁的回复,感觉也比较有用:
1,Achieve可以进行版本管理,但是文件太大。一般来说,作版本控制最好是保存所有原始输入,如果做FPGA,原始输入包括HDL代码,综合工程.prj或者脚本.tcl,综合约束.sdc,实现约束.ucf,所有core的网表.edn,实现的脚本.bat,再有就是注意综合工具的版本和实现工具的版本。如果所有这些都没有变化,那么可以保证再运行一遍得到完全一样的结果。这也是版本控制的一个关键吧,只要保证可重复性,那么那些结果除了bit你要用到其他也可都不保存。
2,时间标签就是time stamp,在网表文件和bit文件头都有,表示这个文件的生成时间记录,这个不会影响到内部的功能。
3,在插入测试引脚这里,可以利用FPGA Editor来操作,直接编辑.ncd文件,再进行bitgen就可以了,那么如果你需要插入很多测试引脚,利用脚本(好像是.scr)可以帮你自动完成,然后只进行bitgen就可以了,避免重新布局布线浪费时间,避免重新布局布线影响timing。当然FPGA Editor还可以做很多修改了,就不多说了。
4,给一个以前的脚本例子:
综合和实现的命令行:
synplify_pro -batch ../script/chip_syn.tcl
ngdbuild -dd ./_ngo -uc ../script/chip_par.ucf -p xc2s200-fg456-5 .\rev_1\chip.edf chip.ngd
map -p xc2s200-fg456-5 -timing -cm speed -detail -ir -pr b -o chip_map.ncd chip.ngd chip.pcf
par -w -ol med chip_map.ncd chip.ncd chip.pcf
bitgen -w -f ../script/chip_par.ut chip.ncd
copy chip.bit ..\bit\
里面这个chip_par.ut保存了bitgen命令的选项,也可以不用这个文件,都加在命令行里。
后面是chip_syn.tcl:
project -new
#add_file options
add_file -constraint "../script/chip_syn.sdc"'
add_file -verilog "../src/src1.v"
add_file -verilog "../src/src2.v"
add_file -verilog "../src/src3.v"
add_file -verilog "../src/src4.v"
add_file -verilog "../src/src5.v"
add_file -verilog "../src/src6.v"
add_file -verilog "../src/src7.v"
add_file -verilog "../src/src8.v"
#device options
set_option -technology SPARTAN2
set_option -part XC2S200
set_option -package FG456
set_option -speed_grade -5
#compilation/mapping options:
set_option -default_enum_encoding default
set_option -symbolic_fsm_compiler 0
set_option -resource_sharing 0
set_option -use_fsm_explorer 0
#map options
set_option -frequency 50.000
set_option -fanout_limit 100
set_option -disable_io_insertion 0
set_option -pipe 0
set_option -fixgatedclocks 0
set_option -retiming 0
set_option -modular 0
set_option -update_models_cp 0
set_option -verification_mode 0
#simulation options
set_option -write_verilog 0
set_option -write_vhdl
#automatic place and route (vendor) options
set_option -write_apr_constraint 0
#set result format/file last
project -result_file "rev_1/chip.edf"
#implementation attributes
set_option -vlog_std v2001
project -run
只是个人的一点建议,版本控制只要做了就可以,保存archive也要知道这个东东怎么来的,下次可以保证还作出来同样的东东。保存命令行也要知道所有的软件版本等。