“设计重用”是将高质量知识产权(IP)从一种ASIC设计迁移到另一种ASIC设计的过程。随着半导体技术的巨大进步,越来越难以弥合技术提供与硅生产率允许之间的生产率差距。设计全定制ASIC以占用尽可能多的硅面积变得越来越具有挑战性。为了实现最高水平的硅效率,设计具有高度可重复使用设计实体的半定制ASIC已成为当今的挑战。
使用预先设计和预先验证的设计模块来实现高水平的设计重用是最有前途的技术用于缩小可用门数与设计人员生产率之间的差距。设计复杂的芯片需要基于HDL的设计。考虑到设计重用的有效HDL生成将帮助您创建可用于多个芯片设计的IP内核。
设计重用挑战
重复使用设计带来了新的创新挑战设计师。在可重复使用之前,必须使用设计,这意味着使用良好的设计实践进行设计。必须设计一个可重复使用的设计,具有解决一般问题的思维方式;编码良好,评论和记录;验证了高度的信心;
由于产品上市时间紧迫,设计人员经常绕过部分或全部这些指导原则,使设计几乎不可重复使用。但是,遵循这些指导原则可以通过减少整个编码和验证循环中的迭代来加速项目的设计,验证和调试。设计的有效使用和重用在创建具有积极设计时间表的大型ASIC中起着至关重要的作用。
虽然芯片设计人员已经使用了HDL一段时间,但今天的大多数设计都没有使用内置的“设计 - 重用“语言的特征。换句话说,设计师并没有完全理解HDL的目的,也没有滥用或低估其功能。平均而言,该行业中只有20%的设计是可重复使用的。随着对设计重用的需求不断增加,对设计重用的编码技术的重视程度正在提高。本文介绍了使用VHDL的本机语言特性和与可合成VHDL相关的设计重用技术开发可重用设计。除非另有说明,否则所讨论的VHDL符合VHDL-87标准。
VHDL功能促进可重用性
芯片设计人员使用VHDL已超过十年。在VHDL中开发设计的主要目的之一是可重用性,尽管设计师直到最近还没有有效地使用这种技术。您可以利用功能丰富的VHDL来重用技术。 VHDL功能包括泛型,常量包,生成语句,无约束数组,VHDL属性,用于内联设计分区的块语句,用于数据捆绑的记录数据类型,配置规范,将端口与已知常量联系起来的能力,离开的能力未使用的输出端口打开和未连接,数组聚合,函数和过程。
提示1:泛型
使用泛型编写具有不同结构和行为的参数化模型(参考文献1)。清单1提供了一个具有可修改结构和行为的同步计数器的简单示例。您可以通过使用VHDL泛型来完成此修改。此示例说明了使用语言的特征进行模拟和合成来修改结构和行为的泛型。您可以通过打开和关闭泛型来启用和禁用选择性功能。例如,如果在第8行中将COUNT_ENABLE泛型设置为FALSE,则第32行到第38行中描述的逻辑都不会被详细说明或合成,但父设计仍然可以具有计数启用。对OutDelay和DOWN_ COUNT使用不同的值会更改计数器的行为(尽管合成会忽略OutDelay),更改BIT_WIDTH或COUNT_ENABLE会修改设计的结构。使用泛型创建设计可以在需要不同结构或行为的各种情况下重用设计。例如,设计可能需要两个计数器:一个计数到1024,另一个计数到八。设计两个独立的计数器 - 一个是10位宽,一个是3位宽 - 在设计,验证和合成时间方面存在不必要的投资缺点。
如果使用通用方法设计计数器考虑到重用,您可以节省大量的设计,综合和验证时间。使用泛型来参数化结构和行为对于设计重用应用程序至关重要。以下示例说明了清单1中的计数器在需要10位递增计数器和3位递减计数器的应用程序中的实例化
清单2中的示例说明了以下几点:
第3到第14行将计数器实例化为10位递增计数器,并启用计数启用逻辑。
TenBit计数器实例化使用命名关联作为其泛型和端口。
实例化中未映射的通用值假定为默认值。
第18行到第30行实例化与3位递减计数器相同的计数器,其中count-enable-logic关闭。
ThreeBit计数器实例化使用其泛型和端口的位置关联。通常,不建议使用位置关联,因为更改可重用设计中的参数或端口需要在该设计的所有实例中进行相同的修改。
泛型的使用当您需要相同设计的多个实例时,可以极大地帮助您节省资源和时间。
使用泛型来设计参数化不仅有助于创建可重复使用的设计块,而且还有助于在合成期间删除不必要的逻辑或修改有用的逻辑。在通过泛型参数化设计时,一些综合工具可帮助创建宏和模板。您可以在后续设计中使用由此创建的特征作为库元素进行模拟或合成。通过泛型参数化总线和寄存器宽度是使用泛型的一个简单示例。
考虑清单1中具有以下通用值的计数器示例:
当综合详细说明此设计时,综合工具会忽略OutDelay的泛型,因为该工具无法处理映射逻辑中的时间延迟元素。综合工具使用count_enable逻辑创建一个2位向下计数器,如下例所示。
考虑具有以下泛型的同一计数器的另一个案例:
此代码创建一个没有计数启用逻辑的8位递增计数器。如果门数是一个重要参数,则可以使用此方法有效地优化未使用的逻辑。您可以使用这种优雅的参数化方法在设计,合成和模拟过程中修改结构(更改BIT_WIDTH)或行为(向上或向下计数器,count_enable禁用或启用)。
泛型非常适合指定计数器,总线,移位寄存器和其他设计的宽度,但如清单2所示,您还可以使用泛型来打开和关闭各种功能。此技术允许您仅使用适用于当前项目的功能。您可以使用泛型来指定FIFO深度等功能;总线接口,如PCI或ARM系统总线;架构,例如向上/向下计数器,基于触发器的寄存器与基于锁存器的寄存器,以及纹波进位加法器与进位超前加法器;登记地址;寄存器的上电复位值;寄存器中的支持和保留位;时钟分频电路的时钟分频比;时钟树中的缓冲区数量。
如果使设计有点通用,其他人可以更容易地重复使用它。当您在层次结构中使用泛型时,会出现通用方法的一个缺点。要将泛型应用于层次结构的最低级别,泛型必须向下传递到层次结构中。这种传递可能涉及泛型必须经历不使用泛型值的块。使用泛型的另一个缺点是,随着泛型列表的增长,在层次结构中的每个点处携带它们变得更加麻烦。第三个缺点是一些综合工具对泛型的支持有限。例如,综合工具可能要求所有泛型都是整数类型。避免这些问题的一种有效方法是使用一个常量包。
提示2:常量
VHDL包是一种简单的方法,可以对一组相关的声明进行分组。共同的目标。您可以使用库语句使包对可见的设计块可见。使用库语句意味着添加或更改参数只需要修改一个包文件。此外,某些综合工具不允许使用布尔,字符串,枚举或数组类型进行泛型。在这种情况下,使用库语句允许您在包中使用常量。大多数综合工具允许大多数数据类型,并且使用库语句允许包对枚举数据类型使用TYPE语句。一个常量包还允许您在“设计感知”测试平台中使用相同的包进行设计和模拟。
作为使用常量包的示例,请考虑将清单2中的计数器更改为使用这样的包。另外,假设包位于“pkgs”VHDL库中(清单3)。此计数器示例显示使用常量包类似于使用泛型进行参数化。此外,使用常量包允许任何设计实体引用包中的参数而不会产生任何开销。此外,要更改设计的结构,您必须仅更改包中的参数值,并且可以在引用该参数的所有单元中看到更改。常量包也可以使用子类型和枚举数据类型来引用参数以获得可重用性和可读性,并且中央包可以用作参数化包以参数化整个设计。此外,使用包使得使用数组和其他复合数据类型进行参数化相对简单。
您可以作为设计单元单独处理包,独立于设计创建包,并重用包装在模型的不同部分。泛型定义中的一些不可合成的构造(例如枚举数据类型)在包中使用时可以合成。包可能包含您可能用于参数化的其他常量和信息,但设计仍可能使用此信息。该包用作此类共享信息的通用占位符。此外,一组参数提供了更好的代码结构,提供了有效的组织,并且是自我记录的。
图1显示了不同泛型和常量值的参数化计数器。使用Synopsys设计编译器合成计数器,该编译器具有0.2-μm标准单元库,在所有合成测试中BIT_WIDTH参数设置为2.
在图1的计数器中,COUNT_ENABLE为false(未连接的en enable信号),BIT_WIDTH为2,DOWN_COUNT为false(传统的up-counter)。在图2的计数器中,具有计数使能的递增计数器,COUNT_ENABLE为真(连接使能信号),BIT_WIDTH为2,DOWN_COUNT为假。同样在图3的计数器中,没有启用的递减计数器,COUNT_ENABLE为假(未连接的启用信号),BIT_WIDTH为2,DOWN_COUNT为真。这三个示例显示了如何通过使用不同的泛型和常量值来修改计数器结构和行为,同时消除不必要的门。
延迟常量是您声明但不初始化包中的常量的常量。相反,您在使用常量的设计中初始化延迟常量。换句话说,你“推迟”常量的绑定。在引用它们之前必须绑定延迟常量,以便对包的任何更改都不需要设计计数器重新编译或重新合成。
使用常量包与使用泛型修改具有相同的效果合成过程中的结构或行为。常量包还允许您有效地使用复合数据类型以提高可读性,并仍然保留设计可合成性。此外,合成使用常量包的设计比使用泛型的设计更容易。换句话说,工程师更容易学习如何使合成工具使用常量包而不是使用使用泛型的设计。对于具有复合数据类型的设计,某些综合工具具有较长的运行时。
您可以使用一组常量,其方式与使用泛型相同。如果涉及许多参数,常量包比泛型更容易使用。与泛型相比,包通常也更好地支持综合工具。但是,使用常量包意味着您不能在单个设计单元中使用具有不同参数的多个设计实例。相反,您需要为每个重复设计单元提供唯一的实体和独特的包。此外,使用非延迟常量的包中的更改会导致重新编译或重新合成引用包的设计,即使参数不影响设计也是如此。此外,常量包需要您维护单独的文件或库。
在考虑应用程序的预期范围后,使用常量包与使用泛型进行参数化进行比较。作为一般做法,对于具有许多参数且在大型设计中未多次实例化的设计,使用常量包。例如,将主机/CPU周期转换为存储器周期的存储器控制器设计不太可能在设计中多次实例化。这样的设计应该使用一组常量。您应该将泛型用于总线接口,计数器,加法器和线性反馈移位寄存器等设计。
技巧3:生成语句
您可以实现许多数字系统,例如记忆,作为子系统的常规迭代组合。例如,存储器包括矩形存储单元阵列。设计人员更喜欢这样的实现,因为它们可以更容易地生成紧凑,经过验证,面积有效的布局,从而降低成本。如果您可以将设计表达为某个子系统的重复,那么您应该能够描述子系统一次,然后描述如何重复实例化,而不是单独描述每个实例化(参考文献2)。
您可以使用generate语句有效地生成设计的迭代结构。生成语句是并发VHDL结构,可能包含进一步的并发语句以进行复制。当您将生成语句与泛型或常量结合使用时,它们可以有效地生成重复结构。考虑一种情况,您需要通过输出焊盘使用8个输出使能从片内驱动32位片外数据总线(清单5)。该示例实例化数据总线的32个填充单元。请注意使用“范围”和“长度”属性。这些属性还促进了重用,因为它们使用先前定义的数据总线总线宽度。还要注意在将输出使能信号分配给焊盘单元时使用“i/4”。综合工具应该足够智能,可以将除法截断为整数值,以便将dataoe(3)正确分配给数据(31:24),将dataoe(2)分配给数据(23:16),依此类推。
清单6说明了使用带有并发语句迭代结构的generate语句来从触发器创建寄存器。您还可以使用generate语句有条件地创建,修改或删除结构。该技术涉及代码级优化,在精化时间内删除不需要的结构。通过使用泛型或常量包,此技术可用于创建可重用的设计。
使用条件生成语句,您可以启用或禁用实现某些功能的逻辑,而不是手动删除代码或通过合成优化。作为条件代码包含和排除的示例,您可以将输出同步到时钟或使用常量CONSTANT SYNC_OUTPUTS组合设置它:BOOLEAN:TRUE;这种技术允许您生成同步或组合输出(清单7)。
generate语句是一个控制逻辑包含或排除的强大工具。它对于在迭代结构中重复使用逻辑块(例如触发器)的设计很有用。这些块形成寄存器,填充单元和许多其他结构。许多设计人员使用生成语句来实例化单元格,如pad示例所示,但您也可以使用generate语句来有条件地创建,修改或删除VHDL代码的各个部分。生成语句是促进设计重用的强大工具。一些显示生成语句应用的示例是选择基于锁存器或基于触发器的寄存器的实现;在总线仲裁器设计中包括固定,循环或其他仲裁方案;并且仅包括您知道将要使用的中断控制器的那些位。考虑已注册的中断进入中断控制器的情况。如果这些输入在被路由到其他寄存器之前经过大量的组合逻辑,则使用generate语句仅包括必要的触发器将有助于综合工具显着减少门数。请注意,某些综合工具无法跨触发器进行优化。在这些情况下,即使我们知道输入(例如未使用的中断)总是高电平,综合工具也不能使用此信息来减少合成设计的门数。
提示4:端口
在许多情况下,您可以通过将某些端口绑定到默认值来有选择地禁用逻辑。当采用自上而下的方法进行综合时,综合工具使用“通过恒定传播进行优化” - 优化该路径并考虑该关联值。您可以稍后从实体中删除绑定端口。考虑三门与门设计(图4a)。如果将其中一个输入连接到零(图4b),则生成的逻辑将消除所有AND门,输出F始终为逻辑0。
端口输出也是如此。通过保持未使用的端口输出打开(zo => open),您可以在采用自上而下的综合方法时消除创建这些输出的逻辑。
技巧5:无约束数组
使用无约束数组是重用可变宽度实现设计的有用方法。在设计中使用“范围”和“长度”等属性时应该小心,以避免运行时和精化时错误。无约束阵列特别适用于地址,数据和寄存器宽度。您可以将这些数组用于函数和过程以及实体端口中的形式参数。
VHDL允许使用无约束数组类型,使您可以指定索引值的类型而无需指定索引边界。无约束数组可用于制作只需修改其位宽即可在不同应用程序中重用的设计。前面的计数器示例使用无约束数组作为计数输出(清单8)。此技术允许您将计数器实体连接到任何大小的数组信号或任何范围的索引值。注意使用VHDL属性“range”来创建与端口计数具有相同宽度和范围规范的信号。您无法自己合成此设计,并且必须在顶级实体中实例化它以将数组值绑定到有限范围(清单9)。您必须以自上而下的方式合成清单9中的代码,以便您可以将计数器与设计的其余部分合成。
无约束数组的另一种用法出现在函数和过程中。您应该尽可能一般地编写为合成而设计的函数和过程,而与位宽无关。考虑二进制代码到格雷码转换器的示例。要从二进制代码创建格雷码,请使用图5a中的算法。图5b是如何将二进制100转换为其灰度代码等效值110的示例。表1示出了图5a的算法创建的3位二进制值的格雷码。您可以针对3位案例对此算法进行硬编码和优化。当设计必须容纳更多计数时,函数必须更改,要求您重新验证所有逻辑。编写独立于位向量长度的通用函数可以实现有效的重用。清单10是二进制代码到格雷码转换器的与位宽无关的实现。再举一个例子,考虑IEEE std_logic库中的函数和过程。大多数这些函数和过程都是使用无约束数组实现的,以支持有效的重用。
技巧6:VHDL属性
复合类型的一些属性在创建可重用设计时很有用。属性“左”,“右”,“范围”,“长度”,“低”和“高”是可综合的,并使代码独立于数据类型。请参阅使用无约束数组的示例(清单8和清单9),其中函数Gray2bin和实体计数器使用“range”属性来提升可重用性。
提示7:配置规范
您使用配置规范将组件实例绑定到设计实体。您还可以使用这些配置传递参数(如测试平台中最顶层的泛型),为实体选择体系结构,或覆盖实例化中的端口映射。某些综合工具不支持配置规范。
考虑前面的计数器示例,该示例说明了泛型用于参数化。清单11说明了另一个使用generate语句缓冲计数器输出的体系结构的计数器。现在,计数器在顶级设计中使用计数器的两个实例进行实例化。配置规范在实体顶部配置计数器,如清单13所示。配置规范允许您配置设计层次结构的各个级别。
提示8:块语句
块语句是VHDL结构,允许内联设计分区。例如,如果对设计进行分区以使数据路径存在于单独的VHDL实体中,则可以使用块语句对该实体的体系结构进行分区。块语句是一种对相关逻辑进行分组的方法。块语句还提供了在块内声明信号的能力,如果删除块,则不必要的信号在代码中不会保持未连接状态。您可以将generate语句与block语句组合以选择性地包含或排除块。
技巧9:未使用的端口
在分层设计中,如果您不使用某些端口实体,然后通常的做法是将它们连接到虚拟信号。从自上而下的综合方法来看,这种情况使得合成器假设您已将信号连接到网络。您可以通过保持端口未连接或通过使用VHDL关键字指定“打开”来避免此问题。
提示10:预处理器
在许多情况下,设计人员无法使用他们想要的内容可用的功能。在某些情况下,希望只看到与设计相关的代码。在这种情况下,您可以使用预处理器通过使用预处理程序指令来添加,删除或修改特定应用程序的代码。
-
PCB打样
+关注
关注
17文章
2968浏览量
21695 -
华强PCB
+关注
关注
8文章
1831浏览量
27749 -
华强pcb线路板打样
+关注
关注
5文章
14629浏览量
43034
发布评论请先 登录
相关推荐
评论