| ||||
改良之设计和侦错 工程师是有创造力的一群。我们自豪能够由很少创造出某些有用的事物 (撇开花费多少时间和精力不谈);很多卡通会捕抓(甚至会夸大) 我们这个能力。然而,一个很少被公开的事实是,我们会一丝不苟的记下什么可行、什么不行。Verilog和 VHDL有很长的设计者“要做”、”不要做”、”要改进”、”希望有的”、及”要拿掉”之希望清单。设计社群有幸出现一群为数愈来愈多之志愿者,致力于将这些纳入最新版的Verilog: SystemVerilog。我们在此将着重于一些对于设计和侦错都有助益的项目。 | ||||
SystemVerilog系较佳之Verilog SystemVerilog可用来作为较佳之Verilog,因为其系建立于Verilog 2001之上。SystemVerilog可藉由加入几个源自software C之建构元而增进其生产力和可读性。这些建构元包括 typedef (自订资料型别)、enum (列举资料型别)、union(联合)、及 struct (结构)。Typedef容许使用者定义类型之建立和之后的使用。Enum 使得数值之解码变得简单,并且能让使用者使用简单的命名,而非直接使用资料值;无庸置疑的使侦错变得更加容易。Structs 能提供资料封装,并且让使用者轻易并且天衣无缝的移动大量资料。图 1 系显示一说明所述建构元如何改善设计中之操作和侦错之例子。 图1 structs 之操作和侦错 | ||||
意图 vs. 阐释 写得较差的Verilog 程式码可能会遭受“模拟与合成不符”之批评,其系因为其本身叙述之模煳不清。没有什么比always 建构元来得更显着。Verilog中之Always 可用来将以下模型化: ◆组合逻辑, ◆闩锁逻辑, ◆序列逻辑及测试平台逻辑 软件工具接着必须依据程序内容和脉络来推断 (例如:猜测)工程师所要的是哪种硬件。图2即显示此一范例。一模拟器由于不完整的敏感、易触发资料列而会把always封锁(及输出 out) 当作一闩锁;然而一合成器却会将其当作组合逻辑 (如同该清单因其中具有信号sel而为完整的)。行为侦错工具可依据合成规范对其加以分析,而使用一 “使用者不 想之拴锁” 标示为输出以旗号来标示不符 (藉由质疑) 。然而,这些使用情境可能会造成相当程度之误解,而即使工具完全依据了阐释引导方针,它们也许只是以错误方式来阐释设计者之意思 (也许是由于在敏感、易触发资料列之遗漏信号、额外的posedge (正缘触发)、或甚至错序安排)。 图 2 语意含煳之例子 为了补救此状况,SystemVerilog 加入数个硬件导向之建构元: 图 3 语意清楚之例子 同样的,其他常见误释为“full case”和“parallel case”使用情境,其中在模拟器和合成工具之行为中亦造成不符。为了因应此问题,SystemVerilog 加入了unique (单一的) 和 priority(优先权)修饰语。 | ||||
行为 vs.通信 SystemVerilog语言之一主要特征在于加入介面。介面可用来将多条线路聚集在一起,因此能封装通信方块。介面包装和模组包装极为相似。它们可以包含各种宣告,例如可由所有介面使用者共用之变数、工作及功能。介面亦可包含用于模型化之程序,和用于验证适当用法之assertions (断言,一种程式检验机制)。因此问题在于:具有介面之背后道理为何?其答案为:藉由将行为由通信过程区分出来,设计者可以获得把区块功能之叙述由通信和资料传输区分出来的益处。举例而言,设计和侦错的一个直接优点在于能显着的减少不必要和易错之不同模组之埠的重复连接。以下图 4便说明介面如何有助于实现此点。 图 4 线路 vs.介面 另一个主要的优点在于能改进抽象化。我们多半会以抽象的通讯应用开始,亦或一简单的机制,但是后来在设计效用上变为不足,例如不能达到频宽或潜伏要求。同时具有可经由改进或换成更精确、更有效之机制之分隔和抽象化,可使设计随着研发週期进行而可再使用并且可维持。此想法和支持它的方法和工具已经出现一阵子,肇始于Rowson和Sangiovanni,现在则是系统设计之最佳实施方式之一部分。以下例子为一简单的片断程式码,其执行了图 5之模式以显示通信政策之改变可于介面本身(而非其週遭之所有模组)产生影响。 图 5 简单之通信介面 interface chip_bus (input bit clk); 通信抽象化和改进亦是组合式验证之中心概念,其中验证工作可分别针对行为和通信来进行,以致个别区块。使用介面使侦错註解方法可扩展,而且是相当强有力之追踪通信之方式。视觉化方法可加入抽象层,其中介面案例将数条线聚集成一将被更新或环绕各区块传递之单一物件。图 6 系显示这些概念如何显示于一侦错工具。 图 6 侦错显示之介面 | ||||
处理程序层级侦错 通信行为改进亦提供有用之资料抽象概念;亦即处理程序(transactions)。处理程序系一种用来描述资料如何在不同设计元件之中转移及到什么程度之形式。侦错工具可使用处理程序 来管理由设计所产生之资料,然后以使用者可理解之方式呈现出来。处理程序有各种形式;它们可以是简单之资料元件之标志,亦可为复杂和精细之通信或资料传输机制之封装。 为了将处理程序加以模型化,我们可由有关标记法和元件模型化语言(例如:统一模式语言 (UML))之大量研究中借用一些概念、专门术语、及註释。举例而言,我们可以把处理程序想成一种用于侦错视觉化(例如:波形)会被显示并且可在设计资料上操作之实际物件。处理程序可具有: ◆一标籤即一调处控制元,及一组属性。属性可具有各种数值和类型。 ◆许多具有其他处理程序之关联。它们可具有各种不同的角色例如:父子、前者-后继者等。关联亦可具有多样性 (1 ~ 多),并且可以组成或集合之形式呈现。 图 7系显示一用于侦错工具(例如:波形图)以显示处理程序,使得资料能以可理解并可管理之方式呈现之例子。 图 7 处理程序显示实例 - 改良之测试平台 | ||||
类别和物件 为了支持有效而可再使用之测试平台之建立,SystemVerilog以类似C++ 或Java之方式把物件导向加入该语言中。物件被导入软体领域不仅是因为组织的目的,而是其主要目的在于以可以维持和扩展的方式来处理未来将其延伸到一特定系统。换言之,要知道的是一个系统是绝对不会被 “完成”,而只是发展的一个起点—是否以规格化来缓和对于某些考量之限制,或是藉由一般化(generalizations)来因应新的、未提及之考量点。的确,如果我们要再利用已经投入之时间和精力,测试平台即为一例:很多情况下,一设计元件也许有太多限制因此需要改良,或其被发现属于考量之较大范畴,而因此需要一般化。而且,随着复杂度的增加,也许要给予更多的抽象;这即是何以物件模型随着数年之经验而愈来愈优越,在软件领域能够提昇发展。物件和其关系包括将模型化概念呈现和执行:抽象、封装、群集(分群)、功能分解等。 在SystemVerilog,一个类别中之资料宣告被称作属性(properties),工作/功能被称作方法。属性和方法所共同界定之一类别案例之内容和性能即称作物件。物件可经由动态建立并且藉由控制元来存取,其提供了指标(pointers)一安全的形式;SystemVerilog 亦收集垃圾以摆脱不再使用的物件,如此能防止记忆体遗漏。一般类别可经由参数化而建立,类似C++之样板类别。类别物件亦可继承来自其他类别之属性和方法 (如Java般为单一继承,即单一类别系源自单一父类别)。继承可衍生一延伸概念-测试平台可依据不同之利用或相同设计之不同变异而被再次使用和专门化。SystemVerilog又可容许多型化,即一种可让相似之方法依据情境在电脑运作时构成差异之功能。一基础类别中之方法可被扩充类别中之另一方法重新定义。这些概念亦呈现于显示Packet(封包) 类别例子之图 8 和和显示源自 Packet(封包)之ErrPkt类别之图 9。 图 8 Packet(封包) 类别定义 图 9 源自 Packet(封包)之ErrPkt类别 随着抽象化和执行层级之扩张、所理解之鸿沟变宽,设计者对于在一抽象层级和跨抽象阶层之各种关联和关系之概念化能力有显着之缩减。对于改进此一缺点,软件领域中有许多视觉呈现方式已证实极为有用:包括3种主要概念和图形: 图 10 简化之统一模式语言类别图 – Packet (封包) 之例子 2) 互动和活动图:一与元件互动之元件图正交垂直(或只是与其互补)的图。此图可以许多形式呈现,包括时序图或事件 (或transaction(处理程序))略图。这亦可被称作统一模式语言 (UML)之序列图. | ||||
动态过程、通信、及同步化 动态过程系用来将并行(concurrency)加入系统设计或测试平台模型。其目的在于经由较佳之资源利用而增进效能。SystemVerilog 以join_any 扩展 Verilog fork-join 叙述区块和join_none 修饰语。这些叙述之运用系以图形显示于以下之图 11。 图 11 Fork-join 衍生程序区块 由于处理过程会共用一些资源(例如:记忆体、资料等),因此同步化 (和互斥)是必要的,这些可经由旗标和(或)事件而达成。邮箱系一种处理资料传输之工具。旗标和邮箱系内建类别,事件则是 Verilog 资料型态之延伸用法。 对于并行之侦错较具挑战,因为 “state” 资讯在各程序中必须被保存,因此资料储存的量增加。此外,并行会引发埋伏于其内部之潜在错误。它们包括: | ||||
以Assertion为基础之设计和侦错 Assertions(断言,一种程式检验机制) 系用来验证设计,为一种简要但是具表述性之工具,藉由一区块或多个共同使用之区块以描述(不)想要之动作。Assertions 通常是配合一验证方法而运用问题分割-结合而(分别击破)之方法使得确认局部化。此方法即是组合式验证。该想法即在验证设计中一或多个部份,然后整合所有验证结果以裁定全部之正确性。此外,将记分板用于验证活动以识别设计的哪一部分已经验证至何种程度,而哪些尚未达到标准。此即是所谓之coverage (涵盖)。coverage和assertion 叙述皆可使用相同之潜在的暂态语言;在SystemVerilog中,此语言即被称作 SystemVerilog Assertions (SVA)。 高阶指令分别为assert、或用以声明行为之cover,或聚集之涵盖资料。Assertions 亦可使用assume assertion 指令来限制验证工作(或作为测试之限制)。 尽管assertions (断言,一种程式检验机制) 主要系用于验证,它们亦可用于设计中,可被用于合成(如合成一区块);其在介面合成方面相当成功。它们亦可被用来作为视觉元件,用以顾及分散式的设计活动和早期的高阶模拟。如此可促进对于设计之潜力、限制之了解并且增进设计团队之生产力。我们稍早在其他地方 [19] 详细描述 如果将assertions 放置于介面边界上即可找出和隔离错误。介面结合assertions,亦有助于检验是否设计之执行符合时间安排和协定之要求,及于[16]中描述之效能分析。的确,在SystemVerilog,assertions可被放置于介面之内(例如:通信或模组(行为))。 Assertions (断言,一种程式检验机制) 系一种进行设计侦错的理想工具。参考文献[20]已经详细论述如何使用assertions 来进行行为为主之设计侦错,其中叙述本身为对于错误之位置之时空提示及用于活动分析之动态assertion 资料。该方法尝试从问题癥兆开始以找出和隔绝错误 (以一种引导使用者之自动化方式))。 对于 of assertions (断言,一种程式检验机制)之侦错是值得留意的一个领域。随着对assertions 之信赖增加,assertions 之复杂度必然会提升,接着即会变成对assertion 本身侦错之需求。波形显示在过去已经有不少探讨 ([20]),而且愈来愈普遍。物件 (主动)源级註解用于设计相当的成功,其亦是能促进assertion 码之改进之主要范畴。由于以下两项因素,assertion 码之註解在视觉化和设计者之熟悉度方面呈现出一些挑战: Assertion 码是陈述式的。这和程序式的HDL 执行码有显着的不同。 有些建构元非常的简要。例如图 12所示之重复运算子(*) 隐藏许多内部的重复步骤。需对此建构元投以额外之注意。同样的,其他除了本文章已提过之原始码和波形显示之外之视觉方式,亦须加以适当的扩展以调和并影响assertions。 图 12 重复之表示 | ||||
结论 高阶语言如SystemVerilog 已经出现以回应市场需要甚至促进高阶和多产之设计、验证、及侦错。在此,我们已经略述对于SystemVerilog对设计社群之潜力,及其对于EDA 供应商社群之挑战和契机。此语言已经被业界认可为一种有价值、对于因应目前设计上困难的尝试。前景在此,但现在必须由使用者和供应商们来使其成真。 |
用户377235 2013-1-25 14:28