set\_data\_check 是个啥

应@Fly 天 同学的要求,码一遍set_data_check, 关于SDC 有好几个兄弟号都写了很多,可以到『IC 技术圈』中找对应文章去看。

set_data_check 是个啥?

set_data_check 是一条SDC 的命令,用于约束『数据-对-数据』的『建立保持』时间检查,通常被称为非时序约束 ( non-sequential constraints ), 理论上set_data_check 可以设在任意的两个data pin 上,其中一个pin 称为 constrained pin 类似于寄存器的data pin, 另一个pin 称为related pin 类似于寄存器的clock pin. 

用set_data_check 约束时,-from 指定的pin 为related pin, -to 指定的pin 为constrained pin.

用set_data_check 约束的『建立保持』时间检查跟普通寄存器的『建立保持』时间检查最大的区别是:set_data_check 约束的『建立保持』时间是zero-cycle check, 即constrained signal 跟related signal 两个数据信号在同一个时钟沿被采样释放,如下图右侧所示;而传统的DFF setup check 默认是跨一个时钟周期的。

set_data_check 也分setup 跟hold:

  • set_data_check setup: 类似于寄存器的setup, 即related signal 翻转前,constrained signal 必须保持稳定的时间。

  • set_data_check hold: 类似于寄存器的hold, 即related signal 翻转后,constrained signal 必须保持稳定的时间。

set_data_check hold check 时,capture clock 同样会往前推一个cycle, 所以如果设了hold data check通常需要设一个multi_cycle 将其拉回来。

除了用set_data_check 约束『数据-对-数据』的检查之外,有的lib 里也会定义『数据-对-数据』的检查,lib 中的关键词是:

  • non_seq_setup_rising

  • non_seq_setup_falling

  • non_seq_hold_rising

  • non_seq_hold_falling

用set_data_check 约束的『数据-对-数据』检查跟lib 里定义的『数据-对-数据』有以下区别:

  • set_data_check 只能指定一个值,而 lib 里定义的non_seq timing check 则是一张index 为input transition 跟output load 的表格,所以更精确。

  • 但是lib 里定义的non_seq timing check 只能在该lib cell 的leaf pin 上,而set_data_check 可以对design 中任意两个pin 进行约束。

  • 对于C 家工具,如果既读了定义有non_seq timing check 的lib, 也设了set_data_check, 则set_data_check 优先级更高。

set_data_check 用在哪?


set_data_check 通常用于信号间的skew 约束,比如一些高速接口相关信号间的约束。摘一段:

Data checks are normally applied where there is a specific requirement of skew (either minimum of maximum) or race condition (where the order of arrival of two signals can affect output and the intention is to get one of the probable outputs by constraining one signal to come before the other) between two or more signals. These may be required where:

  • At the digital-analog interface within a chip where analog signals at the analog block boundary are required in a specific order.

  • At the chip boundary, some asynchronous interface signals may have skew requirements.

set_data_check 在EDA 中的使用


在Innovus 或Tempus 中『数据-对-数据』检查默认是开启的,可以用如下变量控制。

 

  • 对于用命令set_data_check 设置的约束,可以通过如下变量控制:

  •  对于lib 里定义的non_seq timing check, 可以通过如下变量控制:

如果在Innovus 或Tempus 中设了如下约束,在report_timing 的时候需要加-check_type data_setup/ data_hold 来report 相应的data check:

set_data_check -from u0/D1 -to u0/D2 0.5

不像set_max_delay 会将原始的timing path 打断,set_data_check 是不会将原始timing path 打断的。

如上示例,即使在pin u0/D1 到u0/D2 上设了set_data_check 的约束,但是在timing 分析时u0/D1 不会被当做一个endpoint, 对于如上的path, timing 分析会同时做:

  • u0/D2 相对于 u0/D1 的data check.

  • 到寄存器u1 的setup/hold check.

在Innovus 或Tempus 中默认其他的false path 之类的timing exception 不影响data check, 可以用如下变量控制:

timing_apply_exceptions_to_data_check_related_pin

report_analysis_coverage 会将data-to-data check 归类于:DataCheckSetup 和DataCheckHold. 

作者:陌上风骑驴
来源:https://mp.weixin.qq.com/s/arB6LfCMalAYw8EtRzK2gA
作者微信公众号
 

<think>嗯,用户的问题是关于如何在SPI通信中设置数据校验。首先,我需要回忆一下SPI的基本知识。SPI通常使用主从架构,依靠四根线进行通信:SCK、MOSI、MISO和SS。用户提到的数据校验,可能涉及到CRC校验或者其他校验方式。 根据用户提供的引用[1]和[2],STM32的SPI控制器确实支持硬件CRC校验,但外设比如nRF24L01可能不支持。这时候如果启用STM32的CRC,而外设没有相应的处理,就会导致通信失败。所以,设置CRC校验需要考虑主从设备是否都支持。 接下来,用户需要知道如何在代码中配置SPI的CRC校验。引用[4]提到了TXE标志,这可能与数据发送状态有关,但具体到CRC设置,可能需要查看STM32的库函数或寄存器配置。通常,STM32的HAL库或者LL库会有相关的函数来启用CRC,比如HAL_SPI_EnableCRC()。 另外,引用[3]中的SPI模式也需要考虑,不同的模式(如CPOL和CPHA)会影响数据传输的时序,但和CRC校验没有直接关系。不过,配置SPI时必须确保主从设备的模式一致,否则数据传输会出错。 用户可能还想了解除了硬件CRC之外的其他校验方法,比如软件实现的校验,例如异或校验或者和校验。这些方法需要在发送和接收数据后,手动计算校验值并进行比较。虽然会增加一些代码量,但在外设不支持硬件CRC的情况下是必要的。 总结一下,回答需要分步骤说明硬件CRC的设置方法,并提醒兼容性问题,同时给出软件校验的实现方式。还要强调主从设备配置的一致性,包括SPI模式、时钟频率等。最后,可能需要建议用户根据具体外设的数据手册来确定支持的校验方式,避免配置错误导致通信失败。</think>在SPI通信中设置数据校验需根据主从设备支持的功能选择方案,以下是具体实现方法: ### 一、硬件CRC校验(需主从设备均支持) 1. **STM32配置步骤**: - 使用HAL库时调用`HAL_SPI_EnableCRC()`函数 - 设置CRC多项式寄存器`SPI_CRCPR`,默认采用$x^8 + x^2 + x + 1$ - 通过`SPI_CR1`寄存器设置CRC长度(8/16位) ```c // STM32示例代码 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_ENABLE; hspi1.Init.CRCPolynomial = 7; // 对应多项式系数 HAL_SPI_Init(&hspi1); ``` 注意:从设备需同步启用CRC校验功能才能正常工作[^2][^4] 2. **通信流程变化**: - 每个数据帧末尾自动附加CRC校验码 - 接收端会校验CRC值,错误时置位SPI_SR_CRCERR标志 ### 二、软件校验方案(通用方法) 1. **校验和实现**: ```c uint8_t CalculateChecksum(uint8_t *data, uint8_t len) { uint8_t sum = 0; for(int i=0; i<len; i++) sum += data[i]; return sum; } ``` 2. **异或校验实现**: ```c uint8_t CalculateXOR(uint8_t *data, uint8_t len) { uint8_t xor = 0; for(int i=0; i<len; i++) xor ^= data[i]; return xor; } ``` 3. **通信协议设计**: - 发送端:数据包=帧头+数据+校验码 - 接收端:重新计算校验码并比对 ### 三、关键注意事项 1. 时钟相位配置必须一致,如CPOL=1/CPHA=1对应Mode3时序[^3] 2. 校验数据长度需包含在SPI数据帧设置中 3. 使用DMA传输时需注意CRC计算位置 4. 错误处理建议: - 检查SPI_SR寄存器状态位 - 实现超时重传机制 - 配置错误中断回调函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值