PT的一些setting

PT Setting

在做项目时,遇到了一些常用的setting,这些setting都比较重要,因此记录在这;

CRPR的计算方法

首先我们需要设置下面的变量:
set_app_var timing_remove_clock_reconvergence_pessimism true
这样工具会激活CRPR;

PT在计算CRPR时,基本过程如下
1、比较launch和capture clock path;
2、选择launch和capture clock path的common point;
3、将common point的 minimum/maximum arrival time的差值补偿到path slack中;
以下面的timing report为例:
在这里插入图片描述
工具设置为common point为Umux/Z pin,其max arrival time为:314ps, min arrival time为:122ps,两者的差值为192ps,而timing report中的CRPR值也是193(可能是小数点的原因);

造成minimum/maximum arrival difference的原因在于:
1、Minimum/maximum delay differences in the timing behavior of logic gates;
2、Minimum/maximum arrival differences caused by logic reconvergence

timing_clock_reconvergence_pessimism

首先我们看下图
在这里插入图片描述
在激活CRPR后,由于U1和U2是common部分,max为2.2ns,min为1.8ns,而在实际情况下不能同时取fast和slow两种delay,因此工具在report timing时,会在slack中补偿0.4ns;
但是我们需要注意的是,上面的情况针对的是cell rise的情况,那么如果cell fall delay和cell rise delay不一样呢?看下图
在这里插入图片描述
可以发现,cell fall delay相比于cell rise delay更小,由于这两者之间存在区别,工具在实际计算CRPR时是分两种情况的,由变量timing_clock_reconvergence_pessimism决定:
1、normal,这种情况下,工具会分别计算rise crp和fall crp,并取这两者中的最小值;
rise_CRP = (late_rise_arrival - early_rise_arrival)
fall_CRP = (late_fall_arrival - early_fall_arrival)
而CRP = MIN(rise_CRP, fall_CRP)
2、same_transition,这种情况下,工具只会将相同transition的CRPR值;

CRPR & Min_pulse_width

CRPR对min pulse width也有影响,首先我们设置下面的constraints
create_clock -period 4 [get_ports CLK]
set_min_pulse_width -high 1.0 [get_clocks CLK]
set_min_pulse_width -low 1.0 [get_clocks CLK]
在看下图,是一个flop的clock tree,如下图所示

在这里插入图片描述
同时,考虑到cell的rise delay和fall delay不同,分别如下
在这里插入图片描述
为了保证flop的CP pin的pulse满足其要求,我们需要计算实际到达flop CP pin的pulse宽度;实际到达flop的CP pin的波形如下图所示
在这里插入图片描述
可以发现,对于rise edge来说,其max delay为3.3ns,min delay为2.7ns;对于fall edge,其max delay为3.6ns,min delay为2.4ns;
根据上面的波形,可以算出,高电平的最小宽度为:
(min fall edge+2)- (max rise edge)= 1.1ns
而低电平为最小宽度则为:1.1ns;

那么在计算min pulse width时,CRPR的影响是啥呢?
首先看下图
在这里插入图片描述
对于min pulse来说,分两种情况,分别是:
1、min pulse high width
2、min pulse low width
计算min pulse high width的方法为:
1、open edge clock latency = (max_rise clock arrival)
2、close edge clock latency = (min_fall clock arrival )
3、actual pulse width (high) = open edge latency – close edge latency + conservative static CRP – clock uncertainty
4、Slack = actual pulse width – required pulse width
这里需要注意的是,对于min pulse high width,其open edge为rise edge,close edge则为fall edge;

计算min pulse low width的方法为:
1、open edge clock latency = (max_fall clock arrival)
2、close edge clock latency = (min_rise clock arrival )
3、actual pulse width (low) = open edge latency – close edge latency + conservative static CRP – clock uncertainty
4、Slack = actual pulse width – required pulse width
这里需要注意的是,对于min pulse low width,open edge指的是fall edge,close edge指的是rise edge;
对于上面的design,设置下面的constraints:
create_clock [get_ports clk] -n clk -period 0.2
set_clock_latency -source -dynamic 0.0003 -late 0.003 clk
set_clock_latency -source -dynamic 0.0002 -early 0.002 clk
使用下面的命令可以查看min pulse width report:
report_min_pulse_width -path_type full_clock_expanded [get_pin ff2/CP]
产生的report如下
1、min pulse low width
在这里插入图片描述
2、min pulse high width
在这里插入图片描述
这里需要关注具体要看CRPR是怎么计算出来的,可以使用命令:
report_crpr -from ff2/CP -to ff2/CP -significant_digits 6
产生的report如下:
在这里插入图片描述
由于是min pulse check,也就是0 cycle check,所以工具省去了dynamic latency,分别计算:rise_crp和fall_crp;
rise_crp = late rise delay - early rise delay
fall_crp = late fall delay - early fall de

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面代码什么作用class MainWindow(QMainWindow, Ui_mainWindow): def init(self, parent=None): super(MainWindow, self).init(parent) self.setupUi(self) self.m_flag = False # style 1: window can be stretched # self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowStaysOnTopHint) # style 2: window can not be stretched self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint) # self.setWindowOpacity(0.85) # Transparency of window self.minButton.clicked.connect(self.showMinimized) self.maxButton.clicked.connect(self.max_or_restore) # show Maximized window # self.maxButton.animateClick(10) self.closeButton.clicked.connect(self.close) self.qtimer = QTimer(self) self.qtimer.setSingleShot(True) self.qtimer.timeout.connect(lambda: self.statistic_label.clear()) # search models automatically 自动搜索模型 self.comboBox.clear() self.pt_list = os.listdir('./pt') self.pt_list = [file for file in self.pt_list if file.endswith('.pt')] self.pt_list.sort(key=lambda x: os.path.getsize('./pt/'+x)) self.comboBox.clear() self.comboBox.addItems(self.pt_list) self.qtimer_search = QTimer(self) self.qtimer_search.timeout.connect(lambda: self.search_pt()) self.qtimer_search.start(2000) # yolov5 thread self.det_thread = DetThread() self.model_type = self.comboBox.currentText() self.det_thread.weights = "./pt/%s" % self.model_type self.det_thread.source = '0' self.det_thread.percent_length = self.progressBar.maximum() self.det_thread.send_raw.connect(lambda x: self.show_image(x, self.raw_video)) self.det_thread.send_img.connect(lambda x: self.show_image(x, self.out_video)) self.det_thread.send_statistic.connect(self.show_statistic) self.det_thread.send_msg.connect(lambda x: self.show_msg(x)) self.det_thread.send_percent.connect(lambda x: self.progressBar.setValue(x)) self.det_thread.send_fps.connect(lambda x: self.fps_label.setText(x)) self.fileButton.clicked.connect(self.open_file) self.cameraButton.clicked.connect(self.chose_cam) self.rtspButton.clicked.connect(self.chose_rtsp) self.runButton.clicked.connect(self.run_or_continue) self.stopButton.clicked.connect(self.stop) self.comboBox.currentTextChanged.connect(self.change_model) self.confSpinBox.valueChanged.connect(lambda x: self.change_val(x, 'confSpinBox')) self.confSlider.valueChanged.connect(lambda x: self.change_val(x, 'confSlider')) self.iouSpinBox.valueChanged.connect(lambda x: self.change_val(x, 'iouSpinBox')) self.iouSlider.valueChanged.connect(lambda x: self.change_val(x, 'iouSlider')) self.rateSpinBox.valueChanged.connect(lambda x: self.change_val(x, 'rateSpinBox')) self.rateSlider.valueChanged.connect(lambda x: self.change_val(x, 'rateSlider')) self.checkBox.clicked.connect(self.checkrate) self.saveCheckBox.clicked.connect(self.is_save) self.load_setting()
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值