最近,我做了一些 RTL 练习,例如除法器和序列检测器。我使用相同的sdc文件来合成,它来自一个开源项目。(项目链接)以下代码来自开源项目中使用的sdc文件,也在我的实践中使用。
# operating conditions and boundary conditions #
create_clock -name clk -period 30.0 [get_ports clk]
set_dont_touch_network [all_clocks]
set_fix_hold [all_clocks]
set_clock_uncertainty 0.1 [all_clocks]
set_clock_latency 0.5 [all_clocks]
set_ideal_network [get_ports clk]
#Don't touch the basic env setting as below
set_input_delay 5.0 -clock clk [remove_from_collection [all_inputs] [get_ports clk]]
set_output_delay 0.5 -clock clk [all_outputs]
set_load 1 [all_outputs]
set_drive 1 [all_inputs]
set_operating_conditions -max_library slow -max slow
set_wire_load_model -name tsmc13_wl10 -library slow
set_max_fanout 20 [all_inputs]
由于我从未参与过完整的IC设计或ASIC设计,所以我真的不知道这些约束值从何而来。 具体来说,时钟的不确定性和延迟性等属性,如何决定它的值?是否有人告诉您它的价值,或者您应该自己努力获得价值?关于负载、驱动器和扇出的同样问题。
其中一些参数取决于承载物理可编程逻辑(ASIC、FPGA 等)设备的硬件(电路板及其组件)。您需要与更熟悉这些性质的硬件工程师或其他工程人员合作,以确定正确的值。
set_clock_uncertainty 取决于与创建时钟的振荡器(电路板组件)相关的抖动。
set_clock_latency 取决于电路板本身以及振荡器输出引脚和可编程逻辑输入引脚之间的延迟。
set_load 和 set_drive 定义可编程逻辑输出引脚特性。这些将基于连接到输出引脚的内容。例如,与另一个集成电路芯片的单个引脚(例如连接的 DRAM 芯片引脚)相比,LED 需要更强的驱动强度(电流),并且具有更大的负载(电容)。
set_max_fanout 这取决于设备本身,并且对于特定的可编程逻辑技术会有默认值。请查阅设备文档以确定其值。增加或减少该值将导致可编程逻辑器件的性能和面积之间的权衡。看起来这也可以应用于输出引脚扇出(为什么不呢;也许其他约束涵盖了输出引脚?),我只看到在可编程逻辑器件内部使用。