同一条path,setup和hold打架处理方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同一条path,setup和hold打架处理方式相关的知识,希望对你有一定的参考价值。

参考技术A  有两种可能的情况:

1)时钟路径过长,ocv效应过大;

2)路径上的crosstalk过大,对setup和hold都有影响。

setup hold互卡现象还是后端很经常出现的,分享几个解决互卡的方法

1、先修clock上的SI,SI包括latency、skew、trans、uncertainty、clock level。首先应该先降clock latency,因为latency过大会使得受OCV和PVT影响更大。

2、clock的ndr设置好,clock net最好能2倍width 2倍spacing

3、把common path推长,ocv会减小

4、换setup/hold corner下skew更小的cell,如lvt,这样setup和hold互卡情况会缓解

######

分享一下我们家当时做出的不一样决定。在我们的案例中,有个800M的clock gate路径,同时出现了hold和setup的violation。如果保hold,setup势必要降频,而我们的降频无法做到从800M降频到750M,要降频就是直接降到了400M。而一旦降到400M,不要说性能了,功能都错了。因为对于送入芯片的数据根本处理不过来。这样一来,即使保住了hold,也是个废品。所以当时我们分析了整个产品,不单纯是我们自己设计的芯片,查看板上其他芯片的文档。发现有个芯片工作温度最低是0度,而不是我们的-40度,于是首先调整了我们自己分析hold的corner,换成0度的库分析,hold violation减少了一些,但还是violation。接着又从客户那边了解到,实际使用时,会给产品进行一段时间的预热,所以我们大胆的把分析hold的corner调整到了TT下,hold check是过去的。然后我们对工艺厂这些年生产我们芯片时的良率进行了分析,得出结论是,他家的Process大概率不在FF上,可以用TT分析。最后,我们保证了SS corner下的setup,用TT corner下的hold check代替了传统FF corner下的hold check。

java学习2打架代码编写

 

在同一个包中的Player类

 

package work;

public class Player {
private String name;
private int hp;
private int attack;
public Player(String name,int hp,int attack){//构造函数,初始化值
this.name=name;
this.hp=hp;
this.attack=attack;
}
public void setName(String name) {//获取值

this.name=name;
}
public String getName(){
return name;
}
public void setHp(int hp){
this.hp=hp;
}
public int getHp(){
return hp;
}
public void setAttack(int attack){
this.attack=attack;
}
public int getAttack(){
return attack;
}/**
*
*攻击行为、
*player 为攻击对象
***/
public void hit(Player player){
//被打的对象(血量=血量-本人攻击力)
player.hp=player.hp-this.attack;
if(player.hp<0){
player.hp=0;
System.out.println(this.name+"攻击了"+player.name+"打出了"+attack+"点伤害."+player.name+"还剩下多沙"+player.hp+"血量");
}
}
}

 

 

 

在同一个包中另一个Game类

package work;

import java.util.Scanner;
/**
* @author 游戏
*
*/
public class Game {
Scanner sc=new Scanner(System.in);

// 从控制台接受数据并且封装成一个玩家对象

public Player enter(String player) {//封装玩家信息
System.out.println("输入"+player+"姓名");
String name=sc.next();
System.out.println("输入"+player+"血量");
int hp=sc.nextInt();
System.out.println("输入"+player+"攻击力");
int attack=sc.nextInt();
Player backPlayer=new Player(name, hp,attack);
return backPlayer;
}
public void start() {
//从封装好的函数中输入玩家的信息
Player player1=this.enter("玩家一");
Player player2=this.enter("玩家二");
boolean go=true;
while(go){
//玩家一打了玩家二
player1.hit(player2);
if(player2.getHp()<0){

System.out.println(player1.getName()+"ko了"+player2.getName()+"游戏结束!fighting!!!!!!!!!!");
break;
}
//玩家二打了玩家一
player2.hit(player1);
if(player1.getHp()<0){

System.out.println(player2.getName()+"ko了"+player1.getName()+"游戏结束!fighting!!!!!!!!!!");
go=false;
}
}
}
public static void main(String[] args) {
Game game=new Game();
game.start();
}
}

 























































































以上是关于同一条path,setup和hold打架处理方式的主要内容,如果未能解决你的问题,请参考以下文章

后端进阶系列:Setup&Hold互卡问题和Useful Skew的影响

什么是setup time和hold time

setup/hold 分析

分析setup/hold电气特性从D触发器内部结构角度

多周期路径检查时为啥hold的设置比setup要

set_multicycle_path的原因