区分set_sense和set_disable_timing

本文介绍如何使用set_sense和set_disable_timing优化时钟树平衡(CTS)及单元内部时序弧,确保分频时钟独立生长且不影响主时钟平衡,并通过屏蔽无效时序弧提高时序分析效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set_sense

使用set_sense可以人为的制造sink pinignore pin,set_sense两种常用开关: -stop_propagation(给指定clock设置endpoint)和**-clock_leaf**。
例1:set_sense -stop_propagation -type clock -clocks [get_clocks clk] [get_pins FF1/Q] (如果是一个output pin,那么input 端clk会被balance)
此时FF1/CK就会被当作sink pin,CTS阶段会balance,如果此时FF1后面有generate clock,那么generate clock仍然会长tree,只不过不会与clk其他的sink pin balance。
如果get_pins FF1/clk,那么clk会被作为ignore pin不会被balance,但是会给它前面插一个特殊的buffer,表示clk在这个buf之后的分支不长tree,ICC2中这个特殊的buf命名规则是btd, buf前使用clock tree约束修drc violation(max_tran/max_cap),buf后使用data path的约束修drc violation,同样的如果inst后面有generate clock,set_sense也会让它单独长tree,不跟clock clk其他sink pin banlance。
例2:set_sense -clock_leaf -clocks [get_clocks clk] [get_pins FF1/CK]
给clock clk设置leaf pin FF1/CK,FF1/CK是clock pin所以这里作为sink pin,设置在非clock pin上相当于ignore pin。此时CTS结果如图6,此时FF1在clock clk时钟树上需要balance,在FF1/Q之后的generate clock需要自己balance,效果和set_sense -stop_propagation -type clock -clocks [get_clocks clk] [get_pins FF1/Q]是一样的。

**应用方法:**分频时钟的寄存器不与主时钟或者主时钟下的分频时钟有timing check,则可以使用set_sense -stop_propagation 在分频器定义的寄存器的CK pin上,cts阶段分频时钟单独长tree不与主时钟sink balnace,cts之后可以用remove_sense移出set_sense后做时序分析。set_sense和remove_sense都不需要放到sdc里,在clock_opt前后使用即可。

set_disable_timing

​ 每个单元内部从输入端口到输出端口都定义有时序弧,默认情况下所有的时序弧都应该有效并用于时序分析。但是在设计中由于具体逻辑设计的原因,某些单元内部的时序弧由于没有对应功能逻辑的触发条件而应该是无效的,对于这样的特殊情况可以通过屏蔽时序弧的约束命令来实现,以指导时序分析工具进行正确的时序分析。
​比如,选择器单元存在选择输入端到输出端的时序弧,但是设计中不存在通过该单元选择端口到输出端口的时序路径,这样可以通过屏蔽该时序弧,指导时序分析跳过包含该
时序弧的时序分析。命令是set_disable_timing -from S -to Z [get_cells MUX]只适用移除单元内部时序弧,伪路径要用set_false_path注意区分
以下两个命令等效:
set_false_path -through [get_pins ADDER/CI]
set_disable__timing [get_pins ADDER/CI]
这样做的好处是可以减少静态时序分析工具的计算负载,对应的时序弧已经无效,所以不需要在计算该路径。

### 关于 `set_sense` 的技术文档常见问题解决方案 #### 定义与功能描述 `set_sense` 函数通常用于设置传感器或其他输入设备的工作模式或灵敏度参数。具体实现取决于所使用的硬件平台以及编程环境。对于嵌入式系统而言,该函数可能涉及配置寄存器来调整传感元件的行为特性[^1]。 #### 参数说明 一般情况下,此方法接受至少一个参数用来指定新的状态或者属性值。例如,在某些微控制器库中可能会这样定义: ```c++ void setSense(int pin, int mode); ``` 这里 `pin` 表示要操作的具体引脚编号;而 `mode` 则决定了该引脚作为传感器工作的方式——比如高电平触发还是低电平触发等不同选项[^2]。 #### 使用场景举例 当开发者希望改变某个特定GPIO端口上的外部中断源响应机制时就可以调用此类接口。假设有一个按钮连接到了Arduino板子上,并且想要让它既能检测按下事件也能识别释放动作,则可以通过如下方式完成初始化设置: ```cpp // 假设D2为按键接入点 const int buttonPin = 2; void setup() { pinMode(buttonPin, INPUT_PULLUP); // 设置内部上拉电阻 attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, CHANGE); } void loop(){} void handleButtonPress(){ static unsigned long lastDebounceTime = 0; const unsigned long debounceDelay = 50; unsigned long currentTime = millis(); if (currentTime - lastDebounceTime >= debounceDelay){ bool currentState = digitalRead(buttonPin); Serial.println(currentState ? "Released" : "Pressed"); lastDebounceTime = currentTime; } } ``` 上述代码片段展示了如何利用 Arduino IDE 中类似的 API 来处理物理开关的状态变化通知。值得注意的是实际应用中的 `set_sense` 方法签名会依据目标架构有所差异[^3]。 #### 故障排查指南 如果遇到无法正常工作的状况,可以按照下面几个方面来进行调试分析: - **确认接线无误**:确保所有连线牢固可靠,特别是电源供应部分; - **验证固件版本兼容性**:检查当前运行的操作系统/驱动程序是否支持最新发布的API变更; - **查阅官方手册获取更多信息**:制造商提供的资料往往包含了详细的命令语法解释及其应用场景实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值