<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>起点博客 &#187; FPGA</title>
	<atom:link href="http://xinzero.com/tag/fpga/feed" rel="self" type="application/rss+xml" />
	<link>http://xinzero.com</link>
	<description>嵌入式软件</description>
	<lastBuildDate>Sun, 06 Jun 2010 03:54:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>FPGA中的多时钟设计</title>
		<link>http://xinzero.com/multiclock-designs-in-fpga.html</link>
		<comments>http://xinzero.com/multiclock-designs-in-fpga.html#comments</comments>
		<pubDate>Wed, 27 Jan 2010 10:29:17 +0000</pubDate>
		<dc:creator>will</dc:creator>
				<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[FPGA]]></category>

		<guid isPermaLink="false">http://xinzero.com/multiclock-designs-in-fpga.html</guid>
		<description><![CDATA[多种独立时钟在SoC（system-on-chip）设计中已普遍存在。很多SoC设备接有许多接口，这些接口根据标准运用了完全不同的时钟频率。
很多现代的串行接口继承了片上其它接口的异步性；而有些则直接从输入数据流中继承时钟。通过设计主要的SoCs子模块运行独立的时钟解决大片子中的时钟脉冲相位差，已经成为一种趋势。
由于这些原因，做SoC项目的设计人员一定会遇到多时钟和面对设计使用两个独立时钟芯片的逻辑连接问题。每个不同的时钟部分被认为是一个时钟域。在不同时钟上的逻辑接口被称作时钟域交叉或时钟域边界。对穿越时钟域边界的信号的处理是成功设计SoC的关键。 
问题1：亚稳定性   设计人员必须考虑的第一个多时钟问题是信号从一个时钟域到另一个时钟域的亚稳定性问题。许多设计人员明白在实际电路中亚稳定性确实是个问题，现代RTL（寄存传输级）设计的抽象概念和静态的时序分析并不能完全屏蔽设计者对根本物理实现的担心。 
无论何时一个信号进入一个时钟域的元件，如触发器，无论此时钟域与信号时钟多接近，都存在潜在的亚稳态问题。每当发生这样的情况，触发器立即产生不确定的值，在触发器的值被设置之前它的输出信号将不能使用。 
在一个异步时钟边界，接收端时钟用来捕获发送端触发器的每一个信号。因为没有定义时钟与信号间的时间关系，所以它们完全可以同时传输。这样，在接收时钟域存在亚稳定性的问题。 
这不是理论的、潜在的。在实际系统运行中，GHz时钟速率芯片的设计错误可以很快表现出亚稳态的效果。这些影响通常包括在时钟域之间丧失关键握手信号，以及失效多比特数据的严重问题，很有可能需要芯片的重新设计。 
很多设计师也知道，教科书中通过在每路穿越时钟域边界的信号上使用两级触发器解决亚稳定性问题。即使第一级触发器没有成为亚稳态，也有极高的可能性使信号通过第二级的时间将被确定。这种两级触发器结构被称为同步器，和设计师通常讲的穿越时钟域同步信号。 
问题2：复位同步   复位信号不同步是多时钟设计的一个相关问题。设计师有时会忘记，复位信号为受到亚稳定影响，应该加同步器加以保护。一般来说，整个系统可以使用单一信号复位，因此，必须传到所有时钟域的所有时钟元件。 
复位信号的有效沿没有必要同步，因为所有的状态元件复位定义为初始值，并且复位信号会保持足够的时钟周期，取出所有的亚稳定状态。 
但是，复位停止必须保持同步，这样触发器在复位状态恢复后不会处于亚稳态。在设计中，通过给进入每一个时钟域的复位信号一个独立的同步器来实现。 
问题3：毛刺消除跨时钟域   尽管出于实际的目的同步消除了亚稳态，但是它不足以解决其它类型的多时钟设计错误。在多时钟设计中第三类常见错误是允许毛刺从驱动时钟域传播到接收时钟域。 
因为一个接收时钟域的触发器可以及时的从驱动时钟域的任意点采样信号，甚至是很窄的毛刺也可能被捕获，并视为一个有效值。由于时钟关系的变化特性，这种毛刺电压不能通过静态时序分析检测。 
避免种类问题最常见的方式是，使从驱动时钟域触发器输出的信号直接进入同步器。这有效地定义了一个三个阶段同步器，第一个触发器由驱动时钟驱动，剩余的两级由接收时钟驱动。尽管设计及时钟结构的自动分析更加可靠，但这种方法可以作为设计审查。 
问题4：接收时钟域不恰当的保持时间（hold times）   在多时钟设计中第四类问题是，不稳定数据从一个时钟域到另一个没有遵守保持时间。信号从一个快速时钟域到一个慢速时钟域时，在驱动时钟域必须稳定几个时钟周期，保证接收域中的慢速时钟不会完全丢失转换。 
如果这个转换丢失，数据将丢失。例如一个信号从33MHz的PCI域到12MHz的USB域，必须保持稳定3个时钟周期，才能保证被接收。 
当数据信号在逻辑控制信号的保护下，跨越时钟边界，保持时间（hold times）也是非常重要的。 
问题5：跨越式中边界丢失信号间的相关性   在多时钟设计中的最后一类问题是，相关信号在跨越时钟边界后失去相关。这个问题是最不直观的。这将导致非常不确定的行为，如数据丢失，算术结果破坏。 
这类不直观的问题在可视化的检查中很难被发现，特别是用RTL电路形式，在设计审查是经常被忽视。必须将严格的设计规则和有效的自动分析用于这类问题。 
在广泛的相关信号中，可能产生相关性丢失的几种不同方式，包括： 

总线的多数据位 
单信号的多次复制 
握手信号，如请求与应答信号 
明显不相关的信号合并在接收时钟域的同一逻辑中

无论何时一个信号进入亚稳态，可以使用同步器确定它的值，但是在接收时钟域不能保证在信号有效之前的精确周期数。因此，任何一个多位信号，每位有独立的时钟同步，每位在到达接收时钟域时，相对其它位将产生倾斜。 
即使亚稳定不发生，任何成对数据位信号在到达相应的同步器之前，通过不同的线路或者电特性使两个信号产生不同的延时，都可能丢失同步。 
可能一个同步器采样输入信号，并且在另一个同步器捕获信号变化之前，先捕获信号的变化，这样，两个信号将在一个时钟周期内倾斜，并且不再相关。 
两个明显独立的信号来两个分离的时钟域，最终反馈进相同的接收时钟域，这是可能产生丢失相关性。这一模式被称作再收敛。在设计复查中，通过同步原理的手动检查方式很发现。 
解决方法：时钟验证（Clock intent verification） 
尽管多时钟设计的挑战的确让人沮丧，但是幸运的是以上所有描述的问题，是可以自动分析的。然而不是所有的问题都是完全一致的。可能为了避免可疑逻辑的细节警告，设计人员可以检查逻辑是否正确。时钟验证（CIV）是分析时钟结构，报告错误与警告的一个过程，然后使用详细正式的报告验证这些不能被证明问题。 
任何CIV必须解决多时钟设计中五个问题的一个。这一进程始于RTL的结构分析，追查设计中从触发器到其它级元器件的时钟与复位。这一过程可以自动设别： 

设计中的所有异步时钟域 
穿越时钟域的所有控制和数据信号 
任何丢失同步或者不正确同步的跨时钟域信号 
任何在输入端有潜在毛刺的同步器 
任何信号有扇出倍同步器 
任何在接收时钟域再收敛的独立同步信号 
任何复位信号没有合理同步的时钟域 
任何存在潜在毛刺的门时钟或派生时钟

如果合理实现，这些结构的分析可以很快的在SoC上实现，最少的设计输入要求，尽管在对输入信号做简单的描述，对分析是有好处的。 [...]]]></description>
			<content:encoded><![CDATA[<p>多种独立时钟在SoC（system-on-chip）设计中已普遍存在。很多SoC设备接有许多接口，这些接口根据标准运用了完全不同的时钟频率。</p>
<p>很多现代的串行接口继承了片上其它接口的异步性；而有些则直接从输入数据流中继承时钟。通过设计主要的SoCs子模块运行独立的时钟解决大片子中的时钟脉冲相位差，已经成为一种趋势。</p>
<p>由于这些原因，做SoC项目的设计人员一定会遇到多时钟和面对设计使用两个独立时钟芯片的逻辑连接问题。每个不同的时钟部分被认为是一个时钟域。在不同时钟上的逻辑接口被称作时钟域交叉或时钟域边界。对穿越时钟域边界的信号的处理是成功设计SoC的关键。 </p>
<p>问题1：亚稳定性   <br />设计人员必须考虑的第一个多时钟问题是信号从一个时钟域到另一个时钟域的亚稳定性问题。许多设计人员明白在实际电路中亚稳定性确实是个问题，现代RTL（寄存传输级）设计的抽象概念和静态的时序分析并不能完全屏蔽设计者对根本物理实现的担心。 </p>
<p>无论何时一个信号进入一个时钟域的元件，如触发器，无论此时钟域与信号时钟多接近，都存在潜在的亚稳态问题。每当发生这样的情况，触发器立即产生不确定的值，在触发器的值被设置之前它的输出信号将不能使用。 </p>
<p>在一个异步时钟边界，接收端时钟用来捕获发送端触发器的每一个信号。因为没有定义时钟与信号间的时间关系，所以它们完全可以同时传输。这样，在接收时钟域存在亚稳定性的问题。 </p>
<p>这不是理论的、潜在的。在实际系统运行中，GHz时钟速率芯片的设计错误可以很快表现出亚稳态的效果。这些影响通常包括在时钟域之间丧失关键握手信号，以及失效多比特数据的严重问题，很有可能需要芯片的重新设计。 </p>
<p>很多设计师也知道，教科书中通过在每路穿越时钟域边界的信号上使用两级触发器解决亚稳定性问题。即使第一级触发器没有成为亚稳态，也有极高的可能性使信号通过第二级的时间将被确定。这种两级触发器结构被称为同步器，和设计师通常讲的穿越时钟域同步信号。 </p>
<p>问题2：复位同步   <br />复位信号不同步是多时钟设计的一个相关问题。设计师有时会忘记，复位信号为受到亚稳定影响，应该加同步器加以保护。一般来说，整个系统可以使用单一信号复位，因此，必须传到所有时钟域的所有时钟元件。 </p>
<p>复位信号的有效沿没有必要同步，因为所有的状态元件复位定义为初始值，并且复位信号会保持足够的时钟周期，取出所有的亚稳定状态。 </p>
<p>但是，复位停止必须保持同步，这样触发器在复位状态恢复后不会处于亚稳态。在设计中，通过给进入每一个时钟域的复位信号一个独立的同步器来实现。 </p>
<p>问题3：毛刺消除跨时钟域   <br />尽管出于实际的目的同步消除了亚稳态，但是它不足以解决其它类型的多时钟设计错误。在多时钟设计中第三类常见错误是允许毛刺从驱动时钟域传播到接收时钟域。 </p>
<p>因为一个接收时钟域的触发器可以及时的从驱动时钟域的任意点采样信号，甚至是很窄的毛刺也可能被捕获，并视为一个有效值。由于时钟关系的变化特性，这种毛刺电压不能通过静态时序分析检测。 </p>
<p>避免种类问题最常见的方式是，使从驱动时钟域触发器输出的信号直接进入同步器。这有效地定义了一个三个阶段同步器，第一个触发器由驱动时钟驱动，剩余的两级由接收时钟驱动。尽管设计及时钟结构的自动分析更加可靠，但这种方法可以作为设计审查。 </p>
<p>问题4：接收时钟域不恰当的保持时间（hold times）   <br />在多时钟设计中第四类问题是，不稳定数据从一个时钟域到另一个没有遵守保持时间。信号从一个快速时钟域到一个慢速时钟域时，在驱动时钟域必须稳定几个时钟周期，保证接收域中的慢速时钟不会完全丢失转换。 </p>
<p>如果这个转换丢失，数据将丢失。例如一个信号从33MHz的PCI域到12MHz的USB域，必须保持稳定3个时钟周期，才能保证被接收。 </p>
<p>当数据信号在逻辑控制信号的保护下，跨越时钟边界，保持时间（hold times）也是非常重要的。 </p>
<p>问题5：跨越式中边界丢失信号间的相关性   <br />在多时钟设计中的最后一类问题是，相关信号在跨越时钟边界后失去相关。这个问题是最不直观的。这将导致非常不确定的行为，如数据丢失，算术结果破坏。 </p>
<p>这类不直观的问题在可视化的检查中很难被发现，特别是用RTL电路形式，在设计审查是经常被忽视。必须将严格的设计规则和有效的自动分析用于这类问题。 </p>
<p>在广泛的相关信号中，可能产生相关性丢失的几种不同方式，包括： </p>
<ul>
<li>总线的多数据位 </li>
<li>单信号的多次复制 </li>
<li>握手信号，如请求与应答信号 </li>
<li>明显不相关的信号合并在接收时钟域的同一逻辑中</li>
</ul>
<p>无论何时一个信号进入亚稳态，可以使用同步器确定它的值，但是在接收时钟域不能保证在信号有效之前的精确周期数。因此，任何一个多位信号，每位有独立的时钟同步，每位在到达接收时钟域时，相对其它位将产生倾斜。 </p>
<p>即使亚稳定不发生，任何成对数据位信号在到达相应的同步器之前，通过不同的线路或者电特性使两个信号产生不同的延时，都可能丢失同步。 </p>
<p>可能一个同步器采样输入信号，并且在另一个同步器捕获信号变化之前，先捕获信号的变化，这样，两个信号将在一个时钟周期内倾斜，并且不再相关。 </p>
<p>两个明显独立的信号来两个分离的时钟域，最终反馈进相同的接收时钟域，这是可能产生丢失相关性。这一模式被称作再收敛。在设计复查中，通过同步原理的手动检查方式很发现。 </p>
<p>解决方法：时钟验证（Clock intent verification） </p>
<p>尽管多时钟设计的挑战的确让人沮丧，但是幸运的是以上所有描述的问题，是可以自动分析的。然而不是所有的问题都是完全一致的。可能为了避免可疑逻辑的细节警告，设计人员可以检查逻辑是否正确。时钟验证（CIV）是分析时钟结构，报告错误与警告的一个过程，然后使用详细正式的报告验证这些不能被证明问题。 </p>
<p>任何CIV必须解决多时钟设计中五个问题的一个。这一进程始于RTL的结构分析，追查设计中从触发器到其它级元器件的时钟与复位。这一过程可以自动设别： </p>
<ul>
<li>设计中的所有异步时钟域 </li>
<li>穿越时钟域的所有控制和数据信号 </li>
<li>任何丢失同步或者不正确同步的跨时钟域信号 </li>
<li>任何在输入端有潜在毛刺的同步器 </li>
<li>任何信号有扇出倍同步器 </li>
<li>任何在接收时钟域再收敛的独立同步信号 </li>
<li>任何复位信号没有合理同步的时钟域 </li>
<li>任何存在潜在毛刺的门时钟或派生时钟</li>
</ul>
<p>如果合理实现，这些结构的分析可以很快的在SoC上实现，最少的设计输入要求，尽管在对输入信号做简单的描述，对分析是有好处的。 </p>
<p>根据这些信息，分析可以极端正确，以至于虚假的错误和警告将不会报告。设计者将只会看到真正的问题，或者是有关设计的有用反馈信息（例如一系列合理同步的信号）。 </p>
<p>尽管很多类型的多时钟设计问题可以通过CIV的结构分析来检测，但还是有部分不能。对于变化的多时钟域信号处理与跨时钟域数据的稳定性验证，需要彻底地分析与正式的验证。 </p>
<p>既然正式的验证需要对设计断定，一个CIV解决方案必须能够产生三种类型的断定，来表现信号穿过多时钟域的期望行为： </p>
<ul>
<li>断定多位数据跨域时钟域时，必须是灰数据（每次仅有一位数据改变）；这是为了避免丢失相关性 </li>
<li>断定具有同步器的信号能够保持稳定，持续足够长的时钟周期，以便接收时钟域能够检测，这是为了避免丢失数据 </li>
<li>断定没有同步器的信号（比如数据总线），在接收时钟域采样时间内，能够保持稳定，这也是为了避免数据丢失</li>
</ul>
<p>正式的验证试图证明这些断定在任何假定下都不能违反，或者试图通过举反例来证明断言不能违反。 </p>
<p>无论何时一个证据被发现，设计者将信心大增，因为他们知道没有可能特定时钟跨越错误将会发生。无论何时一个范例被发现，正式验证已经发现了一个实际的bug，如果不解决，将导致芯片不能工作。正式的工具必须能够提供足够的信息让设计者解决问题，然后重新运行观察是否能够找到证据，去除心中久留的顾虑。 </p>
<p>尽管正式验证是一个彻底的技术，但是在复杂的SoC设计中，并不是所有的断定都能够被证明的。出于这个原因，如果CIV方法能够产生符合仿真形式的断定，将是有价值的。如果无法找到证据，但是断定在整个成百万甚至上十亿个时钟周期内运行都不产生冲突，那么，设计师仍然可以获得一项多时钟设计正确性推断的重要措施。</p>
<h3>随机文章</h3>
<ul class="related_post">
<li><a href="http://xinzero.com/setup-ethereal-build-environment-on-windows.html" title="在windows下建立Ethereal开发环境">在windows下建立Ethereal开发环境</a></li>
<li><a href="http://xinzero.com/vc2005-redistribute-x86.html" title="VC2005运行库-解决方案">VC2005运行库-解决方案</a></li>
<li><a href="http://xinzero.com/qqmail-freemail.html" title="QQ邮箱-功能强大的免费邮箱">QQ邮箱-功能强大的免费邮箱</a></li>
<li><a href="http://xinzero.com/capacity-classification.html" title="电容的分类">电容的分类</a></li>
<li><a href="http://xinzero.com/vcredist_x86-exe-windows-installer.html" title="解决&quot;应用程序配置不正确，程序无法启动&quot;问题">解决&quot;应用程序配置不正确，程序无法启动&quot;问题</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://xinzero.com/multiclock-designs-in-fpga.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
