时序约束--多时钟

文章讨论了在数字设计中如何处理同步和异步时钟的约束。同步时钟如分频器产生的时钟,通过设置输入和输出延迟确保正确工作。异步时钟则需要避免跨时钟域路径的时序检查,以减少亚稳态。设计者需明确指定哪些路径不应被工具分析。

当设计存在多个时钟时,根据时钟的相位和频率关系,分为同步时钟和异步时钟,这两类要分别讨论其约束

1、同步时钟

考虑分频器产生的各个时钟,它们来源于同一个晶振,受主时钟调配。如下图所示,由3GHz的时钟进行9、6、4、3分频产生clka,clkc,clkd,clke。

为了约束我们设计的逻辑N,X和S,需要给出clkc的周期、逻辑N的外部延时,逻辑S的外部延时。

b178fcfe08b64f4a2a05b9814cc93a0a.png

对于逻辑N而言,由clka产生数据,clkc采样数据,在它们周期的最小公倍数内,最严格的时序是3ns产生数据,在4ns采样。只要保证最严格的情形下,电路正常工作,其他时候都没问题

4edcd1afca79485d61c7f672876c6800.png

当我们写时序约束时,只需要创建时钟,其中clka为虚拟时钟,然后set_input_delay通过-clock指定产生数据的时钟,给出clka产生的数据延时(触发器+组合逻辑)

e4dda0bb175842c8010c9a81d2376f9f.png

可见,写约束还是更简单,计算由时序分析工具处理。我们要提供产生数据的时钟和数据延时即可

对于输出数据,可以驱动多个单元。如下图所示,clkc的输出OUT1会经过组合逻辑被clkd和clke采样。设置约束,同样创建外部的虚拟时钟,然后set_output_delay,指定采样时钟和外部延时。另外,增加-add_delay选项避免被覆盖,表示让时序工具计算两条约束,选择更严格的进行分析

f2fd0ad3589565eb4b5d672af55e224c.png

在DC中,所有时钟都是同步的,即create_clock并不能创建异步时钟,异步电路静态时序分析不适合。

db18236446935cb83923d499a1fc7057.png

2、异步时钟

考虑不同时钟源的电路,由于每个时钟源独立工作,它们诸如延迟、转换时间等不一定一致,时钟之间的相位不固定,表现出异步电路。

aa5972d71c5f8faf7637961d35ce271a.png

异步电路要减少亚稳态产生,是设计者负责亚稳态处理,别指望工具帮助处理。我们需要在每个时钟域内约束路径,然后告诉工具不要检查跨时钟域路径。(否则工具会努力让该路径满足要求,导致浪费时间)

下图中,clka驱动的数据被clkb采样。很显然,两个不同时钟的触发器之间的路径都要告诉工具不要检查。

653a48596bba83621e5423fc2c7c6756.png

DC中,使用set_false_path告诉工具不要在指定的路径分析

d1529f47885a43a2a5296e4fea08e1e6.png

通过-from指定路径起点,可以是clock、port、pin和cell,clock作为起点,所有和该clock有关的路径都会被影响。通过-to指定路径终点,类似于from。

约束如下,使用-from clock能够简化,不用将路径一一列举。

763507a060334c9c43d0a748d431c195.png

<think> 首先,用户的问题是关于“CDC时钟约束-period-edge 的相关内容”。CDC指的是时钟域交叉(Clock Domain Crossing),这在数字电路设计中处理不同时钟域之间的信号交互时非常重要。 用户引用了几个站内引用,我需要参考它们: - 引用[1]、[2]、[3]讨论的是使用`-edges`选项在`create_generated_clock`约束中,用于定义生成时钟的边沿对应于主时钟的边沿位置。 - 引用[4]列出了时钟约束的类型,包括主时钟、衍生时钟等,但没有直接提到`-period-edge`。 用户的问题具体是询问`-period-edge`的含义、作用及使用方法。但在我熟悉的知识库中,标准的SDC(Synopsys Design Constraints)约束中,`create_clock`命令并没有`-period-edge`选项。常见的选项包括`-period`, `-waveform`, `-name`, `-add`等。 回顾用户的引用: - 引用[1]提到`-eedges {1 3 5}`,这里可能是`-edges`的误写,因为标准中是`-edges`。 - 引用[2]和[3]也提到了`-edges`选项用于`create_generated_clock`。 用户的问题中是`-period-edge`,这可能是一个错误或误解。在引用[1]中,有`-eedges`,这可能是`-edges`的拼写错误。在引用[3]中,写成了`-eedges`,但应该是`-edges`。标准SDC语法中,是`-edges`。 所以,用户可能指的是`-edges`选项,而不是`-period-edge`。`-period`和`-edge`可能是分开的概念。`-period`用于指定时钟周期,`-edge`用于指定边沿位置。 在CDC约束中,时钟约束是关键部分,尤其是当处理跨时钟域时,需要正确定义各个时钟的属性。 分解用户的问题: - **含义**:解释`-period-edge`是什么(但可能是指`-edges`)。 - **作用**:它在CDC中的作用。 - **使用方法**:如何在实际约束中使用。 由于引用中提到了`-edges`在`create_generated_clock`中的使用,我应该基于那个来解释。 标准SDC命令: - `create_clock`用于创建主时钟- `create_generated_clock`用于创建衍生时钟。 在`create_generated_clock`中,可以使用`-edges`选项来指定衍生时钟的边沿对应于主时钟的边沿索引。 例如: - `-edges {1 3 5}`表示衍生时钟的第一个上升沿对应主时钟的第一个边沿,下降沿对应第二个(如果有),但`{1 3 5}`通常用于三相时钟或分频。 在引用[1]中:`-edges {1 3 5}`用于一个分频时钟,其中1,3,5对应主时钟的边沿位置。 在CDC上下文中,时钟约束必须精确,以确保时序分析器能正确处理跨时钟域的路径。 现在,用户的问题中写的是`-period-edge`,这可能是个打字错误。我应该假设是`-edges`选项。 为了回答: - 含义:`-edges`选项在`create_generated_clock`中用于指定衍生时钟的边沿位置基于主时钟的边沿索引。 - 作用:在CDC中,正确指定时钟边沿有助于准确建模时钟频率和相位关系,这对于分析跨时钟域路径的时序至关重要。 - 使用方法:如引用所示,语法是`-edges {list_of_edges}`,其中列表指定了衍生时钟的上升沿和下降沿对应的主时钟边沿索引。 在用户提供的引用中,没有直接提到`-period-edge`,所以我应该校正并回答基于`-edges`。 此外,系统指令要求: - 所有行内数学表达式使用`$...$`。 - 独立公式用`$$...$$`。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如`[^1]`。 在回答中,我需要在引用内容后添加标识,但由于用户提供了引用,我应该引用它们。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能的参考用户上一次的问题和你的回答。” 但在这个对话中,这是第一个用户消息,所以没有上一次问题和回答。之前的系统级指令是初始设置。 我的回答结构: 1. **澄清问题**:解释`-period-edge`可能是个误解,并指向`-edges`选项。 2. **含义**:定义`-edges`的含义。 3. **作用**:在CDC上下文中的作用。 4. **使用方法**:给出示例语法。 5. **相关问题**:生成相关问题。 使用中文回答。 生成相关问题: - 例如:如何优化CDC约束?`-edges`选项的其他应用?CDC时序分析的基本原理? 添加引用:由于用户提供了引用,我需要在回答中引用它们。例如,提到`-edges`时引用[1],[2],[3]。 最终回答结构: - 解释和校正。 - 详细回答含义、作用、使用方法。 - 相关问题。 </think> ### CDC时钟约束中 `-edges` 选项的含义、作用及使用方法 用户询问的是“CDC时钟约束中 `-period-edge` 的相关内容”,但从您提供的引用(尤其是引用[1]、[2]、[3])来看,`-period-edge` 可能是一个误解或打字错误。标准 SDC(Synopsys Design Constraints)语法中,时钟约束命令(如 `create_generated_clock`)常用选项是 `-period`(指定时钟周期)和 `-edges`(指定边沿位置),但没有 `-period-edge` 这个选项。引用中提到的 `-eedges` 或 `-edges` 对应标准的 `-edges` 选项,它在时钟域交叉(CDC)约束中用于精确定义衍生时钟的边沿时序关系[^1][^2][^3]。下面我将基于引用内容,详细解释 `-edges` 选项(作为 `-period-edge` 的可能校正),覆盖其含义、作用及使用方法。CDC 约束的核心是确保不同时钟域的信号交互得到正确处理,以避免亚稳态和时序违规[^4]。 #### 1. **`-edges` 选项的含义** 在 SDC 约束中,`-edges` 是 `create_generated_clock` 命令的一个选项,用于定义衍生时钟(generated clock)的边沿位置如何映射到主时钟(master clock)的边沿索引。衍生时钟通常由主时钟通过分频、倍频或逻辑操作生成。`-edges` 选项通过指定一个列表(如 `{1 3 5}`),明确衍生时钟的每个边沿(上升沿、下降沿或下一个周期的上升沿)在主时钟周期中的具体位置: - **边沿索引**:主时钟的边沿从 1 开始编号,每个数字代表一个边沿事件(例如,1 表示主时钟的第一个上升沿,2 表示下降沿,3 表示下一个上升沿)。 - **映射关系**:列表中元素的数量定义了衍生时钟一个完整周期内的边沿数量。例如,`-edges {1 3 5}` 表示: - 衍生时钟的第一个上升沿对应主时钟的第 1 个边沿(通常是上升沿)。 - 衍生时钟的下降沿对应主时钟的第 3 个边沿(如果有下降沿建模)。 - 衍生时钟的下一个上升沿(即第二个周期的上升沿)对应主时钟的第 5 个边沿。 这等效于一个分频时钟(如除以 2),其中衍生时钟的周期基于主时钟边沿的间隔计算[^1][^2][^3]。 在 CDC 上下文中,`-edges` 的关键含义是精确建模时钟相位和频率关系。例如,当信号跨时钟域传递时,准确指定衍生时钟的边沿位置(如 `-edges {1 3 5}`)能帮助时序分析器(如 PrimeTime)计算路径延迟和建立/保持时间,避免因时钟不确定性导致 CDC 错误[^4]。 #### 2. **`-edges` 选项的作用** 在 CDC 约束中,`-edges` 选项的主要作用是确保衍生时钟时序行为能被正确推断和分析,从而优化跨时钟域路径的时序验证。具体作用包括: - **精确定义时钟关系**:相较于 `-divide_by`(仅指定分频系数),`-edges` 直接定义边沿映射,更灵活地处理非对称波形或复杂分频(如奇数分频),这在 CDC 中尤为重要,因为不同时钟域的相位差可能导致亚稳态风险[^1][^3]。 - **支持时序分析**:在 CDC 路径分析中,工具需要知道衍生时钟的精确边沿位置来计算: - **建立时间(Setup Time)**:信号在接收时钟域上升沿前必须稳定的时间。 - **保持时间(Hold Time)**:信号在接收时钟域上升沿后必须保持稳定的时间。 使用 `-edges` 能减少时钟建模误差,提高 CDC 检查的可靠性,防止虚假路径或时序违规[^4]。 - **等效替代其他选项**:如引用[2]所示,`-edges` 可以替代 `-divide_by` 实现相同的约束效果(例如,除以 2 的分频时钟),但提供更细粒度的控制,适用于高频或低抖动设计[^2]。 在 CDC 中,`-edges` 的作用可总结为:通过精确边沿映射,减少时钟不确定性,增强跨时钟域同步机制(如 FIFO 或双触发器)的鲁棒性。 #### 3. **`-edges` 选项的使用方法** `-edges` 选项在 `create_generated_clock` 命令中使用,语法基于标准 SDC 格式。以下是详细的使用步骤和示例,参考您提供的引用: ##### 基本语法 ```tcl create_generated_clock -name <clock_name> -source <source_pin> -edges {edge_list} <target_pin> ``` - **`-name`**:指定衍生时钟的名称。 - **`-source`**:指定主时钟的源引脚(必须是端口或管脚类型,不能直接是时钟对象),如引用[3]强调 `-source` 只能设置为网表对象(例如 `[get_pins REGA/C]`)。 - **`-edges {edge_list}`**`: 定义边沿列表,其中每个整数对应主时钟的边沿索引。列表通常有三个元素,表示衍生时钟一个周期内的三个关键边沿(上升沿、下降沿、下一个上升沿)。 - **`<target_pin>`**:衍生时钟生成的管脚位置。 ##### 示例说明 1. **简单分频时钟(等效除以 2)**: 如引用[1]和[2]所示,以下约束定义一个名为 `clkdiv2` 的衍生时钟,源自主时钟引脚 `REGA/C`,目标管脚为 `REGA/Q`。边沿列表 `{1 3 5}` 表示: - 衍生时钟的第一个上升沿对应主时钟第 1 个边沿。 - 衍生时钟的下降沿对应主时钟第 3 个边沿。 - 衍生时钟的下一个上升沿对应主时钟第 5 个边沿(等效于周期为 2 倍主时钟)。 ```tcl create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5} [get_pins REGA/Q] ``` 这等效于使用 `-divide_by 2`,但提供更直接的边沿控制[^1][^2]。 2. **处理非 50% 占空比时钟**: 在 CDC 中,衍生时钟可能不是对称波形(例如,占空比非 50%)。`-edges` 可以灵活定义: ```tcl create_generated_clock -name clk_odd -source [get_pins CLK_GEN/OUT] -edges {1 2 4} [get_pins DIV/Q] ``` 这里: -时钟边沿 1:衍生时钟上升沿。 -时钟边沿 2:衍生时钟下降沿(提前发生,表示短脉冲)。 -时钟边沿 4:下一个上升沿(周期为非整数倍)。 这对于建模异步 CDC 路径尤其有用,能准确捕获时序窗口[^3]。 ##### 使用注意事项 - **边沿索引规则**:主时钟边沿从 1 开始计数(上升沿),后续偶数为下降沿(如果存在)。列表中元素数量必须为奇数(通常为 3),以覆盖一个完整周期。 - **与 `-period` 结合**:`-edges` 隐式定义周期,不需额外 `-period`。但若需要显式指定周期,可使用 `-period` 单独约束时钟- **CDC 专用约束**:在 CDC 中,通常结合 `set_clock_groups` 或 `set_false_path` 处理异步时钟组: ```tcl # 定义主时钟 create_clock -name master_clk -period 10 [get_ports CLK] # 定义衍生时钟 create_generated_clock -name gen_clk -source [get_pins FF/C] -edges {1 3 5} [get_pins FF/Q] # 标记异步时钟组 set_clock_groups -asynchronous -group {master_clk} -group {gen_clk} ``` 这确保工具忽略两个时钟域间的时序路径[^4]。 - **常见错误**:避免 `-source` 指向时钟对象(而非管脚),否则会报错;确保边沿列表一致,否则可能引入时序冲突。 在您的场景中,CDC 约束优先使用 `-edges` 而非 `-divide_by`,因为它提供更高的精度,尤其适用于高频设计或严格时序要求。 #### 总结 - **含义**:`-edges` 选项在 `create_generated_clock` 中用于映射衍生时钟边沿到主时钟边沿索引,提供精确时序建模。 - **作用**:在 CDC 中减少时钟不确定性,确保跨时钟域路径的可靠时序分析。 - **使用方法**:通过 Tcl 命令指定边沿列表(如 `-edges {1 3 5}`),结合 `-source` 和 `-name` 定义衍生时钟。 如果您有具体设计案例或更细节(如主时钟频率),我可以提供更针对性的约束示例。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值