EEPROM存储芯片的数据读写由IIC总线控制,而IIC总线只有一条SDA数据线,其数据的传输是双向的。在时序约束时,要同时对SDA引脚做输入延时约束和输出延时约束。
以M24C02芯片为例,其时序规范如下图所示。
首先约束SCL时钟,该时钟为100KHz,由系统时钟通过内部逻辑1000分频产生内部时钟scl_clk,再由scl_clk相移135°得到,约束如下:
create_clock -period 10.000 -name sysclk [get_ports I_sysclk]
create_generated_clock -name scl_clk -source [get_ports I_sysclk] -divide_by 1000 -add -master_clock sysclk [get_pins uii2c_inst/scl_clk_reg/Q]
create_generated_clock -name o_scl -source [get_pins uii2c_inst/scl_clk_reg/Q] -edges {1 2 3} -edge_shift {3750.000 3750.000 3750.000} -add -master_clock [get_clocks scl_clk] [get_ports O_iic_scl] | 然后先约束输入延时,由芯片时序规范可知,其最大输入延时为3450ns,最小输入延时为200ns,数据是在o_scl的下降沿发送,约束如下:
set_input_delay -clock [get_clocks o_scl] -clock_fall -min 200.000 [get_ports IO_iic_sda]
set_input_delay -clock [get_clocks o_scl] -clock_fall -max 3450.000 [get_ports IO_iic_sda] | 时序报告如下:
在sysclk时钟域采集数据的路径下出现了时序违例,我们先分析该路径。
从报告中可以看出出现违例的原因是建立时间约束得过紧了,需要通过多周期约束来放宽条件。使用的模型为慢时钟域到快时钟域。
约束如下:
set_multicycle_path -setup -end -from [get_clocks o_scl] -to [get_clocks sysclk] 1000
set_multicycle_path -hold -end -from [get_clocks o_scl] -to [get_clocks sysclk] 999 | 时序报告如下,sysclk时钟域下的时序违例被消除。
输入延迟约束正确之后,接着约束输出延迟约束,由芯片手册中的时序规范,找到tCLDX为0ns,tDXCH为250ns,故最大输出延时为250ns,最小输出延时为0ns。约束如下:
set_output_delay -clock [get_clocks o_scl] -min 0.000 [get_ports IO_iic_sda]
set_output_delay -clock [get_clocks o_scl] -max 250.000 [get_ports IO_iic_sda] | 时序报告如下图所示。
出现违例的原因是建立时间约束得过紧了,需要通过多周期约束来放宽条件,使用的模型为快时钟域到慢时钟域。
约束如下:
set_multicycle_path -setup -start -from [get_clocks sysclk] -to [get_clocks o_scl] 1000
set_multicycle_path -hold -start -from [get_clocks sysclk] -to [get_clocks o_scl] 999 | 约束后时序违例被消除。
|