显示标签为“IC设计”的博文。显示所有博文
显示标签为“IC设计”的博文。显示所有博文

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;
}
}
}
}

2008年11月26日星期三

ncvlog: *E,DUPIDN (t.v,1795|25): identifier 'xx' previously declared [12.5(IEEE)]

这个ERROR明确指出该信号(xx)在前面已经定义了,那么解决办法当然是取消重复定义。但是若在前面没有找到该信号的显式定义(譬如,wire xx;),就要看该信号在前面是不是已经被使用了,譬如在例化别的模块时,用该信号作为连接信号。

解决办法在最先使用这个信号的地方显式定义该信号
引申: 在碰到这个ncvlog的ERROR时,先搜索,看前面是否有显式定义,若有则改之;若没有,则要考虑前面是否有用到这个信号的地方。

Tip
在verilog中,没有显示定义的变量,编译器会默认其类型为wire,相当于定义了该信号。当编译器解析到显式定义的地方时,就会认为是重复定义。

2008年11月11日星期二

using the same coding style(both RTL or both handcode) to get generated clock to avoid RTL simulation errors

有两个generated clock: clk1和clk2.它们都是从source clock(clk_src)分频得来的。在STA的constrain中,clk1和clk2是sync的,因此CTS后,可以保证clk1和clk2是sync的。

clk1是用RTL写的:
always @ (posedge clk_src or negedge rst_)
if (!rst_)
clk1 <= 1'b0;

else
clk1 <= clk1_d;

clk2是用handcode写的:
DFCNQHVTD1 DNTCLK2 (.Q(clk2), .D(clk2_d), .CP(clk_src), .CDN(rst_));
DFCNQHVTD1是technology library里面的cell.

这两段代码在功能上是相同的。在RTL仿真中,如果DFCNQHVTD1不含delay,则clk1和clk2的相位也是相同的,即边沿对齐。但是,若在RTL仿真中,DFCNQHVTD1含有delay(CP-->Q有延时),clk1和clk2就会错开一些。这可能会导致RTL simulation出错。

所以,最好全用RTL或全用handcode来产生generated clock,以避免上述的问题。

2008年11月7日星期五

Novas Debussy for Linux终极破解

Novas公司的Debussy类似于软件行业的SourceInsight,对于代码的浏览,跟踪(trace),调试(debug)等都有很好的支持,使用非常方便,是IC前端设计人员必备的一个软件。
破解的方法是在网上找的,在这儿记录一下,同时根据我的经验做了点修改。
具体过程:
1、打开一个terminal,进入debussy/platform/LINUX/bin/
2、启动gdb, gdb debussy回车
3、设置断点, break snsCheckOut回车, 程序将返回一个地址,我的是0x8dfd8b0
4、使用objdump反汇编,输出如下(同时包含机器码和汇编代码,方便定位)
objdump -d --start-address=0x8dfd800 --stop-address=0x8dff900 debussy
08dfd8b0 <snsCheckOut>:
8dfd8b0: 55 push %ebp
8dfd8b1: 89 e5 mov %esp,%ebp
8dfd8b3: 81 ec 0c 30 00 00 sub $0x300c,%esp
8dfd8b9: 57 push %edi
8dfd8ba: 56 push %esi
8dfd8bb: 53 push %ebx
8dfd8bc: 8a 4d 18 mov 0x18(%ebp),%cl
8dfd8bf: 88 8d fb cf ff ff mov %cl,0xffffcffb(%ebp)
8dfd8c5: 8a 4d 28 mov 0x28(%ebp),%cl
5、打开KHEX编辑器,打开debussy文件(platform下的那个35M的)搜索55 89 e5 81 ec 0c 30 00 00 57 56(这组数字根据版本不同可能有所差别,只要定位上面08dfd8b0 <snsCheckOut>:后的代码即可),将头三位改为31 c0 c3 ,存盘退出。
修改后如下:

08dfd8b0<snsCheckOut>:
8dfd8b0: 31 c0 xor %eax,%eax
8dfd8b2: c3 ret
8dfd8b3: 81 ec 0c 30 00 00 sub $0x300c,%esp
8dfd8b9: 57 push %edi
8dfd8ba: 56 push %esi
8dfd8bb: 53 push %ebx
8dfd8bc: 8a 4d 18 mov 0x18(%ebp),%cl
8dfd8bf: 88 8d fb cf ff ff mov %cl,0xffffcffb(%ebp)
8dfd8c5: 8a 4d 28 mov 0x28(%ebp),%cl
7、再起debussy,一切ok.无须license,也不会trace几次就退出了。All N0v@$ products for all Operating systems can be cr@cked easily without license file.Just force the return value of the procedure "snsCheckOut" to "0" or fool the "compare and jump" instruction after calling "snsCheckOut"

about objdump:
-d --disassemble Display the assembler mnemonics for the machine instructions from objfile. This option only disassembles those sections which are expected to contain instructions.
--start-address=address Start displaying data at the specified address. This affects the output of the -d, -r and -s options.
--stop-address=address Stop displaying data at the specified address. This affects the output of the -d, -r and -s options.

2008年6月30日星期一

potential glitch in asynchronous reset

使用异步复位(reset)时如何避免毛刺(glitch)
1.毛刺(glitch)
对于一个简单的与门、或门电路,当输入信号同时向相反的逻辑电平跳变时,可能会产生毛刺。譬如,assign rst = rst_a & rst_b;当rst_a 从1-->0(或从0-->1),同时rst_b从0-->1(或从1-->0)时,就可能产生一个向上的尖峰脉冲(也就是我们所说的毛刺)。同样,对于一个或门来说,若输入信号同时向相反的逻辑电平跳变,也可能会产生毛刺,不过这里产生的是向下的尖峰脉冲而不是向上的。
是否产生毛刺取决于输入信号之间跳变的相对速度,但这一般是不可预知的。所以,我们应该尽量避免使用可能产生毛刺的逻辑,或者虽然会产生毛刺,但对负载电路没有影响的逻辑。
2.异步复位(reset)
在数字电路设计中,我们经常会使用异步reset将电路复位到初始状态。异步reset信号可能是由一些相关信号经过组合逻辑而生成的,譬如与门、或门等。我们知道,或门会产生向下跳变的glitch(而不会产生向上跳变的glitch),与门会产生向上跳变的glitch(而不会产生向下跳变的glitch)。所以,若异步reset信号是高电平有效的,使用或门将相关的信号连接起来可以避免glitch;同样,若异步reset信号是低电平有效的,则使用与门,也可避免glitch。当然,其前提是生成这个异步reset的所有相关信号本身都是没有glitch的。
3.结论:若异步reset是高电平有效,则使用或门;若是低电平有效,则使用与门。

2007年4月19日星期四

等效逻辑门的计算

在数字IC设计中,经常会遇到等效逻辑门的概念,用来衡量设计的电路的规模。究竟什么是等效逻辑门,以及等效逻辑门是怎么计算的呢?
我们知道,综合工具(如Synopsys的Design Compiler)一般只给出面积和逻辑单元(Logic Cell)的信息,而没有等效逻辑门的信息。因为所有的逻辑电路都可以用与非门来实现,所以,通常所说的等效逻辑门实际是等效二输入与非门(NAND2)。我们可以首先使用综合工具得到同一工艺下一个NAND2的面积,然后,用综合后的电路面积除以这个NAND2的面积即可得到等效逻辑门的数值。

下面是关于集成电路规模的解释:
– 集成度,规模: 包含的晶体管数目或等效逻辑门(2输入的NAND)的数量,1个2输入的NAND=4个晶体管

2007年4月16日星期一

Flexlm管理的license格式介绍

许多EDA软件的加密采用Flexlm(Flexible License Manager)方法,这是由Globetrotter公司发明的软件加密方法。Globetrotter公司向软件厂商出售相关开发软件,软件厂商把此加密程序集成到自己的软件中,该方法是目前最为流行的EDA软件加密方法,已被80%以上的EDA公司所采用。该方法可以锁定机器的硬盘号、网卡号、使用日期、支持加密狗等,以保护软件的知识产权。

下面简单介绍Flexlm软件管理的license的文件格式。

License文件由注释行、Server行、Daemon行以及Feature行构成,另外使用续行符号''用来表示一行的继续。


注释行
当一行的开始是'#'符号时,该行被认为是注释行。

Server行
Server行用来标识一台特定的主机,其格式如下:
SERVER host hostid [port]
SERVER是该行的关键字,标识该行为Server行,不能更改;
host表示主机的名称,在UNIX/LINUX系统中,可以用命令“hostname”或“uname -n”获得;在Windows NT/2000/XP系统中,可以通过命令“ipconfig /all”获得;
hostid表示主机的ID号,使用Flexlm License管理工具的lmhostid命令获得;
port表示使用的TCP/IP的端口号,在UNIX/LINUX系统下,该数值需要大于1024,因为小于1024的端口号已被操作系统使用;如果没有指定port,则使用27000~27009之间的一个有效端口号。一般使用27000端口号。

Daemon(或Vendor)行
Daemon行用来标识不同的软件提供商,该行的格式如下:
DAEMON daemon_name [daemon_path]
DAEMON是该行的关键字,标识该行为Daemon行,不能更改;
daemon_name是实际运行的License管理工具的名称,如lmgrd等;
daemon_path是该工具的存放路径。

Feature行
Feature行用来对软件特定的功能进行限制,常见格式如下:
FEATURE feature vendor feat_version exp_date num_lic SIGN=sign [optional_attributes]
FEATURE是该行的关键字,表示该行为Feature行,不能更改;
feature是软件提供的特定功能的名称;
vendor表示软件提供商的名字;
feat_version表示该feature的版本号;
exp_date表示该license的过期日期,格式为dd-mm-yy,例如31-04-2007。另外,如果该字段为"permanent"或yy位为0(或者00,000,0000),那么该license永不过期;
num_lic表示该许可的终端用户个数;
SIGN=sign是用于验证该feature的签名,是根据以上条件和Flexlm加密算法计算出来的密码,一般和机器的硬件设备相关,譬如硬盘号,网卡号等;
[optional_attributes]有众多选项,详细的可参考Flexlm的End-User-Manual。

续行符号''
一行太长需要续行的时候,在行末尾用''符号表示续行。