首页> 中国专利> 指定具有阶段缺省值的标度盘配置数字系统的方法和系统

指定具有阶段缺省值的标度盘配置数字系统的方法和系统

摘要

在至少一个硬件定义语言(HDL)文件中,指定至少一个包含数字系统的功能部分的设计实体。设计实体在逻辑上包含具有多个不同可能配置值的配置锁存器,其中每个不同可能配置值各自对应于数字系统的功能部分的不同配置。采用HDL文件中的语句,将Dial实体与至少一个设计实体相关联。Dial具有Dial输入、Dial输出、映射表、阶段ID和多个可能输入值中的缺省输入值,其中映射表表示可在Dial输入上接收的多个可能输入值的每一个与Dial输出的各自对应输出值之间的映射。Dial实体的输出值控制不同可能配置值中的哪一个被装载在配置锁存器中,并且阶段ID表示要施加缺省输入值的阶段。

著录项

  • 公开/公告号CN1637746A

    专利类型发明专利

  • 公开/公告日2005-07-13

    原文格式PDF

  • 申请/专利权人 国际商业机器公司;

    申请/专利号CN200410086156.2

  • 申请日2004-10-19

  • 分类号G06F17/50;

  • 代理机构11105 北京市柳沈律师事务所;

  • 代理人邸万奎;黄小临

  • 地址 美国纽约州

  • 入库时间 2023-12-17 16:16:48

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-10-12

    未缴年费专利权终止 IPC(主分类):G06F17/50 授权公告日:20080402 终止日期:20171019 申请日:20041019

    专利权的终止

  • 2010-12-08

    专利权的转移 IPC(主分类):G06F17/50 变更前: 变更后: 登记生效日:20101101 申请日:20041019

    专利申请权、专利权的转移

  • 2008-04-02

    授权

    授权

  • 2005-09-07

    实质审查的生效

    实质审查的生效

  • 2005-07-13

    公开

    公开

说明书

技术领域

本发明一般涉及设计、模拟和配置数字装置、模块和系统,特别涉及用于采用硬件描述语言(HDL)模型描述的数字装置、模块和系统的计算机辅助设计、模拟和配置的方法和系统。

背景技术

在典型数字设计过程中,验证数字设计的逻辑正确性和对设计进行调试(必要时)是在开发电路布局之前所执行的设计过程的重要步骤。虽然的确有可能通过实际构建数字设计来测试数字设计,但是数字设计特别是采用集成电路实现的那些数字设计典型地通过在计算机上模拟数字设计来验证和调试,这是部分由于集成电路制造所需的时间和开支。

在典型自动设计过程中,电路设计者利用诸如VHDL的硬件描述语言(HDL)使模拟数字设计的高层描述进入电子计算机辅助设计(ECAD)系统,从而产生各种电路块及其互连的数字表示。在该数字表示中,总体电路设计频繁地分成经常由不同设计者单独设计的较小部分,以下将其称作设计实体,然后以分层方式对其进行组合以创建总体模型。该分层设计技术非常有用于管理总体设计的庞大复杂性并且有助于模拟期间的错误检测。

ECAD系统将设计的数字表示编译成具有最适于模拟的格式的模拟模型。然后,模拟器执行该模拟模型以检测数字设计中的逻辑错误。

模拟器典型地是通过施加一系列代表数字系统输入的输入激励而工作于模拟模型上的软件工具。模拟器产生对输入激励的电路响应的数值表示,然后,该响应可作为一系列值在显示屏幕上进行查看,或者经常由不同软件程序作进一步的解释并且以图形形式呈现在显示屏幕上。模拟器可运行于通用计算机或专门设计成用于模拟的其他电子设备上。在通用计算机上完全采用软件运行的模拟器称作“软件模拟器”,并且在专门设计的电子设备的帮助下运行的模拟器称作“硬件模拟器”。

随着数字设计变得日益复杂,通常在若干抽象层次例如功能、逻辑和电路层次上模拟数字设计。在功能层次上,系统操作是按照寄存器、加法器、存储器和其他功能单元之间的事务序列来描述的。功能层次上的模拟用来验证数字系统的高层设计。在逻辑层次上,数字系统是按照逻辑元件如逻辑门和触发器来描述的。逻辑层次上的模拟用来验证逻辑设计的正确性。在电路层次上,每个逻辑门是按照其电路元器件如晶体管、阻抗、电容和其他这样的器件来描述的。电路层次上的模拟提供有关电压电平和开关速度的详细信息。

为了验证任何给定模拟运行的结果,采用高级语言如C或C++编写的定制开发的程序被编写,以处理输入激励(也称作测试向量)以产生模拟运行的预期结果,其中该程序称作参考模型。然后,由模拟器对照模拟执行模型运行测试向量。然后,将模拟运行结果与通过参考模型预测的结果进行比较,以检测被标志为错误的差异。该模拟检查在验证技术领域内称作“端到端”检查。

在现代数据处理系统尤其是大型服务器类计算机系统中,必须被装载以配置系统进行操作(或模拟)的锁存器数目大幅增加。配置锁存器增加的一个原因是很多芯片被设计成支持多个不同配置和操作模式,以便提高制造商利润率以及简化系统设计。例如,存储器控制器通常需要大量配置信息,以与不同类型、大小和操作频率的存储卡正确地接口。

配置锁存器增加的第二原因是处理器和其他集成电路芯片内日益增加的晶体管预算(budget)。经常地,下一代芯片内可用的附加晶体管专用于现有功能单元的复制副本以便改善容错性和并行性。然而,由于经由芯片内连线的传输延迟不与功能逻辑的操作频率的提高成正比地减小,因此集中所有类似功能单元的配置锁存器通常被视作是不期望的。因此,即使复制功能单元的所有实例被频繁地进行相同配置,每个实例往往还是采用其自己的配置锁存器副本来设计。这样,配置仅有一些有效值的操作参数(例如,总线时钟频率和处理器时钟频率之间的比率)可涉及设置处理器芯片中数百个配置锁存器。

传统地,配置锁存器及其容许范围值是通过创建和维护繁琐且易于出错的纸件文档来指定的。维护准确配置文档的困难和设置配置锁存器所需的努力结合在一起造成的事实是一家公司内的不同部门(例如,功能模拟组、实验调试组以及一个或多个客户固件组)经常根据配置文档单独开发配置软件。由于配置软件是由每个部门单独开发的,因此每个组可能引入其自己的错误,并且采用其自己的术语和命名约定。因此,由不同组开发的配置软件不兼容,并且不能容易地在不同组之间共享。

除了开发配置代码过程中的前述缺点之外,传统配置软件的编码也是极其繁琐的。具体地说,用来对各个配置比特进行建档的词汇表经常是相当麻烦。例如,在至少一些实现中,配置代码必须为每个配置锁存器比特指定完整的锁存器名称,其可包括五十个或更多ASCII字符。另外,必须单独指定每个配置锁存器组的有效二进制比特模式。

有鉴于此,本发明认识到提供一种配置采用HDL模型描述的数字系统的改进式方法,特别是允许以具有合理数量输入的逻辑方式指定配置信息、然后在涉及数字系统的设计、模拟和商业实现的各个组织部门之间共享该配置信息的改进式方法将是有用和所期望的。

发明内容

公开了用于指定数字系统如集成电路或互连集成电路的集合的配置的改进式方法、系统和程序产品。根据一种方法,在至少一个硬件定义语言(HDL)文件中指定至少一个包含数字系统的功能部分的设计实体。设计实体在逻辑上包含具有多个不同可能配置值的配置锁存器,其中每个不同可能配置值各自对应于数字系统的功能部分的不同配置。采用HDL文件中的语句,将Dial(标度盘)实体与至少一个设计实体相关联。Dial具有Dial输入、Dial输出、映射表、阶段ID和多个可能输入值中的缺省输入值,其中映射表表示可在Dial输入上接收的多个可能输入值的每一个与Dial输出的各个对应输出值之间的映射。Dial实体的输出值控制不同可能配置值中的哪一个被装载在配置锁存器中,并且阶段ID表示要施加缺省输入值的阶段。

本发明的所有目的、特性和优点在下面详细书面描述中将会变得清楚。

附图说明

被认为是本发明特征的新颖特性在所附权利要求中进行阐述。然而,通过参照下面结合附图阅读时对说明性实施例的详细描述,本发明以及优选使用方式将会得到最佳的理解,其中:

图1是可用来实现本发明的数据处理系统的高层方框图;

图2是采用HDL代码描述的设计实体的图示;

图3示出包括多个分层安排的设计实体的示例性数字设计;

图4A示出根据本发明的包括嵌入配置指定语句的示例性HDL文件;

图4B示出根据本发明的包括嵌入配置文件引用语句的示例性HDL文件,其中嵌入配置文件引用语句引用包含配置指定语句的外部配置文件;

图5A是根据本发明的LDial原语(primitive)的图示;

图5B示出根据本发明的包括多个分层安排的设计实体的示例性数字设计,其中LDial被实例化;

图5C示出包括多个分层安排的设计实体的示例性数字设计,其中LDial用来在设计分层结构的多个不同层次上配置信号状态;

图5D是根据本发明的开关的图示;

图6A是根据本发明的IDial的图示;

图6B是根据本发明具有分裂(split)输出的IDial的图示;

图7A是根据本发明用来控制其他Dial的CDial的图示;

图7B示出包括多个分层安排的设计实体的示例性数字设计,其中采用CDial来控制用来配置信号状态的低层Dial;

图8是根据本发明用来产生模拟可执行模型和关联模拟配置数据库的模型构建过程的高层流程图;

图9A示出数字设计的一部分,其示出由配置编译器实现的回溯(traceback)过程检测配置信号与关联配置锁存器之间的信号路径中的反相器的方式;

图9B是根据本发明优选实施例,由配置编译器实现的示例性回溯过程的高层流程图;

图10是根据本发明优选实施例,配置编译器解析配置指定语句内的每个信号或Dial标识的示例性方法的高层逻辑流程图;

图11A示出Dial组的图示;

图11B示出包括以多个分层安排的Dial组编组的Dial的示例性模拟模型;

图12示出根据本发明的模拟配置数据库的示例性实施例;

图13是根据本发明在数据处理系统的易失性存储器内展开(expand)配置数据库的说明性方法的高层逻辑流程图;

图14是示出根据本发明的模拟模型的模拟运行期间易失性系统存储器的内容的方框图;

图15是在API调用中所提供的实例限定符和Dial名称(dialname)限定符所标识的配置数据库中定位一个或多个Dial实例数据结构(DIDS)的示例性方法的高层逻辑流程图;

图16A是根据本发明在数字设计模拟期间在交互模式中读取Dial实例的说明性方法的高层逻辑流程图;

图16B是根据本发明在数字设计模拟期间在交互模式中读取Dial组实例的示例性方法的高层逻辑流程图;

图17A是根据本发明在数字设计模拟期间在交互模式中设置Dial实例的说明性方法的高层逻辑流程图;

图17B是根据本发明在数字设计模拟期间在交互模式中设置Dial组实例的示例性方法的高层逻辑流程图;

图18A是根据本发明在数字设计模拟期间在批模式中设置Dial实例或Dial组实例的说明性方法的高层逻辑流程图;

图18B是在图18A所示的过程内调用的end_phase API的更详细流程图;

图18C是数据处理系统环境的方框图,其中可利用程序来访问和修改配置数据库,以便指定施加缺省值的阶段;

图19是示出根据本发明的示例性实验测试系统的方框图;

图20是形成图19的实验测试系统的一部分的数据处理系统内的集成电路芯片的更详细方框图;

图21是用于转换模拟配置数据库以获得适用于配置数字设计的硬件实现的芯片硬件数据库的说明性过程的高层流程图;

图22A是根据本发明转换配置数据库以获得芯片硬件数据库的示例性方法的高层逻辑流程图;

图22B示出图22A所示的转换过程之后,芯片硬件数据库内的锁存器数据结构的说明性实施例;

图23A是将硬件配置数据库从非易失性存储装置装载到易失性存储器中的示例性方法的高层逻辑流程图,该方法支持与任意大小或配置的数字系统一起使用硬件配置数据库;

图23B示出根据本发明一个实施例的数字系统的硬件配置数据库的示例性实施例;

图24是通过参考硬件配置数据库来识别与API调用相关的数字系统中的一个或多个Dial实例或Dial组实例的示例性方法的高层逻辑流程图;

图25是在系统固件的实验开发和测试期间所开发的硬件配置数据库可被压缩以进行商业实施的示例性过程的高层逻辑流程图;

图26A-26C一起形成根据本发明利用软件压缩工具压缩硬件配置数据库的说明性方法的高层逻辑流程图;

图27是根据本发明包括Dial和只读Dial的示例性配置数据库的内容的图示;

图28A-28B分别示出根据本发明一个实施例在配置数据库的Dial实例数据结构和锁存器数据结构内包括只读父(parent)字段以便支持只读Dial和只读Dial组;

图29是将包含RDial和/或RDial组的配置数据库展开到易失性存储器中的示例性方法的高层逻辑流程图;

图30是根据本发明用于分析硬件系统的选定状态特别是硬件系统的故障状态的示例性过程的高层流程图;以及

图31是根据本发明的图30的芯片分析器工具生成用来分析硬件故障的芯片配置报告和模拟设置文件的示例性方法的高层逻辑流程图。

具体实施方式

本发明介绍了一种用于配置和控制数字系统(例如,一个或多个集成电路或其模拟模型)的设置的配置指定语言及关联方法、系统和程序产品。在至少一个实施例中,由负责关联设计实体的设计者采用HDL代码创建数字系统中信号的配置规范。因此,能够最佳指定信号名称和关联合法值的、处于设计过程前端的设计者负责创建配置规范。配置规范在模型构建时候与描述数字系统的HDL一起被编译,以获得配置数据库,然后该配置数据库可被涉及设计、模拟和硬件实现过程的下游组织小组利用。

现在参照附图特别是附图1,示出了根据本发明的数据处理系统的示例性实施例。所示实施例可被实现为例如工作站、服务器或大型计算机。

如图所示,数据处理系统6包括一个或多个处理节点8a-8n,如果实现了多于一个处理节点8,则这些节点通过节点互连22来互连。处理节点8a-8n的每一个均可包括一个或多个处理器10、局部互连16和通过存储器控制器17访问的系统存储器18。处理器10a-10m最好(但不一定)相同,并且可包括可从NewYork,Armonk的国际商业机器(IBM)公司获得的PowerPCTM处理器产品线内的处理器。除了在总体上表示为处理器核心12的寄存器、指令流逻辑电路和用来执行程序指令的执行单元之外,处理器10a-10m中的每一个还包括芯片内高速缓冲存储器分层结构,其用来将数据从系统存储器18分级(stage)到关联处理器核心12。

处理节点8a-8n中的每一个还包括各自的节点控制器20,其耦合于局部互连16与节点互连22之间。每个节点控制器20通过执行至少两个功能来作为远程处理节点8的本地代理。第一,每个节点控制器20侦测(snoop)关联局部互连16并且帮助将本地通信事务发送到远程处理节点8。第二,每个节点控制器20侦测节点互连22上的通信事务,并且控制关联局部互连16上的相关通信事务。每个局部互连16上的通信由仲裁器24进行控制。仲裁器24根据由处理器10产生的总线请求信号来管理对局部互连16的访问,并且编译对局部互连16上所侦测的通信事务的一致性响应。

局部互连16通过夹层(mezzanine)总线桥26耦合于夹层总线30。夹层总线桥26提供低延迟路径和高带宽路径,其中处理器10通过该低延迟路径可直接访问映射到总线存储器和/或I/O地址空间的存储装置34以及I/O装置32中的装置,并且I/O装置32和存储装置34通过该高带宽路径可访问系统存储器18。I/O装置32可包括例如显示装置、键盘、图形指示器以及用于连接到外部网络或所连装置的串行和并行端口。存储装置34可包括例如为操作系统、中间件和应用软件提供非易失性存储的光盘或磁盘。在本实施例中,该应用软件包括ECAD系统35,其可用来开发、验证和模拟根据本发明方法和系统的数字电路设计。

利用ECAD系统35创建的模拟数字电路设计模型包括至少一个并且通常是多个的子单元,这些子单元在下面将被称作设计实体。现在参照图2,示出了可利用ECAD系统35创建的示例性设计实体200的方框图。设计实体200由以下多个组件定义:实体名称、实体端口和由设计实体200执行的功能的表示。给定模型内的每个设计实体具有唯一实体名称(图2中未显式示出),其在设计实体的HDL描述中进行声明。而且,每个设计实体典型地包含多个与设计实体之外的信号的信号互连,其称作端口。这些外部信号可以是总体设计的主输入/输出(I/O)或者连接到总体设计内其他设计实体的信号。

典型地,端口被分类为属于以下三种不同类型之一:输入端口、输出端口和双向端口。设计实体200被示出为具有多个将信号传入设计实体200的输入端口202。输入端口202连接到输入信号204。另外,设计实体200包括多个将信号传出设计实体200的输出端口206。输出端口206连接到一组输出信号208。双向端口210用来将信号传入和传出设计实体200。双向端口210依次连接到一组双向信号212。设计实体如设计实体200无需包含所有三种类型的端口,并且在退化的情况下根本不包含端口。为了实现实体端口与外部信号的连接,利用称作“端口映射”的映射技术。端口映射(图2中未显式示出)包括实体端口名称与该实体所连接的外部信号之间的指定对应关系。当构建模拟模型时,利用ECAD系统35来根据端口映射规范将外部信号连接到实体的适当端口。

如图2进一步所示,设计实体200包含描述由设计实体200执行的一个或多个功能的主体部分214。在数字设计的情况下,主体部分214包含逻辑门、存储元件等的互连以及其他实体的实例体(instantiation)。通过在另一个实体内实例化实体,实现总体设计的分层描述。例如,微处理器可包含相同功能单元的多个实例。这样,微处理器本身经常将被建模为单个实体。在微处理器实体内,将存在任何重复功能实体的多个实例体。

每个设计实体由包含描述设计实体所需的信息的一个或多个HDL文件指定。虽然本发明不作要求,但是为便于理解起见,下面将假定每个设计实体由各自的HDL文件指定。

现在参照图3,示出了本发明优选实施例中可由ECAD系统35用来表示数字设计(例如,集成电路芯片或计算机系统)的示例性模拟模型300的图示。为了看上去简单明了,未显式示出互连模拟模型300内的设计实体的端口和信号。

模拟模型300包括多个分层安排的设计实体。如同在任何模拟模型内一样,模拟模型300包括一个且仅一个“顶层实体”,其包括模拟模型300内的所有其他实体。也就是说,顶层实体302直接或间接地实例化数字设计内的所有后代实体。具体地说,顶层实体302直接实例化相同定点执行单元(FXU)实体304的两个实例304a和304b以及浮点单元(FPU)实体314的单个实例(也就是,顶层实体302是这些实例的直接祖先)。分别具有实例体名称FXU0和FXU1的FXU实体实例304又实例化另外的设计实体,包括分别具有实例体名称A0和A1的实体A 306的多个实例体。

设计实体的每个实例体具有包含实体名称和实例体名称的关联描述,该描述在直接祖先实体的所有后代中必须是唯一的。例如,顶层实体302具有包括实体名称322(即冒号之前的“TOP”),并且还包括实例体名称324(即,冒号之后的“TOP”)的描述320。在实体描述内,当特定实体的仅一个实例在祖先实体内被实例化时,让实体名称匹配实例体名称是常见的。例如,在FXU实体的实例体304a和304b的每一个内实例化的实体B 310和实体C 312的单个实例具有匹配的实体和实例体名称。然而,本发明不要求该命名约定,如FPU实体314所示(即,实例体名称为FPU0,而实体名称为FPU)。

倘若单实例化或多实例化的所有实体具有唯一实体名称并且任何直接祖先实体内的所有后代实体的实例体名称相互唯一,则数字设计中的其他实体内的实体嵌套可以继续至任意复杂层次。

与每个设计实体实例体相关联的是所谓的“实例体标识符”。给定实例体的实例体标识符是包括从顶层实体实例体名称开始的封闭实体实例体名称的字符串。例如,FXU实体304的实例体304a内的实体C 312的实例体312a的设计实例体标识符为“TOP.FXU0.B.C”。该实例体标识符用来唯一标识模拟模型内的每个实例体。

如上所述,不管是利用物理集成电路还是作为软件模型如模拟模型300来实现,数字设计都典型地包括用来配置数字设计以执行适当操作的配置锁存器。与采用在实现设计之后创建的独立配置软件将值装载到配置锁存器中的现有技术设计方法不同,本发明引入了一种允许数字设计者指定信号的配置值作为设计过程的自然部分的配置指定语言。具体地说,本发明的配置指定语言允许利用嵌入在指定数字设计的一个或多个HDL文件中的语句(如图4A所示)或者嵌入在由指定数字设计的一个或多个HDL文件引用的一个或多个外部配置文件中的语句(如图4B所示)指定设计配置。

现在参照图4A,示出了根据本发明的示例性HDL文件400,在本例中为VHDL文件,其包括嵌入的配置语句。在本例中,HDL文件400指定模拟模型300的实体A 306,并且包括三个VHDL代码部分,即指定端口202、206和210的端口列表402、指定主体部分214内的信号的信号声明404以及指定主体部分214的逻辑和功能性的设计指定406。散布在这些部分之内的是以开头双划符号(“--”)表示的传统VHDL注释。另外,嵌入在设计指定406内的是根据本发明的一个或多个配置指定语句,它们共同地由附图标记408和410来表示。如图所示,这些配置指定语句采用以“--##”开头的特殊注释形式来编写,以便允许编译器容易地区分配置指定语句与传统HDL代码和HDL注释。配置指定语句最好采用不区分大小写和空白的语法。

现在参照图4B,示出了根据本发明的示例性HDL文件400’,其包括对包含一个或多个配置指定语句的外部配置文件的引用。如撇号(’)所示,除了配置指定语句408、410被更替为一个或多个(在本例中仅为一个)引用包含配置指定语句408、410的独立配置文件414的配置文件引用语句412之外,HDL文件400’在各个方面都相同于HDL文件400。

配置文件引用语句412如同图4A所示的嵌入配置指定语句一样,通过标识符“--##”被标识为配置语句。配置文件引用语句412包括指令(directive)“cfg_file”,其指示编译器定位独立配置文件414和该配置文件的文件名(即“file00”)。配置文件如配置文件412最好全采用选定文件名扩展(例如,“.cfg”),以便可以容易地在数据处理系统6所采用的文件系统内定位、组织和管理它们。

如下面参照图8进一步所述,不管是嵌入在HDL文件内还是集中在一个或多个配置文件414中,配置指定语句与关联HDL文件一起由编译器进行处理。

根据本发明的优选实施例,诸如配置指定语句(configuration specificationstatement)408、410的配置指定语句通过实例化这里统称为“Dial(标度盘)”的配置实体的一个或多个实例,来帮助配置数字设计内的配置锁存器。Dial的功能是在输入值与一个或多个输出值之间进行映射。一般而言,该输出值最终直接或间接地指定配置锁存器的配置值。每个Dial与数字设计中的特定设计实体相关联,该特定设计实体按照惯例是由包含使Dial被实例化的配置指定语句或配置文件引用语句的HDL源文件指定的设计实体。因此,由于其与特定设计实体的关联,其中这些特定设计实体全都具有唯一实例体标识符,所以只要在任何给定设计实体内采用唯一Dial名称,就可唯一标识数字设计内的Dial。应当清楚的是,很多不同类型的Dial可以以锁存器Dial(或“LDial”)开头来定义。

现在参照图5A,示出了示例性LDial 500的表示。在该特定例子中,具有名称“bus ratio(总线比率)”的LDial 500用来根据表示组件时钟频率与总线时钟频率之间的选定比率的列举输入值,来指定数字设计内的配置锁存器的值。

如图所示,LDial 500如同所有Dial一样在逻辑上具有单个输入502、一个或多个输出504以及将每个输入值映射到各自关联的每个输出504的输出值的映射表503。也就是,映射表503指定一个或多个唯一输入值的每一个与各自关联的唯一输出值之间的一一映射。由于LDial的功能是指定配置锁存器的合法值,因此LDial 500的每个输出504在逻辑上控制装载到各个配置锁存器505中的值。为了防止冲突配置,每个配置锁存器505由一个且仅一个能够设置配置锁存器505的任何类型的Dial直接指定。

在输入502,LDial 500接收包括“2:1”、“3:1”和“4:1”的一组合法值中的列举输入值(即,字符串)。列举输入值可采用软件(例如,通过软件模拟器或服务处理器固件)来直接提供,或者可由另一个Dial的输出来提供,如下面参照图7A进一步所述。对于每个列举输入值,LDial 500的映射表503表示每个配置锁存器505的选定二进制值(即“0”或“1”)。

现在参照图5B,示出了在逻辑上包括Dial的模拟模型的图示。图5B中如撇号所示的模拟模型300’包括以与图3的模拟模型300相同的分层关系安排的相同设计实体,该模拟模型300’示出Dial的两个特性,即复制(replication)和范围。

复制是每次实例化关联设计实体时自动实例化在设计实体的HDL文件中指定或者由其引用的Dial的过程。复制有利地减少了设计者为了创建Dial的多个相同实例而需要执行的数据输入量。例如,为了实例化图5B所示的LDial的六个实例,设计者只需利用图4A和4B所示的两种技术中的任一种对两个LDial配置指定语句进行编码。也就是,设计者将第一LDial配置指定语句(或指向关联配置文件的配置文件引用语句)编码到设计实体A 306的HDL文件中,以便分别自动实例化实体A的实例体306a0、306a1、306b0和306b1内的LDial 506a0、506a1、506b0和506b1。设计者将第二LDial配置指定语句(或指向关联配置文件的配置文件引用语句)编码到设计实体FXU304的HDL文件中,以便分别自动实例化FXU实体的实例体304a和304b内的LDial 510a和510b。然后,当编译器复制关联设计实体时,自动创建LDial的多个实例。与设计者必须手工地在配置软件中单独列举每个配置锁存器值的现有技术方法相比,在数字设计内复制Dial可以因此大大减轻设计者的输入负担。应当注意的是,复制特性不一定要求Dial的所有实例来生成相同的输出值;相同Dial的不同实例可通过向它们提供不同输入而被设置成生成不同输出。

Dial的“范围”在此被定义为Dial在其指定中可引用的实体集。按照惯例,Dial的范围包括Dial与其关联的设计实体(即,由包含使Dial被实例化的配置指定语句或配置文件引用语句的HDL源文件指定的设计实体)以及包含在关联设计实体内的任何设计实体(即,关联设计实体及其后代)。因此,Dial不受限于在其被实例化的设计分层结构层次上工作,而是也能在其范围内的设计分层结构的任何低层上指定配置锁存器。例如,LDial 510a和510b,即使分别与FXU实体的实例体304a和304b相关联,也可分别指定实体C的实例体312a和312b内的配置锁存器。

图5B示出LDial(和直接指定配置锁存器的其他Dial)的另一个重要特性。具体地说,如图5B概要所示,习惯于在HDL文件中指定信号的设计者被允许在配置指定语句中指定由Dial设置的信号状态而非要装载到确定信号状态的“上游”配置锁存器中的值。因此,在指定LDial 506中,设计者可为由配置锁存器512设置的信号514指定可能的信号状态。类似地,在指定LDial 510中,设计者可为由配置锁存器520设置的信号522指定可能的信号状态。指定信号状态而非锁存器值的能力不仅与设计者思考数字设计的习惯方式一致,而且减少由于配置锁存器512、520和感兴趣信号514、522之间的反相器的存在而引入的可能错误,下面将对此作进一步的讨论。

现在参照图5C,示出了包括LDial的模拟模型的另一个图示。如撇号所示,图5C的模拟模型300”包括以与图3的模拟模型300相同的分层关系安排的相同设计实体。

如图所示,图5C的模拟模型300”包括与顶层设计实体302关联的LDial524。LDial 524指定由各自的配置锁存器512确定的每个信号sig1 514的信号状态,由各自的配置锁存器520确定的每个信号sig2 522的信号状态,由配置锁存器530确定的信号sig4 532的信号状态,以及由配置锁存器534确定的信号sig3 536的信号状态。因此,LDial 524配置众多不同信号的信号状态,其全都在LDial 524(位于顶层)的分层结构层次或者其下被实例化。

如上面参照图4A和4B所述,通过在顶层实体302的HDL文件中嵌入指定LDial 524的配置指定语句或者引用包含指定LDial 524的配置指定语句的独立配置文件的配置文件引用语句,在模拟模型300”的顶层实体302内实例化LDial 524。在任何情况下,LDial 524的示例性配置指定语句如下所示:

LDial bus ratio(FXU0.A0.SIG1,FXU0.A1.SIG1,

                FXU0.B.C.SIG2(0..5),

                FXU1.A0.SIG1,FXU1.A1.SIG1,

                FXU1.B.C.SIG2(0..5),

                FPU0.SIG3,SIG4(0..3)

                )=

                {2:1=>0b0,0b0,0x00,

                        0b0,0b0,0x00,

                        0b0,0x0;

                 3:1=>0b1,0b1,0x01,

                        0b1,0b1,0x01,

                        0b0,0x1;

                 4:1=>0b1,0b1,0x3F,

                        0b1,0b1,0x3F,

                        0b1,0xF

               };

上面给出的示例性配置指定语句开始于关键字“LDial”,其指定所声明的Dial的类型为LDial,以及在本例中为“bus ratio(总线比率)”的Dial名称。下一步,该配置指定语句列举其状态由LDial控制的信号名称。如上所示,每个信号的信号标识符相对于关联设计实体的缺省范围以分层方式指定(例如,对于信号514a0为FXU0.A0.SIG1),使得具有相同信号名称的不同信号实例是可区分的。在列举信号标识符之后,该配置指定语句包括列出LDial的容许列举输入值和每个列举输入值的对应信号值的映射表。这些信号值通过声明信号名称的次序隐式地与信号名称相关联。再次应当注意的是,为所有列举值指定的信号状态是唯一的,并且共同表示信号状态的仅有合法模式。

可以采用若干不同语法来指定信号状态。在上面给出的例子中,以指定具有前缀“0b”的二进制常数的二进制格式或者指定具有前缀“0x”的十六进制常数的十六进制格式来指定信号状态。虽然未示出,信号状态也可以采用整数格式来指定,在这种情况下,不采用前缀。为了便于数据输入起见,ECAD系统35的配置指定语言最好还支持串接语法,其中采用自动地以起始零扩展的一个常数值来表示所有期望信号值的串接。采用该串接语法,为了将列举输入值2:1与所有零的串接比特模式相关联,以将列举输入值3:1与‘0b110000011100000100001’串接比特模式相关联,以及将列举输入值4:1与所有1的串接比特模式相关联,上面给出的配置指定语句可以被改写成:

             {2:1=>0,

              3:1=>0x183821,

              4:1=>0x1FFFFF

             };

现在参照图5D,示出了具有一个比特输出的LDial的特殊情况的图示,这里该LDial被定义为开关(Switch)。如图所示,开关540具有单个输入502、控制配置锁存器505的设置的单个1比特输出504、以及将可以在输入502接收的每个列举输入值映射到在输出504驱动的1比特输出值的映射表503。

由于开关频繁地包括在数字设计中采用的Dial的绝大部分,因此如果数字设计模拟模型中所有开关的列举值集合是相同的(例如,“导通”/“关断”),则是最好的。在开关的典型实施例中,“正”列举输入值(例如,“导通”)通过映射表503映射到0b1的输出值,并且“负”列举输入值(例如,“关断”)映射到0b0的输出值。为了帮助使用相反极性的逻辑,最好还支持负开关或NSwitch声明,其在映射表503中使输入值与输出值之间的该缺省对应关系相反。

定义开关原语(Switch primitive)的主要优点是减少设计者的所需输入量。具体地说,为了指定可比较的1比特LDial,将要求设计者输入下面形式的配置指定语句:

LDial mode(signal)=

      {ON=>b1;

       OFF=>b0

      };

另一方面,执行相同功能的开关可以采用以下配置指定语句来指定:

Switch mode(signal);

虽然当仅考虑单个开关时通过使用开关所消除的数据输入量不是特别显著,但是当考虑复杂数字设计中数千个开关时,总的数据输入减少是显著的。

现在参照图6A,示出了根据本发明优选实施例的整数Dial(“IDial”)的图示。如同LDial一样,IDial通过在映射表603内表示在输入602接收的每个输入值与每个输出604的输出值之间的对应关系,直接指定装载到一个或多个配置锁存器605的每一个中的值。然而,不同于只能接收在其映射表503中显式列出的列举输入值作为合法输入值的LDial,IDial的合法输入值集合包括输出604的比特大小内的所有可能整数值。(包含比输出604的比特大小少的比特的输入整数值向右对齐,并且以零进行扩展以填充所有可用比特)。由于在映射表603中列举所有可能整数输入值是不便且繁琐的,因此映射表603简单地表示在输入602接收的整数输入值被施加于一个或多个输出604的方式。

IDial在理想上适于一个或多个多比特寄存器必须被初始化并且合法值的数目包括寄存器的大多数值的应用。例如,如果包括4个配置锁存器的4比特配置寄存器和包括11个配置锁存器的11比特配置寄存器都被配置成利用LDial,则设计者将必须在LDial的映射表中显式列举高达215个输入值和对应的输出比特模式。这种情况通过利用下面配置指定语句的IDial来处理则简单得多:

        IDial cnt_value(sig1(0..3),sig2(0..10));

在上述配置指定语句中,“IDial”声明配置实体为IDial,“cnt_value”是IDial的名称,“sig1”是4比特配置寄存器的4比特信号输出,并且“sig2”是耦合于11比特配置寄存器的11比特信号。另外,与sig1和sig2的每一个相关联的比特的排序和数目表示整数输入值的4个高位比特将用来配置与sig1相关联的4比特配置寄存器,并且11个低位比特将用来配置与sig2相关联的11比特配置寄存器。重要的是,虽然映射表603表示整数输入值的哪些比特路由(route)到哪些输出,但是在映射表603中没有输入值与输出值之间的显式对应关系。

IDial还可用来为多个复制配置寄存器指定相同值,如图6B所示。在所示实施例中,可被描述为IDial“splitter(分裂器)”的IDial 610指定每个均包括基于单个15比特整数输入值的15个配置锁存器605的三组复制配置寄存器的配置。用于实例化IDial 610的示例性配置指定语句可以如下给出:

IDial cnt_value(A0.sig1(0..7),A0.sig2(8..14);

             A1.sig1(0..7),A1.sig2(8..14);

             A3.sig1(0..7),A3.sig2(8..14)

             );

在上面配置指定语句中,“IDial”声明配置实体为IDial,并且“cnt_value”是IDial的名称。在IDial名称之后是以分号(“;”)隔开的三个范围字段。每个范围字段表示输入整数值的比特如何被施加于特定信号。例如,第一范围字段指定整数输入值的8个高位比特将用来配置与信号A0.sig1相关联的8比特配置寄存器,并且7个低位比特将用来配置与A0.sig2相关联的7比特配置寄存器。第二和第三范围字段指定设计实体A1和A3内的相应配置寄存器将被类似地配置。重要的是,只要在每个范围字段中指定的总比特数相同,就可在每个范围字段中不同地分配整数输入比特。

虽然数字设计的配置可以单独利用LDial或者利用LDial和IDial来完全指定,但是在很多情况下,这样做将是低效且不便的。具体地说,对于如图5C所示的分层数字设计,单独使用LDial和/或IDial将强迫很多Dial到设计分层结构的高层,从组织的观点,其可能是负责包含由Dial控制的配置锁存器的设计实体的不同设计者或者设计组的职责。这样,配置锁存器的正确配置将不仅要求设计组之间的重大组织协调,还要求负责数字设计高层的设计者了解并且在他们的HDL文件内包括有关低层设计实体的配置的细节。而且,在分层结构的高层实现Dial意味着不能独立模拟分层结构的低层,因为控制低层设计实体的配置的Dial没有包含在低层设计实体本身内。

鉴于前述情况,本发明认识到提供支持Dial的分层组合以允许通过低层Dial配置设计分层结构的低层,并且通过一个或多个高层Dial控制低层Dial的效用。本发明的配置指定语言把控制一个或多个低层Dial的高层Dial称作控制Dial(“CDial”)。

现在参照图7A,示出了根据本发明的CDial 700a的图示。CDial 700a如同所有Dial一样,最好具有单个输入702、一个或多个输出704以及将每个输入值映射到各自关联的每个输出704的输出值的映射表703。不同于直接指定配置锁存器的LDial和IDial,CDial 700不直接指定配置锁存器。相反,CDial 700控制以n路“Dial树”在逻辑上耦合于CDial 700的一个或多个其他Dial(即CDial和/或LDial和/或IDial),其中每个低层Dial形成“分支”的至少一部分,其最终终止于配置锁存器的“叶子”。Dial树最好构造成在任何Dial树中没有Dial被实例化二次。

在图7A给出的示例性实施例中,CDial 700a在输入702接收包括“A”、...、“N”的一组合法值中的列举输入值(即字符串)。如果CDial 700a(或LDial或IDial)是顶层Dial(即,在Dial树中在其“之上”没有Dial),则CDial700a直接从软件(例如,模拟软件或固件)接收列举输入值。或者,如果CDial700a形成Dial树的“分支”的一部分,则CDial 700a从另一个CDial的输出接收列举输入值。对于可在输入702接收的每个合法列举输入值,CDial 700a在映射表703中为每个所连接的Dial(例如,Dial 700b、500和600)指定选定列举值或比特值。与每个输出704相关联的映射表703中的值根据耦合于输出704的低层Dial的类型由ECAD系统35进行解释。也就是,为LDial和CDial指定的值被解释为列举值,而为IDial指定的值被解释为整数值。采用这些值,Dial 700b、500和600的每一个最终直接或间接指定一个或多个配置锁存器705的值。

现在参照图7B,示出了包含Dial树的模拟模型的另一个图示,其中Dial树包括控制多个低层LDial的顶层CDial。如撇号所示,图7B的模拟模型300包括以与图3的模拟模型300相同的分层关系安排的相同设计实体,并且包含与图5C的模拟模型300”相同的配置锁存器和关联信号。

如图所示,图7B的模拟模型300包括与顶层设计实体302相关联的顶层CDial 710。模拟模型300还包括四个LDial 712a,712b,714和716。与实体实例体A0 304a相关联的LDial 712a控制由各自配置文件512a确定的每个信号sig1 514a的信号状态,以及由配置锁存器520a确定的信号sig2 522a的信号状态。与实体实例体A1 304b相关联的、作为LDial 712a复制物的LDial712b类似地控制由各自配置锁存器512b确定的每个信号sig1 514b的信号状态,以及由配置锁存器520b确定的信号sig2 522b的信号状态。与顶层实体302相关联的LDial 714控制由配置锁存器530确定的信号sig4 532的信号状态。最后,与实体实例体FPU0 314相关联的LDial 716控制由配置锁存器534确定的信号sig3 536的信号状态。这四个LDial的每一个由与顶层实体302相关联的CDial 710进行控制。

如上面参照图4A和4B所述,图7B所示的CDial 710和四个LDial的每一个都通过在关联设计实体的HDL文件内嵌入配置指定语句(或者指向包含配置指定语句的配置文件的配置文件引用语句)在关联设计实体内被实例化。用来实例化图7B所示的每个Dial的示例性配置指定语句如下给出:

CDial BusRatio(FXU0.BUSRATIO,FXU1.BUSRATIO,FPU0.BUSRATIO,

                  BUSRATIO)=

               {2:1=>2:1,2:1,2:1,2:1;

                3:1=>3:1,3:1,3:1,3:1;

                4:1=>4:1,4:1,4:1,4:1

               };

LDial BusRatio(A0.sig1,A1.sig1,B.C.sig2(0..5))=

               {2:1=>0b0,0b0,0x00;

                3:1=>0b1,0b1,0x01;

                4:1=>0b1,0b1,0x3F;

               };

LDial BusRatio(sig3)=

               {2:1=>0b0;

                3:1=>0b0;

                4:1=>0b1

               };

LDial BusRatio(sig4(0..3))=

               {2:1=>0x0;

                3:1=>0x1;

                4:1=>0xF

               };

通过以这种方式实现分层Dial树,实现了若干优点。第一,由于FXU实体实例体304a和304b内LDial 712的自动复制允许仅输入一次指定LDial712的代码,因此减少了必须输入的软件代码量。第二,通过允许每个设计者(或设计组)指定他所负责的设计实体内的信号配置,遵守设计过程的组织界限。第三,高层Dial(即CDial 710)的编码被大大简化,从而降低了错误的可能性。因此,例如,紧邻之上指定的CDial和LDial集合执行与上面参照图5C指定的“大”LDial相同的功能,但是在任何一个Dial中复杂性大大降低。

很多Dial,例如用来在检测到不可纠正的错误的情况下禁用特定设计实体的开关,在几乎所有情形中都具有Dial应当具有的特定输入值。对于这样的Dial,本发明的配置指定语言允许设计者显式地在配置指定语句中指定Dial的缺省输入值。在示例性实施例中,通过在Dial的指定之后和结束分号之前包括“=缺省值”来指定缺省值。例如,CDial的缺省值可以如下给出:

CDial BusRatio(FXU0.BUSRATIO,FXU1.BUSRATIO,FPU0.BUSRATIO,

                  BUSRATIO)=

               {2:1=>2:1,2:1,2:1,2:1;

                3:1=>3:1,3:1,3:1,3:1;

                4:1=>4:1,4:1,4:1,4:1

               }=2:1;

应当注意的是,对于CDial和LDial,要求指定的缺省值是一般(即,除了开关之外)列在映射表中的合法列举值之一。对于开关,缺省值必须是预定义的列举值“导通”和“关断”之一。

IDial的缺省值可以类似地如下指定:

IDial cnt_value(A0.sig1(0..7),A0.sig2(8..14);

                A1.sig1(0..7),A1.sig2(8..14);

                A3.sig1(0..7),A3.sig2(8..14)

                )=0x7FFF;

在这种情况下,可采用十六进制、十进制或二进制格式给出的常数提供由IDial控制的每个信号的缺省输出值。为了将指定常数施加于所表示的信号,根据需要删截高位比特或者向其填充零。

本发明的配置指定语言还允许控制施加特定缺省值的时间。施加缺省值的控制例如在模拟或采用硬件执行集成电路的引导序列中是重要的。在引导序列的初始阶段期间,到集成电路不同部分的时钟信号可以在不同时间启动,从而意味着集成电路不同部分中的锁存器必须根据指定的Dial缺省值在不同时间被装载。

根据本发明,施加缺省值的定时控制通过一个或多个阶段标识符(ID)与缺省值的关联来支持。阶段ID是标注缺省值应当基本上同时被施加的Dial集合的字符串。多个阶段ID可以与特定Dial相关联以增加灵活性。例如,在不同系统配置中,组成集成电路的引导序列可以不同。因此,根据系统配置,在不同阶段期间将缺省值施加于特定Dial可能是有必要或者所期望的。

在一个示例性语法中,一个或多个阶段ID(例如,phaseid0和phaseid1)可以可选地在包含于括号内且位于Dial声明语句中的缺省声明之后的逗号分隔列表中进行指定,如下所示:

CDial BusRatio(FXU0.BUSRATIO,FXU1.BUSRATIO,FPU0.BUSRATIO,

                  BUSRATIO)=

               {2:1=>2:1,2:1,2:1,2:1;

                3:1=>3:1,3:1,3:1,3:1;

                4:1=>4:1,4:1,4:1,4:1

               }=2:1(phaseid0,phaseid1);

为没有指定缺省值的Dial指定阶段ID最好是一个错误,并且如上所述,任何阶段ID的指定最好是完全可选的,如前面给出的示例性CDial和IDial声明所示。

Dial的缺省值的使用遵循多条规则。第一,可以为任何类型的Dial包括LDial、IDial(包括带有分裂输出的IDial)和CDial指定缺省值。最好,对于Dial组(下面参照图11A-11B对其进行讨论),不支持缺省值。第二,如果为多层Dial树中的多个Dial指定缺省值,则仅施加影响Dial树的每个“分支”的最高层缺省值(包括为顶层Dial指定的缺省值),并且若有的话,忽略其余缺省值。尽管存在这条规则,但是为Dial树中的低层Dial指定缺省值也是有益的,因为如上所述在独立模拟模型的较小部分的情况下也可施加缺省值。如果为形成Dial树的“分支”的低层Dial指定的缺省值的组合不对应于为高层Dial设置的合法输出值,则编译器将标志错误。第三,当Dial接收有效设置Dial的输入时,覆盖(override)缺省值。

通过指定Dial的缺省值,设计者通过减少必须显式地为模拟或硬件配置设置的Dial数来大大简化下游组织小组对Dial的使用。另外,如下面进一步所述,缺省值的使用帮助审核哪些Dial已被有效地设置。

除了定义指定Dial的配置指定语句的语法之外,本发明的配置指定语言还支持至少两个附加HDL语义结构:注释和属性指定语句。可具有以下形式的注释:

BusRatio.comment=“总线比率Dial根据选定处理器/互连频率比率配置电路”;

允许设计者将用引号划分的任意字符串与特定Dial名称相关联。如下面参照图8所述,在编译期间处理这些注释,并且将其包括在配置文档文件内,以便说明Dial的功能、关系和适当设置。

属性指定语句是声明属性名称和属性值并且将属性名称与特定Dial名称相关联的语句。例如,属性指定语句可具有以下形式:

BusRatio.attribute(myattribute)=scom57(0:9);

在本例中,“BusRatio.attribute”声明该语句是将属性与具有“BusRatio”作为其Dial名称的Dial相关联的属性指定语句,“myattribute”是属性的名称,并且“scom57(0:9)”是指定属性值的字符串。属性支持定制特性和对基本配置指定语言的语言扩展。

现在参照图8,示出了模型构建过程的高层流程图,其中编译包含配置语句的HDL文件以获得数字设计的模拟可执行模型和模拟配置数据库。该过程开始于一个或多个设计实体HDL源代码文件800,其包括配置指定语句和/或配置文件引用语句,并且可选地包括一个或多个配置指定引用文件802。HDL编译器804处理HDL文件800和配置指定文件(configuration specificationfile)802(若有的话),从模拟模型的顶层实体开始并且以递归方式进入描述完整模拟模型的所有HDL文件800。当HDL编译器804处理每个HDL文件800时,HDL编译器804在存储器内所产生的设计中间文件806中创建“标记”,以标识嵌入在HDL代码以及由嵌入配置文件引用语句引用的任何配置指定文件内的配置语句。

然后,存储器内的设计中间文件806由配置编译器808和模型构建工具810进行处理,以完成模型构建过程。模型构建工具810将设计中间文件806处理成当执行时对数字设计的逻辑功能进行建模的模拟可执行模型816,其中模拟可执行模型816可表示例如集成电路的一部分,整个集成电路或模块,或者包括多个集成电路或模块的数字系统。配置编译器808处理在设计中间文件806中标记的配置指定语句,并且根据这些语句创建配置文档文件812和配置数据库814。

配置文档文件812以可供人阅读的格式列出描述与模拟模型相关联的Dial的信息。该信息包括Dial的名称、其映射表、Dial树的结构(若有的话)、实例信息等。另外,如上所述,配置文档文件812包括包含在描述数字设计中Dial的功能和设置的注释语句中的字符串。以这种方式,适合与数字设计的模拟模型和硬件实现一起使用的配置文档以“自底向上”的方式从负责创建Dial的设计者汇集。配置文档然后变得可用于涉及数字设计的设计、模拟、实验硬件评估和商业硬件实现的所有下游组织小组。

配置数据库814包含与Dial有关的多个数据结构。如下面详细所述,这些数据结构包括描述Dial实体的Dial数据结构、锁存器数据结构和Dial实例数据结构。这些数据结构将特定Dial输入与用来配置数字设计(即,模拟可执行模型816)的特定配置值相关联。在优选实施例中,配置值可按照信号状态或配置锁存器值来指定,并且选择使用哪些值是用户可选的。配置数据库814在利用模拟可执行模型816的数字设计模拟期间,通过应用编程接口(API)例程来访问,并且还用来生成用于配置数字设计的物理实现的类似配置数据库。在优选实施例中,API被设计成只能设置顶层Dial(即,没有CDial在逻辑上位于其“上”的LDial、IDial或CDial),并且可以读取所有Dial值。

如上所述,本发明的配置指定语言有利地允许通过引用信号名称(例如,“sig1”)来指定LDial和IDial的输出值。如上所述,该特性的关键动机是设计者往往是按照将操作信号配置成特定信号状态而不是配置关联配置锁存器来考虑的。然而,实际上,设计者期望将其配置成特定状态的信号可能不直接连接到关联配置锁存器的输出。相反,所要配置的信号可能通过一个或多个中间电路元件如缓冲器和反相器来耦合于关联配置锁存器。不是向设计者施加人工回溯每个可配置信号至关联配置锁存器、然后确定配置锁存器的适当值的负担,配置编译器808自动回溯指定信号至耦合于该信号的第一存储元件(即配置锁存器),并且执行设计者指定的信号状态值的任何必要反相,以获得要装载到配置锁存器中的正确值。

现在参照图9A,示出了包括LDial 900的数字设计的一部分,其中LDial900控制数字设计内多个信号904a-904e的状态。当配置编译器808执行信号904a的回溯时,不需要设计者指定的信号状态的反相,因为信号904a直接连接到配置锁存器902a。因此,配置编译器808将来自LDial 900的配置指定语句的设计者指定值存储到配置数据库814中,作为要装载到配置锁存器902a中的值。信号904b到配置锁存器902b的回溯类似地不导致来自LDial900的配置指定语句的设计者指定值的反相,因为信号904b与配置寄存器902b之间的唯一中介元件是非反相缓冲器906。

配置锁存器如配置锁存器902c和902d通过在HDL文件800中包括引用HDL设计库中的锁存器原语的HDL语句而被设计者频繁地实例化。响应该HDL库引用而插入到模拟可执行模型中的锁存器实体903a、903b可以包括在HDL代码中不对设计者显式“可见”的反相器,如反相器908、910。但是,由配置编译器808执行的自动回溯检测这些反相器,从而防止可能的配置错误。

因此,当执行信号904c的回溯时,由于信号904c与配置锁存器902c之间存在反相器908,因此配置编译器808在将配置锁存器902c的配置值存储在配置数据库814中之前,自动反相为信号904c指定的设计者指定配置值。然而,当配置编译器808执行信号904d的回溯时,尽管在信号路径中存在反相器910、914和缓冲器912,由于逻辑合在一起是非反相的,因此配置编译器808不反相设计者指定的信号状态值。应当注意的是,配置编译器808可以准确地处理“隐藏”的反相器如反相器910和显式声明的反相器如反相器914。

图9A最后示出通过中间与门916耦合于多个配置锁存器902e和902f的信号904e。在回溯过程检测出指定信号与最近配置锁存器之间的扇出(fanout)逻辑的情况下,配置编译器808有可能根据信号904e的设计者指定信号状态值,为配置锁存器902e、902f生成适当的配置值。然而,如果配置编译器808标志出LDial 900的配置指定语句包含错误,则是优选的,因为配置锁存器902e、902f的编译器选择值可能以不可预料的方式影响从配置锁存器902接收配置值的其他电路。

现在参照图9B,其中示出了配置编译器808为在配置指定语句中指定的每个信号名称实现的回溯过程的高层逻辑流程图。如图所示,该过程开始于块920,然后进入块922-924,其示出配置编译器808将反相计数初始化为零,然后定位由在配置指定语句中指定的信号名称标识的信号。

然后,该过程进入包括块926-936的循环,其共同表示配置编译器808回溯指定信号至信号路径中的第一锁存器元件。具体地说,如块926-930所示,配置编译器808确定信号路径中的下一个“上游”电路元件是锁存器(926)、缓冲器(928)还是反相器(930)。如果电路元件是锁存器,则该过程退出循环并且传到下面描述的块940。然而,如果电路元件是缓冲器,则该过程传到块934,其示出配置编译器移到要处理的下一个上游电路元件,而不增加反相计数。如果电路元件是反相器,则该过程传到块936和934,其示出增加反相计数,然后移到要处理的下一个上游电路元件。以这种方式,配置编译器回溯指定信号至配置锁存器,同时确定由路径中的电路元件实现的信号状态的反相次数。如上所述,如果配置编译器808在信号路径中检测到不同于缓冲器或反相器的电路元件,则配置编译器808最好标志错误,如块946所示。然后,该过程终止于块950。

在块926检测出配置锁存器之后,配置编译器808确定反相计数是奇数还是偶数。如块940-944所示,如果反相计数为奇数,则配置编译器在将值插入到配置数据库814中之前,在块942反相该信号的设计者指定配置值。如果反相计数为偶数,则在将配置值插入到配置数据库814中之前不执行反相。然后,该过程终止于块950。

如上所述,本发明提供了一种允许数字系统的设计者利用嵌入在描述数字系统的HDL设计文件中的配置语句来指定数字系统的配置的配置指定语言。配置语句在数字设计内在逻辑上实例化一个或多个Dial,其响应于特定输入而提供数字设计的配置值。Dial如同包括数字设计的设计实体一样可以分层安排。配置指定语句与描述数字设计的HDL文件一起进行编译,以产生可被访问以配置数字设计的模拟可执行模型或者(在适当转换之后)物理实现的配置数据库。配置指定语句的编译最好支持回溯过程,其中响应于检测到耦合于信号与关联配置锁存器之间的奇数个反相器而反相信号的设计者指定配置值。

再次参照图5C,回想一下,LDial 524的示例性配置指定语句包括以下形式的括号内信号列举:

LDial bus ratio(FXU0.A0.SIG1,FXU0.A1.SIG1,

                FXU0.B.C.SIG2(0..5),

                FXU1.A0.SIG1,FXU1.A1.SIG1,

                FXU1.B.C.SIG2(0..5),

                FPU0.SIG3,SIG4(0..3)

                )=

                …

应当注意的是,从Dial与其相关联的设计实体的范围开始(按照惯例,它是实例化Dial的配置指定语句或配置引用语句嵌入在其HDL文件中的设计实体),配置指定语句的信号列举部分单独、分层且显式地列举由Dial配置的每个信号实例的信号标识符。该语法在此称作信号标识符的“完全表达式”。在LDial或IDial的配置指定语句的信号列举部分中或者在CDial的配置指定语句的Dial列举部分中采用“完全表达式”语法要求设计者知道并且正确地输入由Dial控制的信号(或低层Dial)的每个实例的分层标识符。因此,如果以后将相同信号(或低层Dial)的新实例加入到数字设计中,则设计者必须仔细检查引用相同信号(或Dial)的其他实例的Dial的配置指定语句,并且更新信号(或Dial)列举部分,以包括新加入的实例的完全表达式。

为了减少输入配置指定语句的信号(或Dial)列举部分所需的输入量和减轻将新信号和Dial实例加入到数字设计中时的代码维护负担,根据本发明的ECAD系统35还支持配置指定语句的信号(或Dial)列举部分的“紧凑表达式”语法。这里,该语法在应用于LDial和IDial的配置指定语句时更具体地称作“紧凑信号表达式”,而在引用CDial的配置指定语句时称作“紧凑Dial表达式”。

在信号或Dial列举的紧凑表达式中,对其期望进行共同配置的选定范围内实体的所有实例可以采用单个标识符来列举。例如,在图5C中,如果设计者对于信号sig1 514的所有四个实例体想要进行共同配置,则设计者可通过单个紧凑信号表达式“[A].sig1”列举LDial 524的配置指定语句中的所有四个实例体,其中方括号内的项目是发生感兴趣信号的实体的名称。在紧凑表达式中,表达式的缺省范围隐含为Dial与其相关联的设计实体(在本例中为顶层实体302)的范围。因此,标识符“[A].sig1”在顶层实体302的缺省范围内指定A实体的实例体304内的信号sig1 514的所有四个实例体。

采用紧凑表达式的标识符范围还可通过显式列举设计分层结构的选定层次来变窄。例如,紧凑表达式“FXU1.[A].sig1”仅引用FXU1实体实例体304b内的信号sig1实例体514b0和514b1,但是不包括FXU0实体实例体304a的信号sig1实例体514a0和514a1。

当然,当在设计分层结构的高层仅实例化信号或Dial的单个实例时,紧凑表达式和完全表达式将需要大约相同的输入量(例如,“FPU0.sig3”对“[FPU].sig3”来标识信号sig3 536)。然而,应当注意的是,如果后来将另一个FPU实体314加入到模拟模型300”中,则该标识的紧凑表达式将有利地应用于顶层实体302的范围内任何后来加入的FPU实体。

利用紧凑表达式,LDial 524的配置指定语句现在可更紧凑地被如下改写:

LDial bus ratio([A].SIG1,[C].SIG2(0..5),

            FPU0.SIG3,SIG4(0..3)

            )=

           {2:1=>0b0,0x00,0b0,0x0;

            3:1=>0b1,0x01,0b0,0x1;

            4:1=>0b1,0x3F,0b1,0xF

           };

如果上述串接语法应用于映射表,则映射表还可简化成:

           {2:1=>0;

            3:1=>0x821;

            4:1=>0xFFF

           };

在串接语法中,以每个实体标识符的相应的单个比特字段在映射表中指定信号值,而与实际实体实例数无关。例如,由“[A].sig1”包括的所有实例都以指定配置值的1比特表示,由“[C].sig2”包括的所有实例都以指定配置值的6比特表示,由“FPU0.sig3”标识的单个实例以指定配置值的1比特表示,并且“sig4(0..3)”的单个实例以指定配置值的4比特表示。因此,利用串接语法,由LDial 524一起指定的21比特可采用等价12比特模式来指定。

紧凑Dial表达式以与紧凑信号表达式相同的方式进行构造和由编译器进行分析。例如,图7B的CDial 710的配置指定语句可以利用紧凑Dial表达式来如下改写:

CDial BusRatio([FXU].BUSRATIO,[FPU].BUSRATIO,BUSRATIO)=

                {2:1=>2:1,2:1,2:1;

                 3:1=>3:1,3:1,3:1;

                 4:1=>4:1,4:1,4:1

                };

再次,该配置指定语句有利地允许CDial 710通过附加FXU实体304或FPU实体314的实例化自动控制后来加入到模拟模型300中的、名称为“Busratio”的任何附加LDial,而无需任何代码修改。

现在参照图10,示出了根据本发明的配置编译器808解析配置指定语句内的每个信号或Dial标识的示例性方法的高层逻辑流程图。如上所述,每个信号或Dial标识由一个或多个用点号(“.”)分隔的字段分层构成。最后字段指定信号(例如,“sig1”)或Dial(例如,“Bus_Ratio”)的实例名称,并且前面字段从缺省范围开始使范围变窄,其中缺省范围按照惯例是Dial与之关联的设计实体的范围。

如图所示,该处理开始于块1000,然后进入块1002,其示出配置编译器808确定信号或Dial标识的第一或当前字段是否包含容纳在方括号内的实体标识符(例如,“[A]”),也就是,该标识是否为紧凑表达式。如果是,则该过程传到下面描述的块1020。如果否,则配置编译器808在块1004通过确定该标识的第一或当前字段是否为该标识的最后字段来确定该标识是否为完全表达式。如果是,则信号或Dial标识为完全表达式,并且该过程传到块1010。另一方面,如果该标识的当前字段不是最后字段,则配置编译器808将当前范围变窄至在该标识的当前字段中标识的设计实体实例体,如块1006所示。例如,如果配置编译器808正在处理图7B的CDial 710的配置指定语句内的标识“FPU0.SIG3”,则配置编译器808将使范围从顶层实体302的缺省范围变窄至FPU实体实例体314。如果如块1008所示存在由该标识的当前字段表示的实体实例体,则在如块1009所示将当前字段更新为下一个字段之后,该过程返回到块1002。然而,如果在当前范围内不存在由当前字段指定的实体实例体,则配置编译器808在块1032标志错误,并且终止信号或Dial标识的处理。

再次回到块1004,当配置编译器808检测出它达到完全表达式的最后字段时,图10所示的过程从块1004传到块1010。块1010示出配置编译器1010试图在当前范围内定位其名称与在信号或Dial标识的最后字段中指定的名称相匹配的单个信号或Dial实例。如果配置编译器808在块1012确定在当前范围内没有找到匹配实例,则该过程传到块1032,并且配置编译器808标志错误。然而,如果配置编译器808定位了匹配信号或Dial实例,则配置编译器808在配置数据库814中创建一个条目,从而将该信号或Dial实例绑定到在正被处理的Dial的配置指定语句的映射表中指定的参数,如块1014所示。然后,信号或Dial标识的处理终止于块1030。

现在参照块1020和下面块,将描述采用紧凑表达式的信号或Dial标识的处理。块1020示出配置编译器808试图在由方括号字段表示的实体的当前范围中的一个或多个实例的每一个内,定位与在信号或Dial标识中所指定的Dial或信号实例相匹配的每个Dial或信号实例。例如,当处理图7B的模拟模型300的紧凑表达式“FXU1.[A].sig1”时,一到达字段“[A]”,则对FXU1搜索实体A 306的实例体,并且一找到实体实例体306a0和306a1,则在这两个实体实例体的每一个内进行搜索,以定位信号实例体sig1 514a0和514a1。如果配置编译器808在块1022确定在当前范围内没有找到匹配信号或Dial实例,则该过程传到块1032,其示出配置编译器808在标志错误之后终止信号或Dial标识的处理。然而,如果配置编译器808定位了一个或多个匹配信号或Dial实例,则该过程从块1022传到块1024。块1024示出配置编译器808在配置数据库814中创建一个或多个条目,从而将每个匹配信号或Dial实例绑定到在正被处理的Dial的配置指定语句的映射表中指定的参数。然后,信号或Dial标识的处理终止于块1030。

利用由本发明支持的紧凑表达式,可以有利地减少设计者在配置指定语句中必须输入的代码量。紧凑表达式的使用不仅降低输入要求和输入错误的可能性,而且通过将指定配置参数自动施加于后来输入的落在选定范围内的信号和Dial实例来简化代码维护。

如上所述,每一个Dial在其输入值的每一个与Dial的唯一输出值之间具有一一映射关系。换句话说,每个输入值具有与任何其他输入值的输出值不同的唯一输出值。对于CDial和LDial,映射表必须显式地列举每个合法输入值及其关联映射。

必须在映射表中显式列举输入值的要求限制任何给定LDial或CDial的总体复杂性。例如,考虑包含10到20个配置寄存器的集成电路(例如,存储器控制器)的情况,其中这些配置寄存器的每个均具有5到20个合法值。在很多情况下,这些寄存器具有相互依赖性-装载在一个寄存器中的值可影响一个或多个其他寄存器的合法可能性。理想地,利用由单个CDial控制的Dial树指定所有寄存器的值将是方便的。通过这种方式,所有10到20个寄存器的配置可作为一个组来控制。

不幸的是,在上述假定的情况下,10到20个寄存器一起可能具有超过300,000合法值组合。在这种情况下,CDial的指定虽然在理论上是可能的,但是是不理想的并且在实际上是不可行的。而且,即使可采用循环构造来自动化构造CDial的配置指定语句,但是尽管向模拟软件通知哪些输入值是合法的,配置指定语句也不能向用户告知如何设置该尺寸的CDial。

在认识到前述问题的情况下,本发明的配置指定语言提供了“Dial组”构造。Dial组是设计者希望在其间创建关联的Dial集合。用来提供Dial输入值的运行时间API通过防止单独设置Dial组内的各个Dial来遵循该关联。换句话说,必须同时设置Dial组中的所有Dial,以便防止以不关心Dial之间的交互的方式独立地设置各个Dial。由于软件强制遵循形成Dial组的Dial的编组,因此Dial组的使用还提供设计者可向“下游”用户团体警告在组成Dial组的Dial之间存在未声明的互依赖性设置的机制。

现在参照图11A,示出了Dial组1100a的图示。Dial组1100a由组名1102(例如,“GroupG”)和列出一个或多个Dial或其他Dial组的Dial列表1104定义。Dial组没有任何输入或输出。作为所有顶层Dial 1110a-1110f列在Dial列表1104内的Dial可以是LDial、CDial和/或IDial。

图11A示出Dial组1100a可被实现为在其Dial列表1104中引用一个或多个其他Dial组1100b-1100n的分层Dial组。这些低层Dial组又在其各自的Dial列表中引用一个或多个顶层Dial 1110g-1110k和1110m-1110r(或其他Dial组)。

分层实现Dial组的一个动机是协调跨越组织边界的Dial组的配置。例如,考虑这样的数字系统,其中30个Dial在逻辑上属于一个Dial组,并且这些Dial中的10个包含在作为第一设计者职责的第一设计实体内,并且这些Dial中的20个包含在作为第二设计者职责的第二设计实体内。在没有分层Dial组的情况下,将不得不在包括第一和第二设计实体两者的设计分层结构的高层指定在其Dial列表1104中显式列出所有30个Dial的单个Dial组。该实现将是不方便的,因为负责高层设计实体的设计者(或设计组)将必须知道低层设计实体中的所有相关Dial,并且在Dial组的Dial列表1104中具体标识30个Dial的每一个。

一种可替换的分层方法将需要创建包含第一设计实体内的10个Dial的第一Dial组、包含第二设计实体内的20个Dial的第二Dial组以及引用第一和第二Dial组的第三高层Dial组。重要的是,高层Dial组的Dial列表1104必须仅引用两个低层Dial组,因此向负责设计分层结构高层的设计者隐藏低层细节。另外,由于改变哪些Dial属于两个低层Dial组将不影响高层Dial组的Dial列表1104,因此减轻了代码维护。

Dial组遵循多条规则。首先,Dial或Dial组不可以列在多于一个Dial组的Dial列表1104中。第二,Dial组在其Dial列表1104内必须引用至少一个Dial或其他Dial组。第三,在其Dial列表1104中,Dial组只能引用其范围内的Dial或Dial组,其中该范围按照惯例(如同应用于Dial一样的范围概念)是其关联设计实体的范围(即,设计实体本身和设计实体内的任何低层设计实体)。第四,在Dial组的Dial列表1104中引用的每个Dial必须是顶层Dial。

现在参照图11B,示出了说明Dial组使用的示例性模拟模型1120。示例性模拟模型1120包括具有实例体标识符“TOP:TOP”的顶层设计实体1122。在顶层设计实体1122内,实例化分别具有实体名称FBC和L2的两个设计实体1124和1126。FBC实体实例体1124又实例化具有Dial名称“C”的Dial实例1130、包含具有Dial名称“B”的Dial实例1134的Z实体实例体1132、以及分别被命名为“X0”和“X1”的实体X 1136的两个实例体。每个实体X实例体1136包含两个实体Y实例体1138,其中每一个进一步实例化具有Dial名称“A”的Dial实例1140。L2实体实例体1126包含具有Dial名称“D”的Dial实例1150以及两个实体L实例体1152,这两个实体L实例体1152各自包含具有Dial名称“E”的Dial实例1154。

如图所示,FBC实体实例体1124具有组名为“F”的关联Dial组实例1160。如箭头所示,Dial组实例1160在FBC实体实例体1124内包括Dial实例1130、1134和1140的每一个。L2实体实例体1126类似地具有关联Dial组实例1162,其在L2实体实例体1126内包括Dial实例1150和1154的每一个。这些Dial组实例又都属于具有组名“H”的高层Dial组实例1164,其与顶层设计实体1122相关联。

每个Dial组实例通过在关联设计实体的HDL文件内包括适当配置语句来创建。例如,创建Dial组“F”、“G”和“H”的配置语句的示例性语法分别如下给出:

GDial F(C,[Z].B,[Y].A);

GDial G(D,[L].E);

GDial H(FBC.F,L2.G);

在每个配置语句中,Dial组用关键字“GDial”声明,其后是表示组名的字符串(例如,“F”)。在组名之后的括号内,指定Dial组的Dial列表。如Dial组“H”的配置语句所示,分层Dial组的Dial列表以与Dial相同的方式指定其他Dial组。还应当注意的是,上述紧凑Dial表达式语法可以用于指定Dial列表中的Dial或Dial组,如Dial组“F”和“G”的配置语句所示。

既然描述了Dial的基本类型、其指定的语法以及应用和Dial组,将提供配置数据库814的示例性实现及其使用的描述。为了帮助理解在配置数据库814中可访问特定Dial实例体(或Dial的多个实例体)的方式,将描述配置数据库814内Dial的命名法。

用于本发明的优选实施例中的命名法首先要求设计者唯一命名在任何给定设计实体内指定的每个Dial,即设计者不能采用相同的Dial名称在相同设计实体内声明任何两个Dial。遵循该要求防止在相同设计实体中实例化的Dial之间的名称冲突,并且帮助设计实体在任意大小的模型中的任意再使用。该约束不太繁重,因为给定设计实体通常在特定时间点由特定设计者创建,并且在该限定环境内维护唯一的Dial名称仅带来适度的负担。

因为希望能够单独访问在给定模拟模型中可具有多个实例体(例如,由于复制)的Dial实体的特定实例体,因此Dial名称的单独使用不能保证唯一标识模拟模型中的特定Dial实体实例体。因此,在优选实施例中,Dial的命名法支持本地HDL采用模拟模型内每个Dial的“扩展Dial标识符”来消除相同设计实体的多个实例的歧义所需的关联设计实体的唯一实例体标识符。

另外,已经认识到一些HDL不严格强制唯一实体名称的要求。例如,传统VHDL实体命名结构允许两个设计实体共享相同的实体名称entity_name。然而,VHDL要求具有相同名称的实体必须封装在从其可构造有效VHDL模型的不同VHDL库内。在该情形下,entity_name等价于用点号(“.”)与在实体声明中所声明的实体名称串接的VHDL库名。因此,将不同VHDL库名预先挂起到实体名称将消除共享相同实体名称的实体的歧义。大多数HDL包括诸如这样的机制来唯一命名每个设计实体。

在优选实施例中,唯一标识Dial实体的特定实例体的扩展Dial标识符包括三个字段:实例体标识符字段、设计实体名称和Dial名称。扩展Dial标识符可如下被表达为以点号(“.”)分隔相邻字段的字符串:

<实例体标识符>.<设计实体名称>.<Dial名称>

在扩展Dial标识符中,设计实体字段包含Dial在其中被实例化的设计实体的实体名称,并且Dial名称字段包含在Dial配置指定语句中为Dial声明的名称。如上所述,在实例体标识符字段中指定的实例体标识符是实例体标识符的序列,其从模拟模型的顶层实体开始到给定Dial实例的直接祖先设计实体,其中相邻实例标识符以点号(“.”)分开。由于没有设计实体可包括两个具有相同名称的Dial,因此实例体标识符对于模型内Dial的每一个实例是唯一的。

设计实体名称字段中名称的唯一性是Dial之间的主要区分因素。通过在扩展Dial标识符中包括设计实体名称,每个设计实体实际上被赋予了与那个设计实体相关联的Dial的唯一命名空间,即给定设计实体内的Dial不能同与其他设计实体相关联的Dial具有名称冲突。还应当注意的是,有可能通过单独使用实例体标识符字段来唯一命名每个Dial。也就是,由于实例体标识符的唯一性,仅由实例体标识符字段和Dial名称字段形成的Dial标识符将必定唯一。然而,该命名方案不将Dial与给定设计实体相关联。实际上,期望将Dial与设计实体相关联,其中它们通过包括设计实体字段来发生,因为所有Dial实例体然后可被集中引用而无需确定包含Dial的所有设计实体实例体的名称。

如上所述,使用扩展Dial标识符允许唯一标识Dial的特定实例体,并且允许在任意模型内再使用设计实体而无Dial名称冲突的危险。例如,再次参照图11B,Dial A实体实例体1140a0、1140a1、1140b0和1140b1可分别以下面的扩展Dial标识符来唯一标识:

FBC.X0.Y0.Y.A

FBC.X0.Y1.Y.A

FBC.X1.Y0.Y.A

FBC.X1.Y1.Y.A

在理解了Dial的优选命名法的情况下,现在参照图12,其是由配置编译器808创建的配置数据库814的示例性格式的图示。在本示例性实施例中,配置数据库814包括至少四种不同类型的数据结构:Dial定义数据结构(DDDS)1200、Dial实例数据结构(DIDS)1202、锁存器数据结构1204和顶层指针数组1206。配置数据库814可以可选地包括附加数据结构,如Dial指针数组1208、锁存器指针数组1210、实例指针数组1226和以短划线表示的其他数据结构,当配置数据库814被装载时,这些附加数据结构可以可选地在易失性存储器中被构造,如下面进一步所述。仅在将配置数据库814装载到易失性存储器中之后才生成这些附加数据结构有利地促进更紧凑的配置数据库814。

对于数字系统中的每个Dial或Dial组,在配置数据库814内创建相应的Dial定义数据结构(DDDS)1200。最好是,在配置数据库814中仅创建一个DDDS 1200而与数字系统中Dial(或Dial组)的实例体数目无关。如下所述,有关在DDDS 1200中描述的Dial的特定实例体的信息在独立的DIDS 1202中指定。

如图所示,每个DDDS 1200包括表示DDDS 1200描述Dial还是Dial组、并且如果是Dial还表示Dial类型的类型字段1220。在一个实施例中,为类型字段1220设置的值包括用于Dial组的“G”、用于整数Dial(IDial)的“I”、用于锁存器Dial(LDial)的“L”和用于控制Dial(CDial)的“C”。DDDS 1200还包括名称字段1222,其指定由DDDS 1200描述的Dial或Dial组的名称。该字段最好包含Dial(或Dial组)的设计实体名称,之后是点号(“.”),再之后是在Dial(或Dial组)的配置指定语句中给出的Dial(或Dial组)的名称。名称字段1222的内容对应于设计实体名称和Dial的扩展Dial标识符的Dial名称字段。

DDDS 1200还包括映射表1224,如果需要,其包含从给定Dial的输入到其输出的映射。对于LDial和CDial,映射表1224在很大程度上如同这些Dial的配置指定语句一样指定输入值与输出值之间的关系。对于没有分裂输出的Dial组和IDial,映射表1220是空数据结构并且未被使用。在具有分裂输出的IDial的情况下,映射表1220指定复制整数字段的宽度和那个字段的副本数。该信息用来将整数输入值映射到整数输出字段的各个副本。

最后,DDDS 1200可包括实例指针数组1226,其包含一个或多个指向由DDDS 1200定义的Dial或Dial组的每个实例的实例指针1228a-1228n。实例指针数组1226帮助访问特定Dial或Dial组的多个实例。

如图12进一步所示,配置数据库814包含对应于数字设计内的每个Dial实例体或Dial组实例体的DIDS 1202。每个DIDS 1202包含定义字段1230,其包含指向DIDS 1202为其描述特定实例的Dial的DDDS 1200的定义指针1231。一旦识别出特定Dial实例,定义指针1231就允许容易地访问实例的Dial名称、Dial类型和映射表。

DIDS 1202还包括父字段1232,在IDial、CDial或LDial的情况下,其包含指向其输出在逻辑上连接到对应Dial实例的输入的高层Dial实例的DIDS 1202(若有的话)的父指针1233。在Dial组的情况下,父指针1233指向以分层方式包括当前Dial组的高层Dial组的DIDS 1202(若有的话)。如果对应于DIDS 1202的Dial实例是顶层Dial,并且不属于任何Dial组,则父字段1232中的父指针1233是NULL(空)指针。应当注意的是,Dial可以是顶层Dial,但是仍然属于Dial组。在这种情况下,父指针1233非空,而是指向包含顶层Dial的Dial组的DIDS 1202。

因此,配置数据库814中DIDS 1202的父字段1232共同描述在数字设计中实例化的Dial实体和Dial组的分层安排。如下所述,在给定最终由顶层Dial控制的配置锁存器的配置值的情况下,由父字段1232提供的分层信息有利地使得能够确定任何顶层Dial的输入值。

DIDS 1202的实例名称字段1234提供从数字设计的顶层设计实体开始、由DIDS 1202描述的Dial实例的完全合格的实例名称。对于与顶层实体相关联的Dial实例,实例名称字段1234最好包含空字符串。

DIDS 1202还可包括缺省字段1229、阶段ID字段1227和Dial设置字段1239。在编译时候,配置编译器808最好初始地将缺省字段1229插入到关联Dial的配置指定语句对于其指定有缺省值的至少每个DIDS 1202中。缺省字段1229存储指定缺省值;如果没有指定缺省值,则缺省字段1229为空或者被省略。配置编译器808随后利用递归式遍历来分析配置数据库814,或者删除(或设成空)具有带缺省值的祖先Dial的任何Dial实例的缺省字段1229。以这种方式,在分层结构中处于高层的Dial实例的缺省值覆盖为低层Dial实例指定的缺省值。对于每个其余(或非空)缺省字段1229,配置编译器808将用于存储与缺省值相关联的一个或多个阶段ID(若有的话)的阶段ID字段1227插入到DIDS 1202中。存储在阶段ID字段1227内的阶段ID可在HDL文件800或配置指定文件802中的Dial定义语句内指定,或者可以可选地由下游用户通过直接操纵配置数据库814来提供,如下面参照图18C所述。

如虚线所示,当配置数据库814被装载到易失性存储器中时,Dial设置字段1239最好被插入在配置数据库814中的每个DIDS 1302内。Dial设置字段1239是布尔值字段,其初始化为FALSE(假),并且当显式设置关联Dial实例时更新为真。

最后,DIDS 1202包括输出指针数组1236,其包含指向描述与对应Dial实例或Dial组实例相关联的低层实例体的数据结构的指针1238a-1238n。具体地说,在IDial和LDial的情况下,输出指针1238引用与耦合于Dial实例的配置锁存器相对应的锁存器数据结构1204。对于非分裂IDial,由输出指针1238a引用的配置锁存器实体接收整数输入值的高位比特,并且由输出指针1238n引用的配置锁存器实体接收整数输入值的低位比特。在CDial的情况下,输出指针1238引用与由CDial控制的Dial实例相对应的其他DIDS 1202。对于Dial组,输出指针1238引用以分层方式包括在对应于DIDS 1202的Dial组实例内的顶层Dial实例或Dial组实例。

对于LDial或IDial的输出在逻辑上与之耦合的模拟可执行模型816中的每个配置锁存器,配置数据库814还包括相应的锁存器数据结构1204。每个锁存器数据结构1204包括父字段1240,其包含指向直接控制对应配置锁存器的LDial或IDial的DIDS 1200的父指针1242。另外,相对于包含由父指针1242标识的Dial实例体的实体,锁存器数据结构1204包括指定分层锁存器名称的锁存器名称字段1244。例如,如果具有实例体标识符a.b.c的LDialX引用具有分层名称“a.b.c.d.latch1”的配置锁存器,则锁存器名称字段1244将包含字符串“d.latch1”。这样,将由父指针1242标识的DIDS 1202的实例名称字段1234的内容预先挂起到锁存器名称字段1244的内容将提供可利用配置数据库814配置的给定配置锁存器的任何实例的完全合格的名称。

仍然参照图12,如上所述,配置数据库814包括顶层指针数组1206以及可选地包括Dial指针数组1208和锁存器指针数组1210。顶层指针数组1206包含顶层指针1250,其对于每个顶层Dial和每个顶层Dial组指向顶层实体实例的关联DIDS 1202。Dial指针数组1208包括指向配置数据库814中的每个DDDS 1200的Dial指针1252,以允许通过Dial和/或实体名称间接访问特定Dial实例。最后,锁存器指针数组1210包括锁存器指针1254,其指向配置数据库814内的每个锁存器数据结构1204,以允许容易地访问所有配置锁存器。

一旦构造了配置数据库814,则配置数据库814的内容可被装载到易失性存储器如图1的数据处理系统8的系统存储器18中,从而适当地配置用于模拟的模拟模型。一般而言,数据结构1200、1202、1204和1206可被直接装载到系统存储器18中,并且可以可选地增加附加字段,如下所述。然而,如上所述,如果希望使配置数据库814的非易失性映像紧凑,则在系统存储器18的非易失性配置数据库映像中生成附加数据结构如Dial指针数组1208、锁存器指针数组1210和实例指针阵列1226是有帮助的。

现在参照图13,示出了在数据处理系统的易失性存储器如数据处理系统8的系统存储器18内展开配置数据库814的方法的高层逻辑流程图。由于图13示出逻辑步骤而非操作步骤,因此应当理解,可以同时或者以不同于所示的次序执行图13所示的很多步骤。

如图所示,该过程开始于块1300,然后进入块1302,其示出数据处理系统6将配置数据库814内的现有数据结构从非易失性存储装置(例如,盘存储装置或闪存)拷贝到易失性系统存储器18中。下一步,在块1304,确定配置数据库814的顶层指针数组1206内的所有顶层指针1250是否已被处理。如果是,则该过程传到下面讨论的块1320。如果否,该过程进入块1306,其示出从顶层数组1206选择要处理的下一个顶层指针1250。

然后,在块1308确定由选定顶层指针1250标识的DIDS 1202内的父指针1233是否为空指针。如果否,其表示DIDS 1202描述属于Dial组的顶层Dial,则该过程返回到块1304,其表示当处理其所属的Dial组时将处理顶层Dial及其关联低层Dial。

响应于在块1308确定父指针1233是空指针,数据处理系统8在DIDS1202的定义字段1230中的定义指针1231所指向的DDDS 1200的实例数组1226中创建指向DIDS 1202的实例指针1228,如块1310所示。下一步,在块1312,如果Dial指针1252不冗余,则数据处理系统8在Dial指针数组1208内创建指向顶层Dial的DDDS 1200的Dial指针1252。另外,如块1314所示,数据处理系统8创建锁存器指针数组1210内的锁存器指针1254,其指向由顶层Dial的DIDS 1202的输出指针1238引用的每个锁存器数据结构1204(若有的话)。然后,如块1316所示,通过执行块1310-1316所示的功能来类似地处理以由选定的顶层指针1250引用的顶层Dial为首的Dial树的每个低层的每个分支(若有的话),直到找到并处理了终止那个分支的锁存器数据结构1204为止。然后,该过程返回到块1304,其表示顶层指针数组1206内每个顶层指针1250的处理。

响应于在块1304确定所有顶层指针1250均被处理,图13所示的过程进入块1320。块1320示出在配置数据库内的每个DIDS 1320中创建Dial设置字段1239。如上所述,Dial设置字段1239是布尔值字段,其初始化为假,并且当显式设置关联Dial实例时更新为真。另外,如块1322所示,数据处理系统8在每个锁存器数据结构1204中创建锁存器值字段1246、锁存器设置字段1248和设置历史字段1249,以分别表示关联配置锁存器的当前设置值,表示配置锁存器是否当前通过显式设置命令而设置,以及表示配置锁存器是否已经被显式设置。虽然块1320-1322所示的四个字段的创建为了简洁起见是与块1304-1316所示的处理分开示出的,但是应当理解,当处理每个DIDS 1202时创建Dial设置字段1239并且当到达每个Dial树的底部的锁存器数据结构1204时创建字段1246、1248和1249是更高效的。然后,将配置数据库装载到易失性存储器中的过程终止于块1234。

在配置数据库被装载到易失性存储器中的情况下,可以配置和利用模拟模型以通过执行模拟软件来模拟数字设计。参照图14,示出了描述在模拟模型的模拟运行期间系统存储器18(图1)的内容的方框图。如图所示,系统存储器18包括模拟模型1400和软件,其中模拟模型1400是所要模拟的数字设计的逻辑表示,并且软件包括配置API 1406、模拟器1410和RTX(运行时间执行体)1420。

模拟器1410将模拟模型如模拟模型1400装载到系统存储器18中。在模拟运行期间,模拟器1410通过各种API 1416复位、定时和评估模拟模型1400。另外,模拟器1410利用GETFAC API 1412读取模拟模型1400中的值,并且利用PUTFAC API 1414将值写入到模拟模型1400。虽然模拟器1410在图14中是完全采用软件来实现的,但是应当理解,在下文中模拟器可以可选地至少部分采用硬件来实现。

配置API 1406包括典型地采用支持配置模拟模型1400的高级语言如C或C++来编写的软件。根据需要由模拟器1410动态装载的这些API包括第一API,其从非易失性存储装置装载配置数据库814并且以上面参照图13所述的方式展开它,以提供配置数据库1404的存储器映像。配置API 1406还包括附加API,以如下所述访问和操纵配置数据库1404。

RTX 1420控制模拟模型如模拟模型1400的模拟。例如,RTX 1420装载要施加于模拟模型1400的测试例。另外,RTX 1420输送对配置API 1406和由模拟器1410提供的API的一组API调用,以初始化、配置和模拟模拟模型1400的操作。在模拟期间和之后,RTX 1420还调用配置API 1406和由模拟器1410提供的API,以通过访问模拟模型1400内的各个Dial、配置锁存器、计数器和其他实体来检查模拟模型1400的正确性。

RTX 1420具有访问在模拟模型1400内实例化的Dial的两个模式:交互模式和批模式。在交互模式中,RTX 1420调用第一组API来从配置数据库1404内的特定Dial的一个或多个实例读取或者向其写入。通过参考配置数据库1404而获得的锁存器值在模拟模型1400内立即生效。在批模式中,RTX1420调用不同的第二组API来读取或写入配置数据库1404中多个Dial的实例体,然后同时进行对模拟模型1400的任何修改。

在交互或批模式中,RTX 1420必须在其API调用中采用某种语法来指定要访问模拟模型1400内的哪些Dial或Dial组实例。虽然可采用多种不同语法,包括采用通配符的传统正规表达式,但是在说明性实施例中,用来在API调用中指定Dial或Dial组实例的语法类似于前述的紧凑表达式。上述紧凑表达式与用来在RTX API调用中指定Dial或Dial组实例的语法之间的关键不同之处在于,在说明性实施例中,通过引用模拟模型1400的顶层设计实体而非相对于其中指定了Dial或Dial组的设计实体来在RTX API调用中指定Dial和Dial组实例。

在所示实施例中,以模拟模型1400中的一个或多个Dial或Dial组实例为目标的每个RTX API调用利用两个参数指定Dial或Dial组实例:实例限定符和Dial名称限定符。为了仅引用单个Dial或Dial组实例体,实例限定符采取“a.b.c.d”的形式,其是出现该单个Dial或Dial组实例体的设计实体的分层实例体标识符。为了引用多个Dial或Dial组实例,实例限定符采取“a.b.c.[X]”的形式,其标识实体实例a.b.c的范围内实体X的所有实例体。采用退化的形式,实例限定符可简单地为“[X]”,其标识模拟模型1400内任何地方的实体X的所有实例体。

Dial名称(dialname)限定符最好采取“Entity(实体).dialname(Dial名称)”的形式,其中“实体”是Dial或Dial组在其中被实例化的设计实体,并且“Dial名称”是在其配置指定语句中分配给Dial或Dial组的名称。如果采用带方括号语法来指定实例限定符,则可从Dial名称限定符中去掉“实体”字段,因为它将匹配带方括号的实体名称。

现在参照图15,其示出了根据本发明的配置API 1406基于实例限定符和Dial名称限定符对在配置数据库1404中定位特定Dial或Dial组实例的示例性过程的高层逻辑流程图。如图所示,该过程响应于配置API 1406接收到如上所述来自包含实例限定符和Dial名称限定符的RTX 1420的API调用而开始于块1500。响应于该API调用,配置API 1406以Dial指针数组1208进入配置数据库1404,如块1502所示,并且利用Dial指针1252来定位其名称字段1222精确匹配指定Dial名称限定符的DDDS 1200,如块1504所示。

下一步,在块1506,配置API 1406确定实例限定符是否如上所述采用带方括号语法。如果是,则该过程传到下面描述的块1520。然而,如果实例限定符没有采用带方括号语法,则配置API 1406依照匹配DDDS 1200的实例指针1228来定位其实例名称字段1234精确匹配指定的实例限定符的单个DIDS 1202。如块1510-1512所示,如果没有找到匹配,则该过程以错误终止。然而,如果定位了匹配DIDS 1202,则在块1524创建标识该单个匹配DIDS1202的临时“结果”指针。然后,该过程终止于块1526。

回到块1520,如果采用带方括号语法,则配置API 1406利用匹配DDDS1200的实例指针1228,以在由方括号之前的实例标识符的前缀部分指定的范围内定位一个或多个Dial或Dial组实例的DIDS 1202。也就是,如果DIDS1202的实例名称字段1234包含实例限定符的前缀部分,则认为DIDS 1202“匹配”。再次,如果没有找到匹配,该过程通过块1522,并且以错误终止于块1512。然而,如果一个或多个DIDS 1202“匹配”实例限定符,则在块1524构造标识匹配DIDS 1202的临时结果指针。图15所示的过程然后终止于块1526。

现在参照图16A,其示出了根据本发明的RTX 1420在交互模式中读取一个或多个Dial实例的值的示例性过程的高层逻辑流程图。如图所示,该过程响应于配置API 1406接收到RTX 1420的read_Dial()API调用而开始于块1600。如块1602所示,配置API 1406通过利用上面参照图15所述的过程响应API调用而在配置数据库1404内定位一个或多个Dial实例的DIDS 1202来响应read_Dial()API调用。

然后,该过程在块1604进入循环,其中处理通过图15的过程生成的临时结果指针的每一个。如果通过图15的过程返回的所有结果指针均被处理,则该过程传到下面描述的块1640。如果否,则该过程从块1606进入块1608,其示出配置API 1406选择所要处理的下一个结果指针。下一步,在块1608,配置API 1406通过参考与由当前结果指针标识的DIDS 1202相关联的DDDS1200的类型字段1220,确定DIDS 1202是否对应于Dial组。如果是,则图16A所示的过程以错误状态终止于块1610,其表示RTX 1420利用了错误的API调用来读取Dial实例。

响应于在块1608确定由当前结果指针标识的DIDS 1202不对应于Dial组实例,该过程进入块1620。块1620示出配置API 1406利用DIDS 1202的输出指针1238(以及Dial树中任何低层DIDS 1202的输出指针)来从与最终由在API调用中指定的Dial实例控制的所有配置锁存器相对应的锁存器数据结构1204的锁存器名称字段1244构建包含锁存器名称的数据集。下一步,如块1622所示,配置API 1406发出一个或多个对模拟器1410的GETFAC()API1412的API调用,以从模拟模型1400获得列于在块1620构造的数据集中的所有配置锁存器的锁存器值。

然后,配置API 1406参考配置数据库1404验证从模拟模型1400获得的锁存器值,如块1624所示。为了验证锁存器值,配置API 1406利用映射表1224从对应的锁存器数据结构通过中间DIDS 1202(若有的话)沿着Dial树向上传播锁存器值,直到确定所请求的Dial实例的输入值为止。如果在该验证过程的任何点,通过验证过程生成的Dial实例的输出值不对应于在其映射表1224中列举的合法值之一,则在块1626检测到错误。因此,将从模拟模型1400读取的锁存器值和错误指示置于结果数据结构中,如块1630所示。如果没有检测到错误,则将通过验证过程生成的Dial输入值和成功指示置于结果数据结构中,如块1628所示。

如该过程返回到块1604所示,对于通过图15的过程返回的每个临时结果指针,重复上述过程。一旦所有结果指针都被处理,则该过程从块1604传到块1640-1642,其示出配置API 1406将结果数据结构返回到RTX 1420,然后终止。

RTX 1420利用例如图16A的方法在交互模式中读取Dial实例,以初始化在模拟运行期间监视模拟模型1400的部分的检查器。感兴趣的Dial设置不仅包括顶层Dial实例的Dial设置,而且包括与由检查器监视的模拟模型1400的部分联合的低层Dial实例的Dial设置。

现在参照图16B,其示出了根据本发明的RTX 1420在交互模式中读取一个或多个Dial组实例的值的示例性过程的高层逻辑流程图。通过比较图16A和16B可以看出,读取Dial组实例的过程类似于读取Dial实例的过程,但是返回可能不同的Dial实体的一个或多个顶层Dial实例的值而非相同Dial实体的一个或多个实例的值。

如图所示,图16B所示的过程响应于配置API 1406接收到RTX 1420的read_Dial_group()API调用而开始于块1650。如块1652所示,配置API 1406通过利用上面参照图15所述的过程、响应API调用来在配置数据库1404内定位一个或多个Dial组实例的DIDS 1202来响应read_Dial_group()API调用。

然后,该过程在块1654进入循环,其中处理通过图15的过程生成的临时结果指针的每一个。如果通过图15的过程返回的所有结果指针都被处理,则该过程传到下面描述的块1680。如果否,则该过程从块1654进入块1656,其示出配置API 1406选择所要处理的下一个结果指针。下一步,在块1658,配置API 1406标识并创建指向属于与由当前结果指针引用的DIDS 1202相对应的Dial组实例的所有顶层Dial实例的临时指针。通过定位关联DDDS 1220中的类型字段1220指定不同于Dial组的类型的每个输出指针1238的最高层DIDS 1202来标识顶层Dial实例。换句话说,配置API 1406可能不得不向下搜索一个或多个分层Dial组,以定位相关顶层Dial实例。

图16B所示的过程然后进入以块1659开始的循环,其中,单独处理属于与由当前结果指针引用的Dial组DIDS 1202相对应的Dial组的顶层Dial实例的每一个,以获得顶层Dial实例的值。下一步,该过程进入块1660,其示出配置API 1406利用第一个(或下一个)顶层Dial实例的DIDS 1202的输出指针1238(以及Dial树中任何低层DIDS 1202的输出指针),从与由顶层Dial实例最终控制的所有配置锁存器相对应的锁存器数据结构1204的锁存器名称字段1244构建包含锁存器名称的数据集。下一步,如块1662所示,配置API 1406发出一个或多个对模拟器1410的GETFAC()API 1412的API调用,以从模拟模型1400获得列于在块1660构造的数据集中的所有配置锁存器的锁存器值。

在块1664,配置API 1406然后利用上面参照图16A的块1624所述的相同技术,参考配置数据库1404验证从模拟模型1400获得的锁存器值。如果在该验证过程的任何点,通过验证过程生成的Dial实例的输出值不对应于在其映射表1224中列举的合法值之一,则在块1666检测到错误。因此,将从模拟模型1400读取的锁存器值和错误指示置于结果数据结构中,如块1670所示。如果没有检测到错误,则将通过验证过程生成的Dial输入值和成功指示置于结果数据结构中,如块1668所示。

在块1668或块1670之后,该过程返回到块1659,其表示确定属于与由当前结果指针引用的DIDS 1202相对应的Dial组的所有顶层Dial是否都被处理。如果否,则该过程返回到已经描述过的块1660。然而,如果所有顶层Dial都被处理,则该过程返回到块1654,其示出确定所有结果指针是否都被处理。如果否,则在已经描述过的块1656和下面块处理下一个结果指针。然而,如果所有结果指针都被处理,则该过程传到块1680-1682,其示出配置API 1406将结果数据结构返回给RTX 1420,然后终止。

在RTX 1420的批模式中读取Dial和Dial组实例最好是除了一个例外之外以与交互模式相同的方式由配置API 1406进行处理。在交互模式中总是在块1622和1662通过对GETFAC()API 1412的调用从模拟模型1440读取锁存器值,而在批模式中最好是,如果锁存器设置字段1248表示对应配置锁存器已被设置,则从配置数据库1404中的锁存器数据结构1204的锁存器值字段1246获得锁存器值。如果配置锁存器尚未被设置,则通过对GETFAC()API1412的调用从模拟模型1440获得锁存器值。该差别确保正确地报告在批模式中进行的Dial设置,其可能尚未被反映在模拟模型1400中。

现在参照图17A,其示出了根据本发明的RTX在交互模式中设置Dial实例的示例性过程的高层逻辑流程图。该过程响应于配置API 1406接收到来自RTX 1420的set_Dial()API调用而开始于块1700。响应于set_Dial()API调用,配置API 1406首先利用上面参照图15所述的技术,定位和生成指向在set_Dial()API调用中指定的Dial实例的DIDS 1202的临时结果指针,如块1702所示。下一步,配置API 1406在块1704确定所有临时结果指针是否指向顶层Dial实例的DIDS 1202。例如,该确定可通过检查每个这样的DIDS 1202的父指针1233(和由父指针1233链接的任何高层DIDS 1202的父指针)、以及关联DDDS 1200的类型字段1220来进行。顶层Dial实例的DIDS 1202将具有空父指针1233或指向关联DDDS 1200的类型字段1220表示Dial组的另一个DIDS 1202的非空父指针1233。如果由结果指针引用的任何DIDS 1202不对应于顶层Dial实例,则该过程以错误状态终止于块1708。

响应于在块1704确定由结果指针引用的所有DIDS 1202对应于顶层Dial实例,在块1706进一步确定Dial实例要被设置的指定值是否是在关联DDDS1200的映射表1224中指定的值之一。如果否,则该过程以错误终止于块1708。然而,响应于在块1706确定Dial实例要被设置的指定值是合法值之一,则该过程进入包括块1710-1716的循环,其中处理每个结果指针以设置各自的Dial实例。

在块1710,配置API 1406确定所有结果指针是否都被处理。如果是,则该过程终止于块1720。然而,如果还有另外的结果指针要被处理,则在块1712选择所要处理的下一个结果指针。下一步,在块1714,配置API 1406将在set_Dial()API调用中指定的Dial设置沿着以与由当前结果指针引用的DIDS 1202相关联的顶层Dial实例为首的Dial树向下传播。为了传播期望Dial设置,必要时,首先引用与由当前结果指针引用的DIDS 1202相关联的DDDS 1200中的映射表1224(即,对于CDial和LDial),以确定由当前结果指针引用的DIDS 1202的输出指针数组1236中的每个输出指针1238的输出值。这些输出值作为与由输出指针1238引用的DIDS 1202相对应的下一个低层Dial实例(若有的话)的输入值,沿着Dial树向下传播。该传播继续,直到为终止Dial树的每一个配置锁存器(其在配置数据库1404中通过锁存器数据结构1204表示)确定了锁存器值为止。如块1716所示,当确定了配置锁存器的每个锁存器值时,配置API 1406发出对PUTFAC()API 1414的调用,以利用在对应锁存器数据结构1204的锁存器名称字段1244内指定的锁存器名称,将模拟模型1400中的配置锁存器设成所确定的值。

然后,该过程返回到块1710,其表示对应于下一个结果指针的顶层Dial的处理。在所有结果指针都被处理之后,该过程终止于块1720。

现在参照图17B,其示出了根据本发明的RTX在交互模式中设置Dial组的示例性过程的高层逻辑流程图。该过程响应于配置API 1406接收到来自RTX 1420的set_Dial_group()API调用而开始于块1730。响应于set_Dial_group()API调用,配置API 1406首先利用上面参照图15所述的技术,定位和生成指向在set_Dial_group()API调用中指定的Dial组实例的DIDS 1202的临时结果指针,如块1732所示。下一步,配置API 1406在块1734确定所有临时结果指针是否指向顶层Dial组实例的DIDS 1202。例如,该确定可通过检查每个这样的DIDS 1202的父指针1233以确定父指针1233是否为空来进行。如果由结果指针引用的任何DIDS 1202不对应于顶层Dial组(即具有非空父指针1233),则该过程以错误状态终止于块1736。

响应于在块1734确定由结果指针引用的每一个DIDS 1202对应于顶层Dial组,该过程传到块1738-1740。块1738示出配置API 1406定位对应的DIDS 1202由结果指针引用的每个Dial组内的所有顶层Dial实例。然后,如块1740所示,配置API 1406确定每个顶层Dial实例要被设置的指定值是否是在对应的DDDS 1200的映射表1224中指定的值之一。如果否,则该过程以错误终止于块1736。

在所示实施例中,在设置任何Dial实例之前,执行块1734、1738和1740所示的预证实(prevalidation)步骤,因为作为成功设置所有相关顶层Dial实例或者完全失败的基本(atomic)操作,实现设置Dial组实例被认为是优选的。以这种方式,可以避免Dial组实例内的一些顶层Dial实例被设置而其他未被设置的复杂情况。

响应于在块1740确定每个顶层Dial实例要被设置的指定值是合法值之一,则该过程进入包括块1750-1756的循环,其中处理每个结果指针以设置属于每个Dial组实例的顶层Dial实例。

在块1750,配置API 1406确定所有结果指针是否都被处理。如果是,则该过程终止于块1760。然而,如果还有另外的结果指针要被处理,则在块1752选择所要处理的下一个结果指针。下一步,在块1754,配置API 1406将在set_Dial_group()API调用中对每个顶层Dial指定的Dial设置沿着属于与由当前结果指针引用的DIDS 1202相对应的Dial组实例的顶层Dial实例的Dial树向下传播。以相同于上面参照图17A的块1714所述的方式,执行沿着Dial树向下传播Dial设置。如块1756所示,当确定了配置锁存器的每个锁存器值时,配置API 1406发出对PUTFAC()API 1414的调用,以利用在对应的锁存器数据结构1204的锁存器名称字段1244内指定的锁存器名称,将模拟模型1400中的配置锁存器设置成所确定的值。然后,该过程返回到块1750,其表示对应于下一个结果指针(若有的话)的顶层Dial的处理。

现在参照图18A,其示出了根据本发明在批模式中设置Dial和Dial组实例的示例性方法的高层逻辑流程图。如图所示,该过程开始于块1800,然后进入块1802,其示出RTX 1420通过调用配置API 1406(例如,start_batch())来初始化配置数据库1404,从而初始化配置数据库1404。start_batch()API例程例如通过将配置数据库1404中的每个Dial设置字段1239、锁存器设置字段1248和设置历史字段1249设成假(FALSE)来初始化配置数据库1404。通过复位配置数据库1404中的所有“设置”字段,可以容易地检测出未被当前批模式调用序列设置的Dial和配置锁存器,如下所述。

在块1802初始化配置数据库1404之后,图18A所示的过程进入块1804。块1804示出RTX 1420可选地发出一个或多个read_Dial()或read_Dial_group()API调用,以如上面参照图16A和16B所述读取一个或多个Dial或Dial组,并且可选地发出一个或多个批模式set_Dial()或set_Dial_group()API调用,以将Dial实例及其底层配置锁存器的设置输入到配置数据库1404中。除了两个例外,配置API 1406以相同于上面参照图17A(用于设置Dial实例)或图17B(用于设置Dial组实例)所述的方式响应“设置”API调用。第一,当设置任何顶层或低层Dial实例时,无论是由于set_Dial()还是set_Dial_group()API调用,都将对应的DIDS 1202的Dial设置字段1239设为真(TRUE)。第二,没有锁存器值如图17A-17B的块1716和1756所示通过“设置”API例程写入到模拟模型1400中。相反,锁存器值被写入到与每个受影响的配置锁存器相对应的锁存器数据结构1204的锁存器值字段1246中,并且锁存器设置字段1248被更新成真。以这种方式,在随后处理期间可以容易地识别通过API调用显式设置的Dial实例和配置锁存器。

在块1804之后,该过程传到块1806,其示出RTX 1420调用配置API 1406中的end_batch()API例程,以完成缺省值应用的当前阶段。如块1806所示,并且如下面参照图18B所详述,end_batch()API例程将选定缺省值(若有的话)施加于指定的Dial实例,并且将这些缺省值传播到配置数据库1404中的底层配置锁存器。显式地或者采用缺省值设置的所有配置锁存器的锁存器值因而潜在地施加于模拟模型内的锁存器。最后,为下一个阶段(若有的话)作准备。

如果RTX 1420具有另外的缺省值施加阶段,则该过程从块1806传到块1808,然后返回到块1804,其表示RTX 1420发起下一个缺省值施加阶段。然而,如果缺省值施加的所有阶段都被处理,则图18A所示的过程从块1806通过块1808传到块1810,批过程在此终止。

现在参照图18B,其示出了在图18A的块1806调用的end_phase()API例程的示例性实施例的高层逻辑流程图。如图所示,当RTX 1420例如采用以下语句调用end_phase()API例程时,该过程开始于块1820:

End_phase(phases,unnamed,instance_qualifier,apply)

在该示例性API调用中,“phases(阶段)”参数是指定在当前阶段结束时所要施加的缺省值的阶段ID的字符串;“unnamed(未命名)”是表示在当前阶段期间是否应施加没有任何关联阶段ID的缺省值的布尔参数;“apply(施加)”是表示是否应将配置锁存器值立即施加于模拟模型1400的布尔值参数;并且“instance_qualifier(实例_限定符)”是可用来限制处理特定Dial的哪些实例以施加缺省值的一个或多个正规表达式。

通过指定end_phase()API例程的instance_qualifier参数,用户可以将缺省值施加限制于模拟模型1400的仅一部分。以这种方式限制缺省值施加的能力特别有用于模拟模型1400的两个部分(即,表示两个不同集成电路芯片的部分)具有不同阶段化要求、但是使用相同阶段ID的情况。因此,阶段ID的冲突可通过适当指定结合阶段ID一起使用的instance_qualifier来解决。

end_phase()API例程然后进入包括块1822-1838的处理循环,其中处理配置数据库1404内的DIDS 1202,以施加适当的Dial缺省值(若有的话)。首先参照块1822,end_phase()API确定顶层指针数组1206内的所有顶层指针1250是否都被处理。如果是,则该过程从块1822进入下面描述的块1840。如果不是顶层指针数组1206内的所有顶层指针1250都被处理,则该过程进入块1824。块1824表示end_phase()API例程递归性地扫描由下一个顶层指针1250及其后代DIDS 1202(若有的话)指向的DIDS 1202,以施加由end_phase()API调用的参数表示的缺省值。如果end_phase()API例程在块1826确定它已处理了由当前顶层指针1250标识的顶层DIDS 1202的子树中的所有必要DIDS 1202,则该过程返回到已经描述过的块1822。然而,如果还有由当前顶层指针1250标识的顶层DIDS 1202的子树中的至少一个DIDS 1202要被处理,则该过程从块1826传到块1828。

块1828示出end_phase()API例程检查下一个DIDS 1202,以确定其缺省字段1229是否具有非空值。如果当前DIDS 1202没有包含非空缺省字段1229,则该过程返回到块1824,其表示end_phase API例程在由当前顶层指针1250指向的顶层DIDS 1202的子树中继续DIDS 1202的递归处理。如果缺省字段1229包含非空值,则该过程传到块1830,其示出确定是否设置了Dial设置字段1239,也就是,是否先前在图18A的块1804显式设置了Dial实例。如果设置了Dial设置字段1239,则忽略包含在缺省字段1229中的缺省值(因为模拟用户已经显式指定了关联Dial实例的值)。并且由于模拟数据库1400被构造成具有指定缺省值的DIDS 1202的任何后代不能具有缺省值,因此该过程传到块1836,其示出end_phase()API例程在当前DIDS 1202的子树中跳过任何DIDS 1202的处理。然后,该过程返回到已经描述过的块1824。

返回到块1830,响应于确定没有设置当前DIDS 1202的Dial设置字段1239,则该过程进入块1832。块1832示出end_phase()API询问当前DIDS 1202的阶段ID字段1227,以确定存储在缺省字段1229中的缺省值是否具有一个或多个关联阶段ID。如果否,则该过程传到下面描述的块1833。响应于在块1832确定阶段ID字段1227存储至少一个阶段ID,end_phase()API下一步在块1834确定end_phase()API调用的阶段参数是否指定匹配包含在阶段ID字段1227内的阶段ID的阶段ID。如果没有找到匹配,则该过程从块1834传到已经描述过的块1836。另一方面,如果在end_phase()API调用的阶段参数中指定的阶段ID匹配于包含在当前DIDS 1202的阶段ID字段1227内的阶段ID,则end_phase()API下一步在块1835确定包含在当前DIDS 1202的实例名称字段1234中的Dial实例名称是否匹配于作为end_phase()API调用的instance_qualifier参数传递的限定表达式。再次,响应于块1835的否定确定,则该过程传到已经描述过的块1836。另一方面,如果包含在实例名称字段1234内的Dial实例名称符合instance_qualifier参数,则该过程进入下面描述的块1838。

回到块1833,如果当前DIDS 1202没有一个或多个在阶段ID字段1227内指定的阶段ID,则进一步确定end_phase()API调用的unnamed参数是否具有真值,以表示在当前阶段期间应施加没有任何关联阶段信息的缺省值。如果否,则该过程从块1833传到已经描述过的块1836。另一方面,如果end_phase()API在块1833确定在当前阶段期间应该施加没有关联阶段信息的缺省值,则该过程进入上面已经描述过的块1835。

因此,当end_phase()API到达块1838时,通过在1830、1832、1833、1834和1835示出的确定,end_phase()API确定了在批模式执行的当前阶段应施加为对应于当前DIDS 1202的Dial实例指定的缺省值。从而,在块1838,end_phase()API例程将在缺省字段1229中指定的缺省值施加于映射表1224,以生成一个或多个Dial输出信号,然后以前面描述过的方式将该信号沿着当前DIDS 1202的Dial树向下传播,从而最终将配置数据库1404内每个底层锁存器数据结构1204的锁存器值字段1246和锁存器设置字段1248设成对应于Dial缺省值的值。然后,该过程从块1838进入已经描述过的块1836。

回到块1822,响应于确定采用上述方式处理了由顶层指针1250指向的所有DIDS 1202的Dial树以施加任何适当的缺省值,该过程下一步传到块1840。块1840示出end_phase()API检查end_phase()API调用的apply参数,以确定是否应将锁存器数据结构1204内的配置锁存器值施加于模拟模型1400。通过该确定表示的附加控制度是有利的,因为可具有冲突阶段ID的模拟模型1400的不同部分可在不同阶段独立地在配置数据库1404内进行配置,但是如果需要,结果配置锁存器值可同时施加于模拟模型1400。如果apply参数具有假值,其意味着在当前阶段期间将不对模拟模型1400施加配置锁存器值,则该过程直接传到块1844。

然而,如果如apply参数值为真所指示,在当前阶段期间要对模拟模型1400施加配置锁存器值,则end_phase()API例程进入块1842。在块1842,end_phase()API利用锁存器指针数组1210,以检查配置数据库1404中的每个锁存器数据结构1204。对于锁存器设置字段1248具有真值的每个锁存器数据结构1204,end_batch()API例程发出对模拟器1410的PUTFAC()API 1414的调用,以采用包含在锁存器值字段1246中的锁存器值更新模拟模型1400。另外,如块1844所示,end_phase()API执行锁存器设置字段1248的值与设置历史字段1249之间的逻辑或操作,从而在设置历史字段1249内存储结果。以这种方式,每个设置历史字段1249维护在批模式过程的任何阶段是否设置了对应配置锁存器的指示。

在块1844之后,end_batch API进入块1846,其示出end_batch API例程在准备下一个阶段(若有的话)中复位DIDS 1202中的所有Dial设置字段1239和所有锁存器设置字段1248。然后,end_phase API例程终止于块1848。

总之,end_phase()API例程将Dial缺省值施加于匹配限定阶段和instance_qualifier的配置数据库1404,然后根据apply参数可选地将结果配置锁存器值施加于模拟模型1400。最后,end_phase()API例程利用设置历史字段1249跟踪哪些锁存器数据结构1204已被设置,并且复位各个设置字段以准备下一个阶段(若有的话)。

到此为止,已经仅关于在HDL文件800或配置指定文件802内指定的设计者提供的阶段信息描述了缺省值。对于很多模拟模型1400,设计者只有模拟模型1400的引导序列和对应硬件实现的有限知识,因此对于适当地初始化模拟模型1400或对应硬件实现所需的缺省值的阶段化只有有限的理解。因此,期望向下游用户如模拟用户、实验用户或实施支持人员提供指定控制Dial缺省值施加的阶段信息的能力。

如图18C所示,在一个实施例中,允许用户利用程序1860提供和/或修改存储在配置数据库1404或对应硬件配置数据库(下面讨论)的阶段ID字段1227内的阶段ID。程序1860包括一组数据库操纵API例程1862,当以适当参数调用时,允许用户在配置数据库1404(或对应硬件配置数据库)内读取和写入阶段ID。

再次参照图14,配置API 1406最好还包括find_unset_latch()API,在配置数据库1404中对Dial或Dial组实例进行批模式设置之后,参考锁存器指针数组1210审核配置数据库1404中的所有锁存器数据结构1204,以便检测尚未通过显式或缺省设置配置的配置锁存器(即,具有设为假(FALSE)的设置历史字段1249的配置锁存器)。对于每个这样的未被设置的配置锁存器,find_unset_latch()API最好从对应锁存器数据结构1204中的锁存器名称字段1244以及控制未被设置的锁存器的顶层Dial实例的完全限定实例体标识符返回配置锁存器的完全限定实例名称。因此,find_unset_latch()API提供一种自动机制,让用户验证需要显式或缺省设置的所有Dial和锁存器实例被正确配置,以进行模拟运行。

配置API 1406最好还包括check_model()API,当被调用时,其利用顶层指针数组1206来参考适当的映射表1224验证模拟模型1400中的每个顶层CDial和LDial实例设为其合法值之一。设为合法值的任何顶层LDial或CDial通过check_model()API来返回。

本发明所引入的Dial和Dial组原语可用来不仅配置如上所述的数字设计的模拟模型,而且配置用于实验测试和客户使用的数字设计的硬件实现。根据本发明的一个重要方面,数字设计的硬件实现通过参考硬件配置数据库来配置,其中硬件配置数据库如同上述配置数据库814和1404一样,从由设计者编码的配置指定语句获得。以这种方式,从数字设计的设计,通过模拟和实验测试到其商业实施都存在配置方法的连续性。

现在参照图19,其示出了根据本发明实施例用于测试和调试一个或多个数字设计的硬件实现的实验测试系统的高层方框图。如图所示,实验测试系统1900包括旨在商业销售和实施的数据处理系统1902。对于实验测试和调试,数据处理系统1902通过测试接口1903耦合于工作站计算机1904,其通过测试接口1903与数据处理系统1902通信,以配置数据处理系统1902的各个组件以进行正确的操作。当被商业实施时,数据处理系统1902包括所示组件,但是典型地不通过测试接口1903耦合于工作站计算机1904。

数据处理系统1902可以是例如多处理器计算机系统,如图1的数据处理系统6。同样地,数据处理系统1902包括表示数据处理系统的各个处理单元、控制器、桥和其他组件的多个集成电路芯片1910。作为典型的商业数据处理系统,数据处理系统1902可包含一些集成电路芯片如集成电路芯片1910a的多个实例,以及其他集成电路芯片如集成电路芯片1910n的单个实例。

除了其各自的功能逻辑之外,集成电路芯片1910均还具有各自的测试端口控制器1912,其支持利用多个扫描链对集成电路芯片进行外部配置,如下面参照图20所详述。为了允许该外部配置,每个测试端口控制器1912通过测试访问端口(TAP)1914耦合于数据处理系统1902内的服务处理器1920。

服务处理器1920是用来例如在通电时或者响应重启而初始化和配置数据处理系统1902的通用或专用计算机系统。服务处理器1920包括至少一个用于执行软件指令的处理单元1922a、为软件和数据提供非易失性存储的快闪只读存储器(ROM)1924、将服务处理器1920与测试端口控制器1912和工作站计算机1904接口的I/O接口1926a、以及缓冲指令和数据以由处理单元1922a访问的易失性存储器1928a。

存储于快闪ROM 1924中的软件和数据包括系统固件1930a。系统固件1930a在通电时由服务处理器1920的处理单元1922a执行,以供电给集成电路芯片1910,执行各种初始化过程和测试,同步集成电路芯片1910之间的通信,并且启动功能时钟的操作。系统固件1930a通过经由测试访问端口1914的通信来控制集成电路芯片1910的启动行为。

除了系统固件1930a之外,快闪ROM 1924还存储描述集成电路芯片1910的硬件(HW)配置API 1934a和HW配置数据库1932a。如下所述,在商业实施期间,处理单元1922a调用各个HW配置API 1934a以访问HW配置数据库1932a,以便通过I/O接口1926a和TAP 1914适当地配置集成电路1910。

例如可实现为多处理器计算机系统如图1的数据处理系统6的工作站计算机1904包括在功能上类似于服务处理器1920的很多组件。因此,相同的附图标记表示处理单元1922b、易失性存储器1928b、I/O接口1926b以及驻留在非易失性存储装置1934(例如,盘存储装置)中的系统固件1930b、HW配置数据库1932b和HW配置API 1934b。本领域的技术人员应当理解,由于驻留在非易失性存储装置1940中的系统固件1930b、HW配置数据库1932b和HW配置API 1934b被具体设计成在实验测试和调试的上下文中初始化和配置数据处理系统1902,因此与快闪ROM 1924内的对应软件和数据相比,它们可具有更小、更大或简单不同的特性集和能力。

在实验测试和调试期间,工作站计算机1904采取服务处理器1920的大部分功能。例如,工作站计算机1904通过执行系统固件1930b和各个HW配置API 1934b来初始化和配置数据处理系统1902,从而生成各个I/O命令。然后,通过测试接口1903以及I/O接口1926a和1926b,将这些I/O命令传送到数据处理系统1902。在其本地功能性的大部分被禁止的“旁路”模式下,在服务处理器1920内执行的系统固件1930a通过测试访问端口1914向集成电路芯片1910发出这些外部I/O命令而响应这些命令,从而初始化和配置集成电路芯片1910。

现在参照图20,其示出了根据本发明的示例性集成电路芯片1910的更详细方框图。如上所述,集成电路芯片1910包括测试端口控制器2000,其支持与图19的服务处理器1920的I/O接口1926进行外部通信以及控制集成电路芯片1910的各个内部功能,包括功能时钟2002和扫描时钟2010的操作。集成电路芯片1910还包括功能逻辑(未显式示出),其包括响应于功能时钟2002的时钟脉冲而执行集成电路被设计所做的“工作”,例如,处理软件指令。多个功能锁存器2004分布在功能逻辑电路内,在功能逻辑的正常功能操作期间(即,当功能时钟2002对功能逻辑进行定时时),这些功能锁存器2004保存表示功能逻辑的动态状态以及数据和/或指令的比特。这些功能锁存器2004包括保存用来以期望的配置来配置功能逻辑的模式和配置比特的功能锁存器。

如图所示,成组的功能锁存器2004互连在一起,以形成多个测试扫描链2006和多个SCOM(扫描通信)链2008。虽然为了简洁起见而未示出,但是一些功能锁存器2004实际上既是测试扫描链2006的成员又是SCOM链2008的成员。测试扫描链2006用来响应于扫描时钟2010的脉冲而扫描比特到功能锁存器2004中,并且SCOM链2008用来响应于功能时钟2002的脉冲而扫描比特到功能锁存器2004中。功能时钟2002和扫描时钟2010不同时输出脉冲,以防止装载到功能锁存器2004中的值之间的冲突。

如图所示,测试扫描链2006中的每个功能锁存器2004包括至少两个数据输入,即扫描输入(scanin)和功能输入(Din),以及两个时钟输入,即扫描时钟输入(sclk)和功能时钟输入(fclk)。每个功能锁存器2004还包括至少两个数据输出,即扫描输出(scanout)和功能输出(Dout)。为了形成测试扫描链2006,第一功能锁存器2004的扫描输入和最后功能锁存器2004的扫描输出耦合到测试端口控制器2000,并且测试扫描链2006中每个功能锁存器2004的扫描输出(除了最后一个)连接到下一个功能锁存器2004的扫描输入。

响应于sclk上扫描时钟2010的脉冲,每个功能锁存器2004输入(latch in)其scanin上的数据比特,并且在scanout上输出(latch out)其先前值,并且响应于在fclk上接收到功能时钟2002的脉冲,输入Din上的数据比特,并且输出其先前值。因此,通过扫描时钟2010的重复脉冲发生,形成测试扫描链2006的功能锁存器2004以“比特组桶(bit-bucket brigade)”的方式从测试端口控制器2000传入数据比特和向其传出数据比特,从而允许测试端口控制器2000读取或写入测试扫描链2006中的一个或多个功能锁存器2004。

SCOM链2008用来当功能时钟2002有效并且扫描时钟2010无效时读取和写入功能锁存器2004。每个SCOM链2008包括多个顺序连接的SCOM单元2012,其中的第一个和最后一个连接到测试端口控制器2000,以允许测试端口控制器2000将数据比特扫描到SCOM单元2012中和从SCOM单元2012扫描出数据比特。如图所示,在示例性实施例中,每个SCOM单元2008包含形成“SCOM寄存器”的一部分的功能锁存器2004,以及形成“影象寄存器(shadow register)”的一部分的影象锁存器2014。如果所有影象寄存器2014如功能锁存器2004一样也属于测试扫描链2006,则是优选的。

如图所示,每个SCOM单元2012中的每个功能锁存器2004连接到关联多路复用器2020,其扫描输入(scomin)耦合于对应影象锁存器2014的输出,并且其数据输入(Din)通过保存路径耦合于关联功能锁存器2004的数据输出(Dout)。多路复用器2020响应于选择信号sel2而选择数据输入(Din)和scomin之一上的数据比特,作为功能锁存器2004的输入。功能锁存器2004响应于功能时钟fclk而锁存所选数据比特。

每个SCOM单元2012中的影象锁存器2014类似地连接到具有数据输入(Din)、保存输入和扫描输入(scomin)的关联多路复用器2022,其数据输入(Din)耦合于功能锁存器2004的数据输出(Dout),并且其保存输入通过保存路径耦合于影象锁存器2014的输出。在第一SCOM单元2012中,扫描输入连接到测试端口控制器2000,并且在其余SCOM单元2012中,扫描输入连接到前一SCOM单元2012中的影象锁存器2014的输出。每个SCOM链中最后SCOM单元2012的影象寄存器2014的输出连接到测试端口控制器2000。多路复用器2022响应于选择信号sel1而从其输入上的数据比特中进行选择,作为关联影象锁存器2014的输入。影象锁存器2014响应于功能时钟fclk而锁存所选数据比特。

影象寄存器链用来从关联SCOM寄存器读取值和向其写入值。例如,为了设置SCOM寄存器,测试端口控制器2000通过维护(asserting)选择sel1的适当值、经由多路复用器2022的scomin输入将新值扫描到影象锁存器2014中。一旦所有影象锁存器2014都被装载,测试端口控制器2000就控制选择输入sel2,以使功能寄存器2004从影象锁存器2014装载值。为了从SCOM寄存器读取值,测试端口控制器2000驱动sel1,以将值从功能锁存器2004读取到影象锁存器2014中,然后通过维护选择sel1的适当值来扫描出影象锁存器2014中的值。

在示例性实施例中,SCOM链2008采用影象锁存器2014以读取和写入功能锁存器2004,从而避免破坏集成电路芯片1910或者甚至是数据处理系统1902的正确功能操作。通过在更新任何功能锁存器2004之前装载所有影象锁存器2014,SCOM链2008内的所有功能锁存器2004可以立即被更新,而不会在功能时钟2002的多个周期内破坏其值。应当理解的是,实现本发明不要求图20所示的SCOM链2008的特定实现,并且可以采取其他可选设计,包括不含有影象锁存器2014的一些设计。

这样,通过将适当值装载到功能锁存器2004中,并且通过功能时钟2002和扫描时钟2010的适当控制,每个测试端口控制器2000可以根据来自服务处理器1920和/或工作站计算机1904的输入,以期望方式初始化和配置其集成电路芯片1910。

为了以上述方式配置硬件功能锁存器2004,必须生成考虑模拟和硬件环境之间的差异的HW配置数据库1932。一般而言,HW配置数据库1932的结构和内容反映与上述用于模拟的配置数据库814的至少两个主要区别。

第一区别是采用在硬件中对锁存器进行寻址的方式。具体而言,代替如在模拟中利用配置锁存器的完全限定实例体标识符,通过由指定特定测试扫描链2006的扫描链(或环)标识符和表示测试扫描链2006中锁存器的比特位置的偏移组成的有序对来寻址和访问特定集成电路芯片1910内的每个硬件功能锁存器2004,以进行测试扫描。SCOM环2008内的功能锁存器2004类似地使用(环标识符,偏移)的类似有序对被寻址和访问,以进行SCOM扫描,其中该有序对指定特定SCOM链2008和对应的影象锁存器2014的偏移。重要的是,SCOM环标识符和特定功能锁存器2004的偏移没有与对应测试扫描环标识符和偏移相同的值。实际上,在可选SCOM实现中,可使用不同SCOM硬件,并且偏移可被表达为多元组:(环ID,寄存器,偏移)。因此,应当理解的是,功能寄存器2004可利用多种访问方法被寻址和访问,其中每一种访问方法都可具有其自己的寻址方案,所有这些方案同样将不同于在模拟中所采用的方案。

HW配置数据库1932与在模拟中所采用的配置数据库814之间的第二个重要区别是总体数据库结构。如上所述,配置数据库814是可用来通过分层嵌套设计实体表示任何大小或复杂度的任意选定数字设计的单一数据库。新配置数据库814针对所模拟的每个不同数字设计由配置编译器808生成。虽然该方法在模拟环境中是令人满意的,但是在模拟中所采用的单一数据库结构不对应于用来访问和设置硬件数字设计中的硬件锁存器的实际物理机制。而且,期望在实验环境中避免针对每个不同硬件排列而开发完全新的系统固件1930和HW配置数据库1932。例如,期望通过再使用特定HW配置数据库1932和系统固件1930的一些或全部,以初始化和配置支持8到32个处理单元以及1到4个不同存储器控制器的服务器产品线中的每个服务器计算机,来最小化开发时间和成本。

因此,如下详细所述,HW配置数据库1932最好构造成较小数据库的联合体,其中每个较小数据库对应于硬件数字设计内的集成电路芯片的特定类型(而非实例)。该数据库结构支持从相同“构建块”逐芯片类型数据库构造任何期望大小和复杂度的硬件系统的HW配置数据库1932。而且,该数据库结构反映硬件锁存器逐芯片地由系统固件1930进行访问这一事实。

现在参照图21,其示出了转换每个集成电路芯片的模拟配置数据库814以获得用来构造适合于实验测试和调试以及商业实施的HW配置数据库1932的芯片HW数据库的示例性过程的高层流程图。所示过程可通过在图1的数据处理系统6上执行软件来实现。

该过程开始于执行扫描链检测工具2100。扫描链检测工具2100处理目标硬件系统如数据处理系统1902内每个集成电路芯片1910的模拟模型1400,以为集成电路芯片1910内的锁存器产生对应于每个功能锁存器访问路径/方法的各个输出文件。例如,在该示例性实施例中,扫描链检测工具2100产生对应于测试扫描的测试扫描定义文件2104和对应于SCOM扫描的SCOM定义文件2102。这些文件2102、2104的每一个为模拟模型1400内的锁存器提供锁存器的扫描环标识符和偏移(或者关联访问方法的其他硬件地址)与用于模拟目的的其完全限定锁存器实例名称之间的对应关系。

然后,由数据库转换工具2106处理集成电路芯片的测试扫描定义文件2104和SCOM定义文件2102以及模拟配置数据库814,以生成芯片HW数据库2108,其可用作构建块,以获得具有任意系统大小和组件列表的硬件系统的HW配置数据库1932。

现在参照图22A,其示出了数据库转换工具2106参考测试扫描定义文件2104和SCOM定义文件2102,从集成电路芯片的对应模拟配置数据库814产生芯片HW数据库2108的示例性过程的高层逻辑流程图。如图所示,该过程开始于块2200,然后进入块2201,其示出将模拟配置数据库814从非易失性数据存储装置装载到易失性存储器中,并且以上面参照图13所述的方式增加其字段,以获得展开的配置数据库1404。测试扫描定义文件2104和SCOM定义文件2102也被装载到易失性存储器中。

下一步,在块2202,确定由锁存器指针数组1210引用的所有锁存器数据结构1204是否都被处理。如果是,则该过程终止于块2204。然而,如果不是所有锁存器数据结构1204都已经被处理,则该过程从块2202传到块2206,其示出进行选择以处理由锁存器指针数组1210中的下一个锁存器指针1254指向的锁存器数据结构1204。下一步,在块2208,通过使用父指针1242访问控制该锁存器的Dial实例的实例名称字段1234的内容并将这些内容附加到锁存器名称字段1244的内容,形成与当前考虑的锁存器数据结构1204相对应的锁存器的完全限定锁存器名称。

然后,在测试扫描定义文件2104内搜索该完全限定锁存器名称,如块2210所示。如果在测试扫描定义文件2104内没有找到该完全限定锁存器名称,则在块2212标志错误,因为在该示例性实施例中,所有可配置锁存器必须是可扫描的。否则,数据库转换工具2106在块2214调用API例程add_access_method(method_id,method_name),以扩大锁存器数据结构1204从而形成新锁存器数据结构2230。该API调用的method_id(方法ID)参数标识特定访问方法(例如,采用字符串或整数),并且method_name(方法名称)参数指定由关联访问方法用来在硬件中访问对应于新锁存器数据结构2230的锁存器的“名称”。如图22B所示,在块2214,通过向锁存器数据结构1204增加指定该访问方法的方法标识符的方法ID字段2232a(按照惯例为“0”),和指定锁存器的测试扫描环标识符和偏移值的方法名称字段2234a,创建新锁存器数据结构2230。

该过程从块2214进入块2216,其表示使用下一个访问方法的定义文件,在本例中为SCOM定义文件2102,来重复在块2210执行的对完全限定锁存器实例名称的搜索。如果在SCOM定义文件2102内没有找到与完全限定锁存器实例名称的匹配,则不记录错误,因为不是所有锁存器都属于SCOM链,并且该过程简单地传到下面描述的块2220,另一方面,如果找到匹配,则在块2218再次调用add_access_method()API例程,以向锁存器数据结构2230增加指定该访问方法的方法标识符的方法ID字段2232n和指定锁存器的SCOM扫描环标识符和偏移值的方法名称字段2234n。

最后,在块2220,调用API例程delete_latch_name()来从锁存器数据结构2230中删除锁存器名称字段1244。由于环标识符和偏移对唯一标识集成电路芯片1910内的任何锁存器,因此不再需要锁存器名称字段1244。然后,该过程返回到已经描述过的块2202。

这样,图22A的方法改变每个集成电路芯片的模拟配置数据库,以包括表示可用于每个硬件功能锁存器的访问方法和每种可用访问方法的锁存器“方法名称”(即标识符)的信息。虽然所示的过程示出修改模拟配置数据库以支持两种特定访问方法,但是所示方法可用来处理任何数目或类型的访问方法。

一旦以图21和22A所示的方式处理了系统内每个集成电路的所有模拟配置数据库,则可以组合得出的芯片硬件数据库2108,以形成图19所示的HW配置数据库1932。在优选实施例中,通过创建芯片指针数据结构2320(图23B)来从芯片HW数据库2108构造HW配置数据库1932,其中芯片指针数据结构2320包含引用数据处理系统1902中每种芯片类型的芯片HW数据库2108的各个芯片数据库指针2322。例如,如果数据处理系统1902包括32个相同的集成电路处理器芯片,则芯片指针数据结构2320(除了与其他集成电路芯片类型相对应的其他芯片数据库指针2322之外)将仅包含一个芯片数据库指针2322,其指向描述由32个集成电路处理器芯片实施的数字设计的单个芯片HW数据库2108。然后,将该HW配置数据库1932存储在非易失性存储装置中,如非易失性存储装置1940或快闪ROM 1924,如图19所示。

为了利用HW配置数据库1932配置硬件数字设计,首先根据图23A所示的示例性过程,将HW配置数据库1932从非易失性存储装置装载到易失性存储器中。图23A所示的过程可以通过由处理单元1922b执行系统固件1930b、例如由工作站计算机1904在实验环境中执行。类似地,当商业实施数据处理系统1902时,服务处理器1920根据图23A的过程执行系统固件1930a,以将HW配置数据库1932a从快闪ROM 1924装载到易失性存储器1928a。

如图所示,图23A的过程开始于块2300,然后进入块2302,其示出确定目标数据处理系统如数据处理系统1902内集成电路芯片的类型以及每种类型的数目。在示例性实施例中,由系统固件1930进行块2302所示的确定,其咨询一组所谓的关键产品数据(VPD),以确定数据处理系统1902表示上千种可能机器配置中的哪一种。

然后,该过程进入块2306-2310,其一起形成循环,其中在芯片指针数据结构2320内走动(walk),以处理组成数据处理系统1902的集成电路芯片的芯片HW数据库2108。首先,在块2306,确定数据处理系统1902内每种集成电路芯片类型的芯片HW数据库2108是否都被处理。如果是,则完成将HW配置数据库1932装载到易失性存储器中,并且该过程终止于块2312。然而,如果与由VPD标识的每种集成电路芯片类型相对应的芯片HW数据库2108尚未被处理,则在块2308将下一个芯片HW数据库2108装载到工作站1904的易失性存储器1928中以作处理。

如示出HW配置数据库1932的存储器内视图的图23B所示,芯片HW数据库2108的装载创建如上所述的存储器内数据结构,如Dial指针数组1208、锁存器指针数组1210、以及每个DDDS 1200内的实例指针数组1226(见图12)。另外,在每个锁存器数据结构2230内创建锁存器值字段2324、锁存器设置字段2326和设置历史字段2325,并且在每个DIDS 1202内创建Dial设置字段2328。这三个字段的每一个被实现为数组,其中每个条目对应于与当前芯片HW数据库2108相对应的集成电路芯片1910的特定实例。最后,创建空芯片映射表2325。

下一步,在块2310,针对对应于当前芯片HW数据库2108的集成电路芯片类型的每个实例,将相应的条目增加到芯片映射表2325。该步骤最好通过对HW配置API 1934的调用由系统固件1930执行,其中该调用访问VPD,以确定在当前硬件数字设计中包含了对应于当前芯片HW数据库2108的集成电路芯片类型的多少实例。按照惯例,芯片映射表2325内的条目次序对应于Dial设置字段2328、锁存器值字段2324和锁存器设置字段2326中数组条目的次序。

如图23B所示,芯片映射表2325内的每个条目关联两个固件提供的值:(1)芯片实例名称,其是如同在数据处理系统1902的模拟模型中标识表示集成电路芯片实例的设计实体的字符串一样的字符串(例如,a.b.c.d),和(2)芯片ID,指定服务处理器1920通过其与那个集成电路芯片实例通信的测试访问端口1914的标识符。这样,数据处理系统1902中的任何锁存器现在可容易地通过多元组(芯片ID,扫描环,偏移)来寻址,该多元组由芯片映射表2325与HW配置API 1934所采用的完全限定锁存器名称的芯片标识部分相关联。然后,该过程返回到已经描述过的块2306。

这样,图23A所示的过程允许利用单个HW配置数据库1932来为任意尺寸或配置的数据处理系统构建存储器内HW配置数据库,从而消除了为每一个可能的系统大小和配置开发和存储独立的单一配置数据库的需要。

在HW配置数据库1932被装载到易失性存储器1928中的情况下,系统固件1930然后可由服务处理器1920的处理单元1922a或工作站计算机1904的处理单元1922b执行,以调用HW配置API 1934来读取或设置数据处理系统1902的一个或多个集成电路芯片1910的配置。如同在模拟中一样,HW配置API 1934最好包括独立API例程,以在交互和批模式中读取Dial和Dial组。如同模拟一样,系统固件1930的API调用为所要设置或读取的每个Dial或Dial组实例指定实例限定符(例如,a.b.c.d或a.b.c.[X])和Dial名称限定符(例如,实体.Dial名称)。

由于可利用多种访问方法来设置或读取Dial或Dial组,因此用来设置或读取Dial或Dial组实例的API调用最好包括附加参数access_method(访问方法)。在优选实施例中,access_method参数可取值:SCAN,表示测试扫描;SCOM,表示SCOM扫描;以及AUTO,表示HW配置API 1934将选择访问方法。响应于access_method参数的AUTO值,HW配置API 1934根据API调用所针对的锁存器数据结构2230中的方法ID 2232所表示的支持访问方法、以及功能时钟2002和扫描时钟2010中的哪一个正在运行,来选择访问方法。如上所述,SCOM扫描仅可用于功能时钟2002正在运行时,并且测试扫描仅可用于扫描时钟2010正在运行时。

在任何HW配置API 1934可设置或读取Dial或Dial组实例之前,HW配置API 1934必须首先确定在API调用中指定的实例限定符和Dial名称限定符标识了哪些Dial或Dial组实例。现在参照图24,示出了根据本发明,HW配置API 1934在HW配置数据库1932中定位特定Dial或Dial组实例的示例性过程的高层逻辑流程图。所示过程类似于图15所示和上面所述的过程。

如图所示,该过程响应于HW配置API 1934接收到以一个或多个Dial或Dial组实例的实例限定符和Dial名称限定符为参数的、来自固件1930的API调用而开始于块2400,如上所述。响应于该API调用,配置API 1934在芯片指针数组2320进入HW配置数据库1932,并且如块2402所示进入循环,其中处理芯片数据库指针2322,直到在特定芯片HW数据库2108内定位了一个或多个匹配Dial实例为止,或者直到所有芯片数据库指针2322都被处理为止。响应于在块2402确定所有芯片数据库指针2322都被处理而没有定位任何匹配Dial实例,则该过程以错误终止于块2403。然而,如果少于所有芯片数据库指针2322已被处理,则从芯片指针数据结构2320中选择下一个芯片数据库指针2322以作处理,如块2406所示。利用所选芯片数据库指针2322来定位关联芯片HW数据库2108。

在块2406之后,该过程进入块2408和下面块,其表示处理循环,其中处理当前芯片HW数据库2108的Dial指针数组1208中的每个Dial指针1252,直到定位了匹配API调用的特定Dial为止,或者所有Dial指针1252(图12)都已经被处理而没有找到任何匹配Dial实例为止。响应于在块2408确定所有Dial指针1252都被处理而没有定位任何匹配Dial实体,该过程从块2408返回到块2402,从而处理芯片指针数组2320中的下一个芯片数据库指针2322(即,处理下一个芯片HW数据库2108)。另一方面,如果在块2408确定不是Dial指针数组1208内的所有Dial指针1252都已经被处理,则该过程进入块2410,其示出从Dial指针数组1208中选择下一个Dial指针1252以作处理。

下一步,在块2412确定由当前Dial指针1252引用的DDDS 1200是否具有精确匹配指定Dial名称限定符的名称字段1222。关于名称字段1222,两种实现是可能的。第一,可禁止Dial名称的再使用,以便每一个Dial名称不仅在其自己的集成电路芯片内而且在整个系统(例如,数据处理系统1902)内都是唯一的。第二,更少限制的方法是要求每个Dial名称仅在其集成电路芯片1910内是唯一的,并且允许在不同集成电路中多次使用Dial名称。为了支持第二方法,名称字段1222采取“chiptype(芯片类型).Dial name(名称)”的形式,其中“芯片类型”是标识集成电路芯片1910的类型的唯一字符串,从而消除应用于在不同集成电路芯片1910中实例化的Dial实体的相同Dial名称的歧义。

响应于在块2412确定名称字段1222不匹配指定Dial名称限定符,该过程返回到块2408,以处理下一个Dial指针1252(若有的话),如上所述。然而,如果找到匹配,则该过程进入包括块2420-2434的循环,其中利用匹配Dial实体的DDDS 1200的实例指针数组1226中的实例指针1228,检查由各个DIDS 1202表示的Dial实例,以与API调用的实例限定符进行匹配。在该处理循环中,首先在块2420确定当前DDDS 1200内的所有实例指针1228是否都被处理。如果是,则在块2434进一步确定是否找到对应于当前DDDS 1200的Dial实体的至少一个匹配实例。该确定是由于HW配置数据库1932的构造确保仅一个芯片HW数据库2108中的最多一个匹配Dial(而非Dial实例)将匹配在API调用中指定的实例限定符和Dial名称限定符而进行的。因此,如果找到特定Dial实体的匹配实例,则无需搜索另外的Dial实体或芯片HW数据库2108。从而,如果确定对于与当前DDDS 1200相对应的Dial实体找到至少一个匹配的Dial实例,则该过程从块2434传到块2438,并且终止。然而,如果在块2434确定没有找到匹配,则该过程通过页连接符A,并且以错误终止于块2403。

返回到块2420,响应于确定不是当前DDDS 1200的所有实例指针1228都已经被处理,则该过程进入块2422,其示出选择下一个实例指针1228及其关联DIDS 1202以作处理。然后,在块2424通过处理芯片映射表2326中的每个条目来确定对于与当前芯片HW数据库2108相对应的每一个集成电路芯片1910中的Dial实例,DIDS 1202是否被处理。如果是,则该过程传到下面描述的块2436。如果芯片映射表2325中的所有条目的处理尚未完成,则该过程进入块2426。

块2426示出通过将芯片映射表2325的下一个条目中的芯片实例名称预先挂起到当前DIDS 1202的实例名称字段1234来形成下一个完全限定Dial实例名称,以与在API调用中指定的实例限定符进行匹配。然后,在块2430将该完全限定Dial实例名称与实例限定符进行比较。如果它们不匹配,则该过程返回到已经描述过的块2424。如果它们匹配,则在块2432创建临时结果指针和关联芯片向量,如果它们不存在的话。临时结果指针指向当前DIDS1202,以标识对应的Dial实例与在访问请求中指定的实例限定符匹配。还在关联芯片向量中放置一个条目来表示在其内定位该匹配的Dial实例的特定集成电路芯片实例1910。在示例性实施例中,芯片向量可简单地包括与芯片映射表2325中的条目数相同的比特数,其中“1”的比特值表示对应的集成电路芯片实例1910包含匹配Dial实例。在块2432之后,该过程返回到块2424。

对芯片映射表2325中的每个条目重复由块2424-2432表示的处理循环。在所有条目都被处理之后,该过程从块2424传到块2436,其示出确定Dial名称限定符是否是利用不带方括号的语法来指定的,并且如果是,则确定在由当前DIDS 1202表示的Dial实例中是否找到指定Dial名称限定符的匹配。如果确定是否定的,则有可能可存在与另一个DIDS 1202相关联的另外的匹配Dial实例。从而,该过程返回到块2420,以处理当前DDDS 1200的下一个实例指针1228。然而,如果块2436的确定是肯定的,则已知所有匹配Dial实例都被定位,并且以临时结果指针和关联芯片向量被标识。因此,该过程终止于块2438。

在通过图24所示的过程确定了由实例限定符和Dial名称限定符指定的Dial或Dial组实例之后,以与上面参照图16A(在交互模式中读取Dial实例)、图16B(在交互模式中读取Dial组实例)、图17A(在交互模式中设置Dial实例)、图17B(在交互模式中设置Dial组实例)以及图18A-18B(在批模式中设置Dial实例或Dial组实例)所述大致相同的方式设置或读取Dial或Dial组实例。然而,需要一些区别来考虑使用单个芯片HW数据库2108,以表示可能多个集成电路芯片1910、以及用来访问集成电路芯片1910的多个不同访问方法的可用性。这些区别在下面进行详细描述。

当读取Dial实例或Dial组实例时,通过在配置数据库中沿着Dial树“向上”传播锁存器值来验证锁存器值,如参照图16A的块1624所述。相反,当设置Dial实例或Dial组实例时,在配置数据库中沿着Dial树“向下”传播Dial值到锁存器数据结构,如上面参照图17A的块1714所述。在模拟中,一次仅一个锁存器值“向下”传播到任何一个锁存器数据结构1204或从其“向上”传播。然而,由于HW配置数据库1932采用单个芯片HW数据库2108表示相同类型的多个集成电路芯片1910,因此参考表示多个物理集成电路芯片1910的芯片HW数据库2108读取或设置Dial或Dial组实例需要沿着Dial树并行向上或向下传播值集合的多个元素,其中该值集合的每个元素是由在图24中构造的临时结果指针和芯片向量标识的特定芯片实例的值。

类似地,在模拟中,配置数据库1404内的Dial设置字段1239、锁存器值字段1246、锁存器设置字段1248和设置历史字段1249的每一个仅包含单个值。相反,HW配置数据库1932内的对应Dial设置字段2328、锁存器值字段2324、锁存器设置字段2326和设置历史字段2325被实现为其中每个元素对应于特定集成电路芯片1910的各自Dial或锁存器实例的数组。从而,当设置Dial、Dial组或锁存器实例时,根据在图24中构造的临时结果指针和芯片向量,更新对应于设置实例的Dial设置字段2328、锁存器值字段2324、锁存器设置字段2326和设置历史字段2325内的元素。

由于HW配置数据库1932的实验或商业使用需要利用多个可能访问方法来访问物理硬件(即,集成电路芯片1910),因此在优选实施例中注意与模拟环境的三个另外区别。第一,如果HW配置API 1934确定包含在API调用内的access_method参数所表示的访问方法不可用于通过图24的过程获得的临时结果指针和芯片向量所标识的任何Dial实例,则在API调用中请求的设置或读取操作最好失败(即不被执行)。如上所述,可以设置或读取每个锁存器的访问方法由每个锁存器数据结构2230的方法ID字段2232表示。

第二,最好,只有HW配置API 1934确定API调用所针对的每个集成电路芯片1910内的功能时钟2002和扫描时钟2010处于包含在API调用内的access_method参数的适当状态,在API调用中请求的设置或读取操作才成功。也就是,如果access_method参数具有SCAN值,则功能时钟2002必须被禁用,而扫描时钟2010必须被启用。相反,如果access_method参数具有SCOM值,则功能时钟2002必须被启用,而扫描时钟2010必须被禁用。如果access_method参数具有AUTO值,则包含由API调用所针对的锁存器的每个集成电路芯片1910的功能时钟2002和扫描时钟2010必须处于允许采用每个这样的锁存器的至少一个访问方法的状态。

第三,用来读取和设置硬件锁存器的HW配置API 1934,read(读)_latch(锁存器)()和write(写)_latch()最好通过在易失性存储器1928中实现影象扫描链缓冲器、并在可能时代替扫描集成电路芯片1910中的扫描链而扫描该扫描链缓冲器来最小化对集成电路芯片1910的扫描访问。例如,在易失性存储器1928中的锁存器值已知为最新的情况下,与在模拟中采用的GETFAC()API1412相对应的read_latch()HW配置API 1934最好从易失性存储器1928中的对应影象扫描链缓冲器获得锁存器值。另外,通过与在模拟中利用的PUTFAC()API 1414相对应的write_latch()对锁存器值的多次更新最好在易失性存储器1928内的影象扫描链缓冲器中进行缓冲。通过这种方式,对集成电路芯片1910的特定扫描链中的锁存器的多次写入可通过仅扫描特定扫描链一次来进行。

HW配置API 1934最好还包括与可用于模拟中的check_model(检查模型)()API类似的check_chip(检查芯片)()API。当被调用时,check_chip()API利用指定芯片HW数据库2108内的顶层指针数组1206,以验证芯片HW数据库2108内的每个顶层CDial和LDial实例设为其合法值之一。具体地说,check_chip()API通过参考其映射表1224和其Dial树中任何低层Dial实例的映射表1224,沿着每个顶层CDial和LDial实例的Dial树向上传播底层硬件锁存器值。通过check_chip()API返回设为非法值的任何顶层LDial或CDial实例。

再次参照图19,在数据处理系统1902的很多商业实施例中,服务处理器1920内的非易失性存储装置(例如,快闪ROM 1924)的存储容量显著小于用来存储系统固件1930b和HW配置数据库1932b的工作站计算机1904的非易失性存储装置1940(例如,硬盘存储装置)的存储容量。从而,通常期望或需要减小在实验硬件测试环境中开发的系统固件1930b和HW配置数据库1932b的大小,以获得在数据处理系统1902的快闪ROM 1924(或其他非易失性存储装置)内商业实施的系统固件1930a和HW配置数据库1932a。

从而,现在参照图25,其示出了可通过消除不必要信息来压缩在系统固件1930的实验开发和测试期间所开发的每个芯片HW数据库2108、从而获得适于商业实施的HW配置数据库1932a的示例性过程的高层逻辑流程图。该过程开始于生成Dial使用信息2500,其表示集成电路芯片1910的特定类型内的哪些Dial实例已被设置和/或读取以及Dial实例已被设置的值。

确定哪些Dial实例被设置或读取以及Dial实例已被设置的值可采用本领域的技术人员所公知的很多方法来完成。例如,可人工检查系统固件1930以产生Dial使用信息2500。或者,系统固件1930可以在多个可能机器配置中执行,这些可能机器配置覆盖当前考虑的集成电路芯片1910的类型中的Dial实例可被设置的所有设置。被设置和读取的Dial实例和Dial实例被设置的值然后可被记录为Dial使用信息2500。

在优选实施例中,在IDial实例的Dial使用信息2500内记录的所有信息是IDial实例是否被设置或读取。没有记录IDial实例值,是因为为了生成Dial使用信息2500的目的而假定如果IDial实例被设置,则可利用所有其可能值。然而,存在开发者所知道的特定IDial实例将仅设为单个值。为了允许从HW配置数据库1932a中消除这些IDial,这些IDial及其关联值可以可选地由开发者在覆盖文件2502内指定。覆盖文件2502还可包含开发者期望显式地在HW配置数据库1932a内保持、而与Dial实例是否被设置或读取无关的Dial实例列表(若有的话)。

这样,对于每个芯片HW数据库2108,最好获得一起包含至少下列信息的Dial使用信息2500和覆盖文件2502:

1)任何配置中集成电路芯片的任何实例内被设置的所有顶层非IDial实例的列表,以及任何配置中集成电路芯片的任何实例内设为任何值的任何顶层IDial的列表;

2)被设置的每个非IDial实例的所有值的列表;

3)设为单个值的IDial的单独列表;以及

4)被读取的所有Dial实例的列表。

如图25进一步所示,然后,由软件压缩工具2504(例如,由工作站计算机1904执行)利用该信息来从关联芯片HW数据库2108中消除不必要的信息。压缩工具2504产生两个输出:(1)形成HW配置数据库1932a的一部分的压缩芯片HW数据库2506;以及(2)用来产生在系统固件1930a的执行期间集成电路芯片1910中的测试扫描链2006被初始化的扫描链映像的初始扫描链映像2508。正如所示,这些初始扫描链映像2508可以非破坏性地与另外的扫描链输入2510进行组合,以获得最终的扫描链映像2512。

现在参照图26A-26C,其示出了根据本发明的压缩工具2504压缩芯片HW数据库2108的方法的高层逻辑流程图。如下面详细所述,所示方法实现至少三种大小优化。

第一,如果Dial实例将从不被系统固件1930a设置或读取,则可从芯片HW数据库2108消除与Dial实例相关的信息。由于该Dial实例从不被系统固件1930a设置或读取,因此在HW配置数据库1932a内将从不引用对应于该Dial实例的DIDS 1202,因此可删除它。值得注意的是,系统固件1930a不设置或读取Dial实例不意味着在模拟或实验调试期间不设置或读取该Dial实例。很多Dial实例(例如,模式开关)从不被系统固件1930a设置,但是在模拟期间被测试,以确保如果以后的固件修订版需要的话,模式开关也正常工作。

与Dial实例相关的信息可能是多余的第二原因是如果Dial实例在所有配置中仅设为一个值。在这种情况下,可从芯片HW数据库2108中删除对应于该Dial实例的DIDS 1202,因为设置Dial实例的效果可通过以设置Dial实例而获得的锁存器值来设置扫描到集成电路芯片1910中的最终扫描链映像2512来代替实现。设置Dial实例的系统固件1930b内的代码同样可被消除,以减小从实验测试和调试最终获得的系统固件1930a的大小。

第三,DDDS 1200中的映射表1224可通过消除Dial从不被系统固件1930a设置的值来优化。

在进行前述优化中,对被读取的Dial实例给予特殊考虑。一般而言,当读取Dial实例时,在下述示例性压缩方法中假定包含被读取Dial实例的整个Dial树必须保持在其芯片HW数据库内。另外,假定必须保持包含被读取Dial实例的Dial树中Dial的映射表内的所有条目,因为在商业实施中,硬件可将底层锁存器设为不同于由系统固件读取的值。因此,不能推理地确定将需要哪些映射表条目来读取Dial实例。虽然这些假定限制压缩,但是它们确保被读取的每个Dial实例可被容易地访问,而不管Dial实例是顶层Dial实例还是低层Dial实例。

首先参照图26A,该过程开始于块2600,然后进入块2602,其示出压缩工具2504将芯片HW数据库2108装载到易失性存储器1928b中,并且创建存储器内数据结构1208、1210和2325,如上所述。另外,如块2604所示,压缩工具2504与每个DIDS 1202相关联地创建仅由压缩工具2506使用的存储器内的一些附加临时字段。这些临时字段包括Dial实例值结构(DIVS),其用于存储在Dial使用信息2500内关联Dial实例被设置的值(若有的话)。对于IDial实例,必须特殊处理DIVS。具体而言,DIVS将为空,包含表示IDial实例被设置的令牌(token),或者仅对于顶层IDial实例,包含IDial实例被设置的单个值(如果适合)。在块2604为每个DIDS 1202创建的临时字段还包括Dial实例保持字段(DIPF),如果关联DIDS应被保持(即不从压缩的芯片HW数据库中删除),则将其设为真,否则将其设为假。作为所要保持的DIDS显式地列在覆盖文件2502中的每个DIDS 1202(若有的话)的DIPF被初始化为真,并且所有其他DIPF被初始化为假。

然后,该过程从块2604进入块2606,其示出压缩工具2504进入循环,其中处理顶层指针数组1206中的每个顶层指针1250,以将相关信息从Dial使用信息2500输入到每个DIDS 1202的DIPF和DIVS中。如果所有顶层指针1250都被处理,则该过程通过页连接符B至下面描述的图26B。然而,如果所有顶层指针1250尚未都被处理,则在块2608选择顶层指针数组1206内的下一个顶层指针1250以作处理。

然后,该过程从块2608传到块2610和2612。块2610示出压缩工具2504处理以与由当前顶层指针1250引用的DIDS 1202相对应的Dial实例为首的Dial树中的每个非IDial。压缩工具2504将包含在Dial使用信息2500内的对应Dial实例的值添加到每个这样的DIDS 1202的DIVS。另外,如块2612所示,压缩工具2504处理以与由当前顶层指针1250引用的DIDS 1202相对应的Dial实例为首的Dial树内的每个IDial。对于每个这样的IDial,如果Dial使用信息2500表示IDial已被设置,则压缩工具2504将设置令牌添加到DIVS。

下一步,在块2614,如果Dial使用信息2500表示Dial树中的任何Dial被读取,则压缩工具2504设置以与由当前顶层指针1250引用的DIDS 1202相对应的Dial实例为首的Dial树中每一个DIDS 1202的DIPF。换句话说,如果Dial树中的任何Dial实例被读取,则Dial树中的每个DIPF设为真。然后,该过程进入块2616,其示出压缩工具2504检查与由当前顶层指针1250引用的DIDS 1202相对应的每个顶层IDial(若有的话),以确定覆盖文件2502是否表示IDial仅设为单个值。如果是,则压缩工具2504将包含在覆盖文件2502内的值添加到这些顶层IDial的DIVS,并且若存在的话,删除设置令牌。

然后,该过程返回到块2606,其示出继续处理循环直到顶层指针数组1206内的所有顶层指针1250都被处理为止。一旦所有顶层指针1250都被处理,则该过程通过页连接符B至图26B。

现在参照图26B,该过程从页连接符B进入块2620,其示出第二处理循环,其中处理顶层指针数组1206内的每个顶层指针1250。如果在块2620确定在当前处理循环中,顶层指针数组1206内的所有顶层指针1250都已经被处理,则该过程通过页连接符C并且在图26C中继续。否则,该过程进入块2622,其示出选择顶层指针数组1206内的下一个顶层指针1250以作处理。

在块2622之后,针对分别由判定块2624、2630和2640表示的三种条件之一,检查与由当前顶层指针1250引用的DIDS 1202相关联的DIVS和DIPF。如果在块2624确定DIPF具有真值,或者如果关联DDDS 1200中的类型字段1220表示DIDS 1202对应于Dial组,则该过程简单地从块2624返回到块2620,以处理下一个顶层指针1250(若有的话)。

然而,如果在块2630确定与由当前顶层指针1250引用的DIDS 1202相关联的DIPF具有假值,并且关联DIVS为空,则压缩工具2504可从芯片HW数据库2108中删除DIDS 1202,因为对应的Dial实例都未被设置或读取。从而,如块2632所示,压缩工具2504从芯片HW数据库2108删除该DIDS 1202,以及以被删除的顶层DIDS 1202为首的Dial树中的每个低层DIDS 1202(若有的话)。另外,压缩工具2504从顶层指针数组1206删除关联顶层指针1250,并且将指向每个被删除的DIDS 1202的实例指针1228设为空。然后,在块2634确定被删除DIDS 1202的父指针1233是否设为空。如果是,则该过程返回到已经描述过的块2620。另一方面,如果父指针不为空,则对应于被删除的DIDS 1202的顶层Dial实例属于Dial组实例。由于顶层Dial实例从未被设置或读取,因此每个这样的顶层Dial实例可安全地从其各自的Dial组实例中被删除。从而,如块2636所示,压缩工具2504从对应于Dial组实例的DIDS 1202中删除指向顶层Dial实例的被删除DIDS 1202的输出指针1238。如果从Dial组实例的DIDS 1202中删除输出指针1238去掉了Dial组的最后成员,则也从芯片HW数据库2108中删除对应于Dial组实例的DIDS 1202。该过程继续,如果可能的话,从而瓦解Dial组的分层。在块2636之后,该过程返回到已经描述过的块2620。

返回到块2640,压缩工具2504确定是否与由当前顶层指针1250引用的DIDS 1202相关联的DIPF具有假值,并且关联DIVS包含单个值。如果否,则该过程返回到已经描述过的块2620。如果是,则在块2642通过参考DIDS1202的父字段1232进一步确定Dial实例是否属于Dial组。如果是,则该过程最好返回到块2620而不作进一步处理,从而通知DIDS 1202将被保持。DIDS 1202最好被保持,因为设置Dial组的操作是极微小(atomic)的,并且如果在set_Dial_group()API调用中引用被删除的Dial实例,则将失败。响应于在块2642确定与由顶层指针1250引用的DIDS 1202相对应的Dial实例不属于Dial组,该过程进入块2644。

块2644示出通过参考映射表1224(必要时)沿着Dial树向下传播包含在DIVS中的单个Dial值,从而确定终止Dial树的锁存器的锁存器值。然后,将在块2644确定的锁存器值置于初始扫描链映像2508内通过参考芯片映射表2325而确定的扫描链位置中,如块2646所示。因此,如块2648所示,由当前顶层指针1250引用的DIDS 1202、其低层Dial树和顶层指针1250本身都从芯片HW数据库2108中被删除,如上面参照块2632所述。另外,用来设置对应于被删除的DIDS 1202的顶层Dial实例的set_Dial()API调用从系统固件1930b中被删除(典型地由编程人员),如块2650所示。然后,该过程返回到已经描述过的块2620。

现在参照图26C,处理开始于页连接符C,并且进入块2660,其示出处理循环,其中处理Dial指针数组1208内的所有Dial指针1252,以从芯片HW数据库2108中消除映射表1224内的任何多余DDDS 1200和任何多余条目。在Dial指针数组1208内的所有Dial指针1252都被处理之后,该过程传到下面描述的块2690。然而,如果少于所有Dial指针1252被处理,则该过程从块2660进入块2662,其示出选择下一个Dial指针1252以作处理。

在选择下一个Dial指针1252之后,压缩工具2504在块2664确定由当前Dial指针1252引用的DDDS 1200的实例指针数组1226内的所有实例指针1228是否为空。如果是,则整个DDDS 1200是多余的,并且从芯片HW数据库2108中被删除,如块2666所示。在块2666之后,该过程返回到已经描述过的块2660。

响应于在块2664确定由Dial指针1252引用的DDDS 1200内的所有实例指针1228不为空,则在块2670进一步确定类型字段1220是否表示DDDS1200定义了IDial。如果是,则对映射表1224的优化是不可能的,并且该过程返回到块2660。如果压缩工具2504在块2670确定由当前Dial指针1252引用的DDDS没有定义IDial,则该过程进入块2672。块2672示出与由实例指针1228引用的任何DIDS 1202相关联的任何DIPF是否具有真值。如果是,则该条件表示由DDDS 1200定义的Dial的至少一个Dial实例已被读取,因此需要完全映射表1224。因此,该过程返回到块2660,而不执行对映射表1224的任何优化。

然而,如果压缩工具2504在块2672确定与由实例指针1228引用的DIDS1202相关联的所有DIPF具有假值,则该过程从2672进入块2674、2676和2678所示的处理循环。该处理循环表示压缩工具2504处理由当前Dial指针1252引用的DDDS 1200的实例指针数组1226内的每个实例指针1228,从而构建包含对应于DIDS 1202的Dial实例由系统固件1930设置的所有值的Dial值集合。如块2678所示,从与每个DIDS 1202相关联的DIVS获得Dial值。在通过处理每个实例指针1228而构建了Dial值集合之后,该过程从块2674传到块2680。块2680示出压缩工具2504删除由在Dial值集合内没有找到其Dial输入值的当前Dial指针1252引用的DDDS 1200的映射表1224中的每个条目。该过程沿着Dial树向下继续,消除不用来生成Dial值集合的映射表条目。因此,通过删除不需要的条目来优化各个Dial的映射表1224。然后,该过程返回到块2660。

响应于在块2660确定Dial指针数组1206内的所有Dial指针1252都已经被处理,压缩工具2504在块2690通过以指向提供完全实例名称部分的“字典”的指针替代实例名称字段1234内的实例名称的共同部分来执行最后压缩。本领域的技术人员所公知的该压缩技术以指针替代实例名称(或其部分),其中指针典型地显著短于其所替代的实例名称或实例名称部分。作为将HW配置数据库1932a装载到服务处理器1920的易失性存储器1928a中的过程中的步骤,这些指针则可在实例名称字段1234内被替代。在块2690之后,压缩工具2504在块2692终止处理。

在根据图26A-26C所示的方法、由压缩工具2504压缩了所有芯片HW数据库2108之后,则可利用压缩的芯片HW数据库2108、通过简单构造芯片指针数据结构2320而构造存储在快闪ROM 1924内的硬件配置数据库1932a。应当注意的是,由压缩工具2504实现的压缩方法不是排他性的。HW配置API 1934b最好包括允许开发者删除各个DIDS 1202、删除映射表1224中的条目并且执行类似于图26A-26C所示的其他优化的一套API。

在上述本发明的实施例中,已经假定在逻辑上耦合于模拟配置锁存器或硬件锁存器的每个Dial(即LDial或IDial)可设置包含在模拟配置锁存器或硬件锁存器中的值。然而,实际上,经常期望能够读取这样的锁存器,而不允许系统固件或模拟器设置(或改变)锁存器值。

鉴于前面,本发明的优选实施例支持在此称作只读Dial或RDial的附加类别的配置实体。最好存在对应于上述每种Dial和Dial组类型的只读配置实体,也就是,只读LDial、CDial、IDial和Dial组。为易于理解起见,每个只读配置实体在此通过在Dial或Dial组类型名称(例如,LDial、CDial、IDial和Dial组)的开头带有表示配置实体为只读的“R”来表示(例如,RLDial、RCDial、RIDial和RDial组)。

RDial和RDial组遵循多个规则集。第一,RDial和RDial组是只读的,并且根据定义不能被模拟器或系统固件设置。因此,RDial和RDial组不能被分配缺省值。

第二,除了定义配置实体的关键字以“R”开头之外,在配置指定语句内定义RDial或RDial组的语法最好与上面对于对应的非只读配置实体所述的相同。例如,RLDial的示例性配置指定语句可以如下给出:

RLDial state_machine(state_vector(0..1),

               )=

               {idle=>0b00;

                start=>0b01;

                wait=>0b10;

                end=>0b11

               };

上面给出的示例性配置指定语句以关键字“RLDial”开始,其指定正被声明的RDial的类型为RLDial,以及在本例中为“state_machine(状态机)”的RDial名称。下一步,该配置指定语句列举其状态由RLDial读取的信号名称。在列举信号标识符之后,该配置指定语句包括列出RLDial的容许列举“输入”值(或设置)和每个列举输入值的对应信号(即“输出”)值的映射表。应当再次注意的是,为所有列举值指定的信号状态是唯一的,并且一起表示信号状态的仅仅合法模式。

第三,RDial具有关于与Dial和RDial互连和对Dial和/或RDial进行编组以形成RDial组的不同规则集。下面参照图27详细阐述这些规则,其中图27是示例性配置数据库2700的一部分的图示,其包括具有与模拟模型或硬件系统的锁存器2760-2778的指定逻辑连接的Dial和RDial。

作为首要事情,RDial遵循对如上面关于对应的Dial所述的、与其他RDial和锁存器的互连的类似限制。也就是,在优选实施例中,RDial或RLDial而非RCDial的输出可直接耦合于锁存器,并且RCDial而非RIDial或RLDial的输出可连接到低层RDial的输入。因此,例如,RCDial 2740具有连接到RCDial 2742的输入的输出,而RCDial 2742又具有两个分别连接到RLDial2744和RIDial 2746的输入的输出。RLDial 2744和RIDial 2746具有分别连接到锁存器2770和2772的输出。

另外,RCDial可具有连接到任何类型的Dial的输入的输出,但是没有Dial被允许具有连接到任何RDial的输入的输出。例如,RCDial 2740具有耦合于CDial 2724的输入的输出。虽然在图27中未显式示出,但是应当注意的是,RDial可具有连接到相同子树的多个不同层上的RDial和/或Dial的输入的输出。

为了防止冲突设置,上面定义的Dial和Dial组允许每个锁存器、Dial和Dial组具有最多一个Dial或Dial组,作为在n路Dial树中以分层方式居于其“上”的父。例如,CDial 2722和CDial 2724的每一个仅具有一个Dial父(即,CDial 2720),LDial 2726和IDial 2728的每一个仅具有一个Dial父(即,CDial 2724),并且LDial 2730和IDial 2732的每一个均具有一个Dial父(即CDial 2724)。然而,由于RDial和RDial组根据定义是只读的,因此任何Dial或RDial可具有一个或多个RDial或RDial组父,而没有在Dial设置之间冲突的任何可能性。也就是,在遵循其他规则的情况下并且倘若不形成闭环,则RDia的输出可连接到另一个RDial或Dial也与之连接的锁存器、Dial或RDial。换句话说,每个锁存器和Dial被允许具有至多一个Dial父,但是每个锁存器、Dial和RDial可具有一个或多个RDial父,而不管该锁存器或Dial是否还有Dial父。例如,在图27的配置数据库2700中,RCDial 2740和RCDial2750的每一个的输出连接到RCDial 2742的输入。类似地,CDial 2720和RCDial 2740各自具有连接到CDial 2724的输入的输出。另外,RLDial 2752和LDial 2754各自具有连接到锁存器2776的输出。

最后规则有关RDial组的构造。如上面参照图11A所述,在优选实施例中,Dial组只可包含顶层Dial和/或其他分层嵌套的Dial组。相反,RDial组可包含分层结构的任何层上的RDial或Dial和/或Dial组或RDial组。允许该附加灵活性,因为RDial组如同RDial一样从不被模拟器或系统固件设置。

结合前面根据上述规则所述的Dial和Dial组在配置数据库内实现RDial和RDial组允许构造三种类别的树。第一,如Dial树2702和2708所示范的那样,树可包括Dial和锁存器而非RDial。第二,RDial树例如RDial树2706可包括RDial和锁存器而非Dial。第三,混合型树可被构造成包含一个或多个RDial、一个或多个Dial和一个或多个锁存器,如混合型树2704所示。

为了支持RDial和RDial组,对模拟配置数据库和HW配置数据库进行一些修改。首先,增加每个DDDS 1200内类型字段1220的值集合,以包括标识RDial组和RDial的附加类型的附加值。例如,可以向该值集合增加RL、RC、RI和RG值,以分别标识对应于RLDial、RCDial、RIDial和RDial组的DDDS 1200。增加这些新值确保set_Dial()或set_Dial_group()API调用将不试图设置RDial或RDial组,其中set_Dial()或set_Dial_group()API调用最好在试图设置任何实例之前测试关联DDDS 1200的类型字段1220。

另外,如图28A所示,展开每个DIDS 1202以包括只读父字段2800,其包括零个或多个只读父指针2801。每个非空只读父指针2801定义由DIDS1202表示的实例的输入与高层RDial的输出之间的连接,或者在RDial组内包括由DIDS 1202表示的实例。如上所述,除了Dial或Dial组父(若有的话)之外,由DIDS 1202表示的实例可具有多个RDial父和/或属于多个RDial组。

如图28B所示,类似地扩大配置数据库内的锁存器数据结构(例如,HW配置数据库的锁存器数据结构2230或模拟配置数据库的锁存器数据结构1204),以包括只读父字段2802,其包括一个或多个只读父指针2803。每个非空只读父指针2803定义由锁存器数据结构表示的锁存器实例的输入与RIDial或RLDial的输出之间的连接。如上所述,在模拟中,锁存器名称字段1244(图12)内的锁存器名称最好参照由父指针1242表示的LDial或IDial的范围来指定。如果父指针1242为空,其表示对应于锁存器数据结构1204的配置锁存器没有Dial父,则最好参照与由只读父字段2802内的第一只读父指针2803标识的DIDS 1202相对应的RLDial或RIDial的范围来指定包含在锁存器名称字段1244内的锁存器名称。

最后,顶层指针数组1206(图12),虽然在结构上没有变化,但是在长度上增加,以支持RDial和RDial组。具体地说,顶层指针数组1206包括指向每个顶层RDial组的DIDS 1202的顶层指针1250、包含在RDial组内的每个顶层RDial(即,具有非空只读父字段2800)、以及不包含在RDial组内的每个顶层RDial(即,具有空只读父字段2800)。

为了支持RDial和RDial组而对配置数据库中的数据结构的前述修改必然伴随着对上面参照图13所述的将配置数据库从非易失性存储装置装载到易失性存储装置中并且对其进行展开的方法的修改。图29是根据本发明优选实施例将包含RDial和/或RDial组的配置数据库从非易失性存储装置装载到易失性存储器中的示例性方法的高层逻辑流程图。如使用相同的附图标记所示,图29所示的方法与上面参照图13所述的基本上类似,其中另有一些补充,以确保每个数据结构仅被处理一次。

如撇号(’)所示,在块1308’进行对前述方法的第一修改。在图13的方法中,块1308表示确定由当前顶层指针1250引用的DIDS 1202是否对应于属于Dial组的Dial或Dial组。图29中的块1308’向该确定增加进一步的确定,即确定由当前顶层指针1250引用的DIDS 1202是否对应于属于RDial组的Dial、RDial、Dial组或RDial组。如果任一确定获得肯定响应,则如处理返回到块1304所示,当前顶层指针1250的处理终止,因为当处理Dial组或RDial组时,将处理由当前顶层指针1250引用的DIDS 1202。该确定确保顶层Dial和RDial的DIDS 1202仅被处理一次。

为了确保在将配置数据库装载到易失性存储器中的过程期间低层数据结构也仅被处理一次,在块2900进一步确定由当前顶层指针1250引用的DIDS1202是否对应于RDial或RDial组。如果否,也就是,如果以DIDS 1202为根的树对应于Dial或Dial组,则该树中的“孩子”都不会是RDial或RDial组。从而,可以如前所述处理当前DIDS 1202之下的子树,如该过程从块2900传到块1316所示。

然而,响应于在块2900确定由当前顶层指针1250引用的DIDS 1202对应于RDial或RDial组,该过程传到块2902和下面块,其表示处理RDial或RDial组的子树以确保配置数据库中的每个数据结构仅被处理一次。为了跟踪哪些数据结构已被处理,首先在块2902,将当前DIDS 1202标记为已处理。然后,如块2904所示,该过程进入处理循环,其中处理当前顶层DIDS 1202的输出指针数组1236内的每个输出指针1238。一旦所有输出指针1238都被处理,则该过程退出处理循环,并且返回到块1304,其表示确定是否还有任何另外的顶层指针要被处理。

如果在块2904确定不是所有输出指针1238都已经被处理,则在块2906选择输出指针数组1236内的下一个输出指针1238以作处理。然后,该过程进入块2910和2912,其分别示出确定所选输出指针1238是否指向对应于Dial或Dial组的DIDS 1202,或者由输出指针引用的DIDS 1202是否是已被标记为先前处理过的RDial或RDial组。如果在块2910获得肯定结果,则已经定位了RDial或RDial组与Dial或Dial组之间的接口。由于当选择另一个顶层指针1250以作处理时将处理以该Dial或Dial组为首的子树,因此该子树的处理终止,并且该过程返回到块2904。子树的处理类似地响应于在块2912确定由当前输出指针1238(对应于RDial或RDial组)引用的DIDS 1202被标记为先前处理过而终止。

另一方面,如果块2910和2912所示的确定产生否定结果,则在块2914标记并处理由当前输出指针1238引用的DIDS 1202或锁存器数据结构1204。在块2914执行的处理与块1310、1312、1314和1316所示和上面所述的相同。如块2914进一步所示,遵循块2912和2914所示的两个条件,类似地标记并处理直到且包括终止子树的锁存器的子树中的每个低层数据结构。也就是,如果检测到与Dial或Dial组的接口,或者如果检测到已被标记的数据结构(例如,对应于RDial或RDial组的锁存器数据结构1204或DIDS 1202),则任何子树的处理中止。在块2914之后,该过程返回到已经描述过的块2904。

RDial和RDial组的实现也需要在针对数字设计的模拟和硬件实现读取Dial、Dial组、RDial和RDial组的方式上进行一些调整。具体地说,当例如在块1620(图16A)和1660(图16B)遍历树、以创建read_Dial()或read_Dial_group()API调用最终所针对的感兴趣锁存器集合时,最好记录或标记被遍历以创建锁存器集合的“分支”(即,对应于Dial或RDial的DIDS 1202)。以这种方式,当例如如块1624(图16A)和1664(图16B)所示,沿着“树”向上传播锁存器集合中锁存器的锁存器值以获得Dial和RDial设置时,从锁存器数据结构1204向上遍历正确的分支,以获得感兴趣的Dial或RDial设置。换句话说,由于除了单个Dial父之外,Dial或RDial还可具有一个或多个RDial父(若有的话),因此必须记录或标记向下遍历以获得锁存器值的分支的父指针,以确保向上遍历相同分支以获得期望的Dial或RDial设置。

最好,对图26A-26C所示的压缩例程也进行调整。在所述实施例中,图26B的块2632示出删除Dial使用信息2500(继而DIPF)表示其不被设置或读取的顶层DIDS 1202的整个Dial树。在实现如图27所示允许树的向上分支的RDial和RDial组的情况下,如果修改该步骤以保持也属于被读取的RDial实例的子树的任何低层DIDS 1202,则是优选的。在该修改中,在删除顶层DIDS 1202之后,测试被删除DIDS 1202的子树中每个低层DIDS 1202的DIPF,以确定其是否具有真值,其表示低层DIDS 1202也属于被读取的树。如果否,则也可删除低层DIDS 1202,并且删除过程沿着子树向下继续。然而,如果定位了具有设为真的DIPF的低层DIDS 1202,则不删除那个低层DIDS 1202及其子树。然而,其父指针1233设为空,以反映由父指针1233引用的父DIDS 1202的删除。

当在实验环境中或者响应所实施硬件系统的故障而调试和测试硬件数字设计时,分析故障以确定其原因是关键任务。传统地,为了帮助确定故障原因,获得硬件数字系统内所有测试扫描链的扫描转储(dump)。然后,分析扫描链映像以确定故障原因。经常地,手工选择特定扫描链比特,并将其输入到数字系统的模拟模型中,以试图在模拟中再现故障。硬件故障的模拟使得能够改善信号可见性和提高模拟器的单步调试能力,以帮助确定故障原因。

该传统故障分析是繁琐且易于出错的,因为用户必须首先试图确定由扫描转储提供的“比特海洋”中的哪些比特是重要的,以移植(port)到模拟系统从而重建错误状态。然后,用户必须参考有可能出错的纸件文档人工浏览扫描转储,以便确定感兴趣的比特值。最后,用户必须对RTX或其他软件程序进行编程,以向模拟模型的锁存器装载适当的比特值。

本发明通过支持上述配置指定语言以及硬件和模拟配置数据库的特性而改进该现有技术的分析技术。现在参照图30,其示出了用于利用模拟模型分析硬件系统的选定状态、特别是硬件系统的故障状态的示例性过程的高层逻辑流程图。如图所示,该过程开始于运行芯片分析器工具3004,其最好包括在计算机系统如图1的数据处理系统6上执行的软件。芯片分析器工具3004接收测试扫描链映像3000作为输入,其中测试扫描链映像3000一起表示系统故障状态,并且各自包含硬件数字设计(例如,测试下的服务器计算机系统)内各个集成电路芯片的所有锁存器的锁存器值。另外,芯片分析器工具3004接收硬件数字设计内每种集成电路芯片类型的逐芯片类型芯片HW数据库2108。最后,向芯片分析器工具3004提供选定Dial列表3002,其标识每个芯片HW数据库2108内的哪些Dial被认为是相关于在模拟中近似硬件故障状态。

芯片分析器工具3004参考芯片HW数据库2108处理扫描链映像3000和选定Dial列表3002,以生成硬件数字设计中每个集成电路芯片的相应芯片配置报告3006和模拟设置文件3008。每个芯片配置报告3006包括与硬件数字设计中的特定集成电路相关联的所有Dial实例的可供人阅读和可打印清单,以及处于故障点的每个Dial实例的设置(如果合法值可用)。对于合法值不可用的Dial实例,报告底层锁存器值。每个模拟设置文件3008是指定与对应的集成电路芯片相关联的选定Dial列表3002中所标识的每个Dial的设置(如果合法值可用)的可机读文件。如上所述,RTX 1420(图14)利用模拟设置文件3008,以将硬件数字系统的模拟模型1400配置成近似硬件数字设计的故障状态的状态。

现在参照图31,示出了根据本发明的图30的芯片分析器工具3004生成用来分析硬件故障的芯片配置报告3006和模拟设置文件3008的说明性方法的高层逻辑流程图。如图所示,该过程开始于块3100,然后进入块3102,其示出芯片分析器工具3004确定硬件数字设计内每个集成电路芯片的扫描链映像3000是否已经都被处理。如果所有集成电路芯片的扫描链映像3000都已经被处理,则该过程终止于块3130。然而,如果少于所有扫描链映像3000已经被处理,则在块3104选择要处理的下一个集成电路芯片的扫描链映像3000和芯片HW数据库2108。

然后,图31所示的过程在块3106-3110进入处理循环,其中参考芯片HW数据库2108的锁存器指针数组1210中的锁存器指针1254,处理从当前集成电路芯片扫描的感兴趣的每个锁存器值。具体地说,芯片分析器工具3004在块3106确定所有锁存器指针1254是否都已经被处理。如果是,则该过程从块3106传到下面描述的块3120。然而,如果不是所有锁存器指针1254都已经被处理,则在块3108选择锁存器指针数组1210内的下一个锁存器指针1254以作处理。下一步,在块3110,芯片分析器工具3004利用包含在由当前锁存器指针1254引用的锁存器数据结构2230的方法名称字段2234a(图23B)中的测试扫描环标识符和偏移值对来在扫描环映像3000内定位对应于锁存器数据结构2230的硬件锁存器的锁存器值。然后,将该锁存器值存储在锁存器值字段2324的适当条目内,其是参考芯片映射表2325内的当前集成电路芯片的chipID的位置而确定的。然后,该过程返回到块3106。

响应于在块3106确定当前芯片HW数据库2108的锁存器指针数组1210内的所有锁存器指针1254都已经被处理,该过程进入块3120。块3120示出芯片分析器工具3004参考映射表1224、在芯片HW数据库2108内沿着DIDS树的所有分支向上传播包含在每个锁存器值字段2324中的锁存器值的集合,以便获得每个Dial和RDial的设置(即输入值),如果可能的话。假定锁存器值字段2324内的锁存器值对应于硬件故障状态,则经常发生的情况是,试图沿着树向上传播至少一些锁存器值将导致不处于在Dial或RDial实例的映射表1224内指定的合法输出值中的至少一个“输出”值。在这种情况下,Dial或RDial实例(以及相同树中位于其上的任何RDial或Dial)被标志为具有非法值。该非法值经常暗示硬件故障的原因。

应当注意的是,从锁存器值获得Dial和RDial值的能力依赖于本发明所引入的配置指定语言的可逆性。也就是,没有Dial(和RDial)输入和输出之间的一一映射,就不能从锁存器值明确地确定Dial(和RDial)设置,如块3120所示。

在块3120之后,该过程进入块3122,其示出芯片分析器工具3004创建当前集成电路芯片的芯片配置报告3006。如上所述,芯片配置报告3006是供人阅读的文件,其包含当前芯片HW数据库2108内所有Dial和RDial的清单以及在块3120确定的其对应设置(若有的话)。在芯片配置报告3006中标志具有非法值的Dial和RDial实例,并且列出底层锁存器的锁存器值以帮助分析。如块3124所示,芯片分析工具3004还创建当前集成电路的RTX兼容模拟设置文件3008。模拟设置文件3008最好包括仅在选定Dial列表3002内指定的Dial实例的Dial设置,并且如果在选定Dial列表3002中指定的Dial实例具有非法值,则包括由该Dial控制的锁存器集合中的底层锁存器的锁存器值。然后,可由在模拟环境中运行的RTX 1420将这些Dial实例设置和锁存器值自动地施加于模拟模型1400,如下所述。

应当理解的是,由于由Dial控制的锁存器数典型地仅是集成电路中锁存器总数的一小部分,因此数字系统的设计者通过使用本发明的配置指定语言将Dial与特定配置锁存器相关联,已经大大减少了在重建系统故障状态中所要考虑的锁存器值的数目,并且标识了为再现硬件故障状态而最可能需要的那些锁存器。选定Dial列表3002通过指定感兴趣的特定用户所选Dial实例(而非RDial实例)而进一步减少了要移植回到模拟模型1400中的硬件状态信息的量。

在块3124之后,图31所示的过程返回到块3102以处理硬件数字设计中的下一个集成电路芯片(若有的话)。在硬件数字设计内的所有集成电路芯片都被处理之后,该过程终止于块3130。

再次参照图30,在根据图31的过程为硬件数字设计内的每个集成电路芯片创建了相应的模拟设置文件3008之后,通过执行RTX 1420,在数字设计的模拟模型1400内近似硬件故障状态。另外,应当注意的是,由于数字设计根据定义将不能从故障状态正确工作,因此通常不期望在模拟中再现精确的硬件故障状态。

为了在模拟中近似硬件故障状态,RTX 1420首先发出对由模拟器1410提供的API的标准API调用,以便执行用来初始化模拟模型1400以进行模拟的正常初始化过程。下一步,RTX 1420可以可选地根据用户提供的定制初始化修改文件3010,对模拟模型1400的配置单独进行用户指定的定制。例如,可以进行这些定制修改,从而调整参数以暴露特定故障模式,或者提高特定故障类型的可见性。最后,RTX 1420施加包含在模拟设置文件3008中的Dial实例设置和锁存器值。如上面参照图14和17A详细所述,RTX 1420通过对配置API 1406的set_Dial()API调用来设置Dial实例,其在模拟配置数据库1404中反映Dial实例设置之后,调用PUTFAC()API 1414,以在模拟模型1400中设置对应的锁存器值。RTX 1420类似地利用API调用,以采用包含在对应于非法Dial值的模拟设置文件3008内的锁存器值,来设置模拟模型1400的配置锁存器和配置数据库1404的锁存器值字段1246(图12)。在模拟模型1400被这样配置的情况下,RTX 1420引导由模拟器1410对模拟模型1400执行一个或多个测试例,以便试图在模拟中再现硬件故障状态。

尽管已经参照其优选实施例具体描述了本发明,但本领域的技术人员应当理解,在不脱离本发明的精神和范围的情况下,可以对其进行形式和细节的各种修改。例如,应当理解,在此公开的概念可被扩展或修改成应用于具有与在此公开的特定示例性实施例不同的规则的其他类型的配置实体。另外,虽然本发明的各方面已经关于执行引导本发明的功能的软件的计算机系统做出了描述,但是应当理解,本发明可以可选地被实现为与数据处理系统一起使用的程序产品。定义本发明的功能的程序可通过各种信号承载介质传递给数据处理系统,其中这些信号承载介质包括但不限于不可重写存储介质(例如,CD-ROM)、可重写存储介质(例如,软盘或硬盘驱动器)以及通信介质如数字和模拟网络。因此,应当理解,该信号承载介质在承载或编码引导本发明功能的计算机可读指令时表示本发明的可选实施例。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号