认识异步复位寄存器同时学习timing_arc约束
创始人
2024-04-04 04:37:03
0

       众所周知,我们在IC设计中采用异步复位的方式,那么异步复位寄存器在你的RTL下它到底长什么样子呢?

为此我找到一篇知乎前辈的文章,进行精选,下面详细的了解一下异步复位异步置位寄存器的生成以及结构和相关的timing约束如何进行。

verilog语法中always@(posedge clk or negedge clk)这种语句是我们最常用的语句之一。

IC设计中一般我们的写法是:

always @ (posedge clk or negedge resetn)beginif(~resetn)q <= 1'b0;else q <= 1'b1;
end

这里需要说明的是 always block块中

1:必须要有if 条件语句,否则dc 工具会报错,

2:if条件判断语句中的信号必须在always块的敏感信息列表中

3:if中条件如果为(resetn),则会报错,因为在敏感列表中写的是negedge resetn,如果敏感列表中为posedge resetn,则不会报错。

4:敏感信号列表中要么都是边沿触发信号,要么都是电平触发,不能混合。

规避掉以上问题,上面代码框中的RTL综合后你就会得到一个如下所示的寄存器:

这是一个带反相器的异步复位寄存器结构。

那么加入我把always块中的negedge resetn改为posedge resetn,综合出来的寄存器会是什么样子?

看,反相器没了。

此时我们可以暂时性的得出一个结论,异步复位寄存器都是high active。

我们继续往下看:

always块中不仅可以控制异步复位还可以控制异步置位。在敏感列表中添加更多的trigger signal,可以让dc产生带有异步置位pin的DFF。

TSMC的lib中,异步置位的pin都是SDN,low active,因此下面的电路图都是以SDN表示异步置位管脚。

always @ ( posedge clk or negedge resetn or negedge setn ) beginif ( ~resetn )      q <= 1'b0;else if ( ~setn )   q <= 1'b1;else                q <= d;
end

 这是标准的同时带有异步复位和异步置位的verilog代码,综合后的电路如下:

DFF的异步复位输入pin是CD,它是high active,而异步置位输入pin是SDN,是low active,verilog代码使用的resetn和setn都是negedge trigger,因此异步复位会多出来一个INV cell,而SDN就不会。

如果把set_n放在rst_n前面,依然能综合成功,此时set_n在if条件中有更高的优先级,而且dc工具综合后的电路会多出来一些cell,用于判断setn优先级高于resetn。

always @ ( posedge clk or negedge resetn or negedge setn ) beginif ( ~setn )          q <= 1'b1;    else if ( ~resetn )   q <= 1'b0;else                  q <= d;
end

综合后的电路如下:

在TMSC的doc目录中找到描述cell的文档,能发现其实TSMC对CD和SDN是有要求的,要求CD和SDN不能同时有效,如下图中所示:

  

同时,对应的verilog model中,找到DFF对应的primitive原语,发现CD比SDN的优先级更高。如图中所示。

 dc工具也认为异步复位比异步置位的优先级高,当verilog代码中把resetn放在前面时,~resetn和setn会被连接在CD和SDN上,而当代码中把setn放在前面时,综合后的电路会多出来一些cell,用于判断setn优先级高于resetn,如上述图中所示。

还要说明的一点是,always语句的敏感列表中的信号数不局限于2个或者3个,而是可以有更多,只要他们全都是edge trigger即可,那么假如在RTL时,我设置两个异步复位信号,综合以后的电路会是什么样子?

下面就举个例子简单的说明一下:

always @ ( posedge clk or negedge resetn or negedge setn or posedge resetp or posedge setp ) beginif ( ~resetn )      q <= 1'b0;else if ( resetp )  q <= 1'b0;else if ( ~setn )   q <= 1'b1;else if ( setp )    q <= 1'b1;else                q <= d;
end

调整4个signal的先后顺序,他们的优先级也随之改变,也会产生不同的电路结构,就不细说了。

接下来我要说的是,如何在sdc中对异步复位寄存器的复位端口和置位端口进行约束。

在说这个约束之前我们首先要了解一个概念,那就是时序弧(timing arc)什么是时序弧?

关于时序弧的理解:

(8条消息) 时序弧timing arc_动次打次小飞龙的博客-CSDN博客_时序弧和时序路径

总结来说即timing path上描述两个节点延时信息的数据,STA是基于timing arc数据的时序分析

以上述异步复位寄存器来说,我们要得到异步复位寄存器的SDN端到CD端的timing arc。

get_timing_arc -from cell/SDN  -to cell/CD
get_timing_arc -from cell/CD   -to cell/SDN

这样就get到了cell 复位和置位的时序弧。

然后我们再来了解一下set_false_path和set_disable_timing的区别:

(这些约束语句都是我们平时最常见的一些语句,但是我们往往忽略他们之间细微的差别)

set_palse_path:是用来设置timing_path,表示不用check这些path的timing,但是依旧会去计算这些path上的delay;

set_disable_timing:是用来设置timing arc,表示打断这条时序弧,不去计算这段时序弧的delay,并且所有经过这段时序弧的path都会被打断。

举个例子,假设我们要打断上述异步复位置位寄存器之间的timing arc,那么在sdc中我们应该如何去约束呢?

set_disable_timing [get_timing_arc -from cell/SDN  -to cell/CD]
set_disable_timing [get_timing_arc -from cell/CD   -to cell/SDN]

这个理解起来很直接,先get到这个时序弧,然后再disable掉。

 

//--------------------------------------------------------分割线--------------------------------------------------------//

//--------------------------------------------------------分割线--------------------------------------------------------//

在这里顺表整理一下sdc约束中碰到的一些语法:

append_to_collection  xxx_reg_lst  [get_cells u_xxx/u_yyy/u_aaa/u_bbb/abc_reg_*]

append_to_collection  xxx_reg_lst  [get_cells u_zzz/u_ddd/u_ccc/u_eee/lmn_reg_*]

,,,,,,

append_to_collection(译:附加到集合)它的作用和add_to_collection类似,可以创建一个新的集合,把第二个集合放在第一个集合的尾部,但是它会改变第一个集合本身。

get_cells,get_pins 等get_*命令返回的是一个集合,我们把它称之为collection。

foreach_in_collection

var_name :指定变量的名字

$collection:指定集合的名字

{ body }:指定要执行的语句

这个命令就和普通tcl语法中的foreach一样,可以遍历集合中的每个单元。

foreach_in_collection r_cd_sdn $xxx_reg_lst {

       set reg_cdn_sdn [get_object_name $r_cd_sdn]

           set_disable_timing [get_timing_arc -from $reg_cdn_sdn/CD  -to $reg_cdn_sdn/SDN]

get_object_name :

collection

这个命令可以返回指定集合中的object名字,比如上面我们提到的get_cells,get_pins等get_*命令都是返回一个集合,我们称之为collection。

collection是无法返回具体的名称的,如果你要抓取具体的名称,可以通过该命令将collection转化为名称。

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...