首页> 中国专利> 模拟使用不确定值行为结构的方法和装置

模拟使用不确定值行为结构的方法和装置

摘要

本发明的一个实施例提供了一种模拟使用不确定值寄存器传输级设计的行为结构的系统。所述系统可接收硬件描述语言代码,包括根据表达式的值而动作不同的结构,例如所述结构可基于控制表达式的值执行代码的不同部分,或者它可基于索引表达式的值在不同的存储位置存储数据等等。确定了表达式的值是不确定的之后,所述系统可执行由表达式控制的两个或更多选项,以及然后以某种规定的方式合并结果。本发明的一个实施例可使用户能减少寄存器传输级模拟产生的结果与相关的门级模拟产生的结果之间的差异。

著录项

  • 公开/公告号CN101681390A

    专利类型发明专利

  • 公开/公告日2010-03-24

    原文格式PDF

  • 申请/专利权人 新思科技有限公司;

    申请/专利号CN200980000232.4

  • 发明设计人 G·玛图拉纳;A·萨尔兹;J·T·巴克;

    申请日2009-03-18

  • 分类号G06F17/50;

  • 代理机构北京市金杜律师事务所;

  • 代理人王茂华

  • 地址 美国加利福尼亚州

  • 入库时间 2023-12-17 23:48:38

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-05-07

    授权

    授权

  • 2011-04-27

    实质审查的生效 IPC(主分类):G06F17/50 申请日:20090318

    实质审查的生效

  • 2010-03-24

    公开

    公开

说明书

技术领域

本发明涉及电子设计自动化。更具体地,本发明涉及模拟使用不确定值行为结构的方法和装置。

背景技术

复杂的模拟和验证已使计算技术的快速进步成为可能。实际上,没有这种工具,几乎不可能验证在现在的计算设备常见的复杂集成电路。

在电子设计流程的早期阶段,通常以高抽象级别描述设计,以及在较晚阶段,逐渐以较低抽象级别描述设计。以较高抽象级别进行的模拟通常比以较低抽象级别进行的模拟执行得快,因为在较高抽象级别的每个事件或操作映射到在较低抽象级别的多个事件或操作。但是,在较低抽象级别的模拟通常比在较高抽象级别的模拟更准确,因为在较低抽象级别的模拟比在较高抽象级别的模拟更详细。

为了减少设计时间,通常希望尽早在设计流程中准确地识别错误。如果在较晚阶段识别出错误,一定会增加设计时间,因为很可能不得不针对调试的设计而重复设计流程中的很多阶段。因此,通常希望保证在不同抽象级别的模拟相互一致,因为否则当在设计中执行较低抽象级别的模拟时只能在较晚阶段发现错误。

发明内容

本发明的一个实施例提供了一种模拟使用不确定值RTL(寄存器传输级)设计的行为结构的系统。特别地,本发明的一个实施例可使用户减少RTL模拟产生的结果与相关的门级模拟产生的结果之间的差异。

在操作中,系统可接收HDL(硬件描述语言)代码,包括根据表达式的值而动作不同的结构,例如该结构可基于控制表达式的值执行代码的不同部分,或者它可基于索引表达式的值在不同的存储位置存储数据等等。一旦确定了表达式的值是不确定的,系统可执行由表达式控制的两个或更多选项,以及然后以某种规定的方式合并结果。

特别地,本发明的一个实施例修改不确定值的HDL语义,例如,当条件不确定时“if”语句的语义,当条件或case表达式不确定时case语句的语义,当敏感性列表中的一项变得不确定时控制过程的边沿敏感的事件的语义,当索引不确定时变量部分索引选择的语义,当控制表达式不确定时三元运算符的语义,从4-状态值到2-状态值的转换语义,当敏感性列表中的一项变得不确定时过程中的边沿敏感的事件的语义,当条件不确定时级别敏感事件控制的语义等等。

本发明的实施例可使用若干方法模拟行为结构。例如,系统可修改或重写HDL代码(例如,使用预编译器)使得修改的HDL代码根据新的HDL语义工作。可替换地,可修改HDL编译器使得它根据新语义产生目标代码。在另一方法中,可修改HDL解释器使得它根据新语义解释HDL代码。

附图说明

图1所示为根据本发明的一个实施例,集成电路设计和制造中的各种阶段。

图2所示为根据本发明的一个实施例,一种模拟和验证解决方案的工作流程。

图3所示为根据本发明的一个实施例的“if”结构。

图4所示为根据本发明的一个实施例,RTL模拟与门级模拟怎样不一致。

图5所示为根据本发明的一个实施例,模拟条件语句的过程的流程图。

图6所示为根据本发明的一个实施例,模拟使用变量索引表达式的结构的过程的流程图。

图7所示为根据本发明的一个实施例的计算机系统。

具体实施方式

图1所示为根据本发明的一个实施例的,集成电路设计和制造中的各个阶段。

此过程通常开始于使用EDA过程(步骤110)实现的产品概念(步骤100)。一旦设计完成,通常是投片(事件140),经过制造过程(步骤150)以及封装和组装过程(步骤160)以生成完成的芯片(结果170)。

EDA过程(步骤110)包括步骤112-130,下面对它们的说明仅为了解释而不是限制本发明。例如,实际的集成电路设计可能需要设计者以与下文所述顺序不同的顺序执行设计步骤。

系统设计(步骤112):在此步骤中,设计者描述他们想实现的功能性。他们也可执行假设分析规划以精炼功能性、核查成本等等。在这个阶段可发生硬件-软件架构分割。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括Model Architect,System Studio和Design产品。

逻辑设计和功能验证(步骤114):在这个阶段,编写用于系统中模块的VHDL或Verilog代码以及检查设计的功能准确性。更具体地,检查设计以保证它产生正确的输出。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括DesignMagellanTM,ESP知产品。

测试的合成和设计(步骤116):在这个阶段,VHDL/Verilog可被转化成网表。可针对目标技术优化网表,以及可设计和实现测试以检查完成的芯片。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括DesignPhysicalTestCompiler,Power CompilerTM,FPGA Compiler,以及Design产品。

网表验证(步骤118):在此步骤中,针对与定时限制的兼容性以及与VHDL/Verilog源代码的一致性检查网表。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括以及产品。

设计规划(步骤120):这里,针对定时和顶级路由分析和构造芯片的总体平面布置图。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括AstroTM和IC Compiler产品。

物理实现(步骤122):放置(定位电路元件)和路由(连接电路元件)发生在这个步骤。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括AstroTM和IC Compiler产品。

分析和提取(步骤124):在这个阶段,在晶体管级验证电路功能;而这允许假设分析精炼。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括AstroRailTM,PrimeRail,以及Star-RCXTTM产品。

物理验证(步骤126):在此步骤中,检查设计以保证制造、电事项、光刻事项和线路的正确性。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括HerculesTM产品。

分辨率增强(步骤128):这个步骤包括布局的几何操作以提高设计的可制造性。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括Proteus/Progen,ProteusAF,以及PSMGen产品。

掩模数据准备(步骤130):这个步骤提供“投片”数据用于产生掩模以产生完成的芯片。在这个步骤可使用的Synopsys公司的示例EDA软件产品包括系列产品。

在上述一个或多个步骤中可使用本发明的实施例。具体地,在逻辑设计和功能验证步骤114中可使用本发明的一个实施例。

模拟和验证

图2所示为根据本发明的一个实施例的,一种模拟和验证解决方案的工作流程。

此过程典型地开始于创建描述在测试下设计(DUT)的源文件204(步骤202)。源文件204可使用HDL描述DUT。例如,可使用标准化的HDL如Verilog描述DUT。

接下来,可使用编译器编译源文件以获得模拟可执行程序206(步骤204)。模拟可执行程序206可以是软件应用,当被执行时,模拟DUT的行为。模拟可执行程序还可包括指令以在模拟中执行DUT验证。例如,可配置编译器使得它在模拟中产生检查DUT的不同部分的功能性的指令。

然后可执行该模拟可执行程序以模拟DUT,执行交互调试,以及可生成模拟转储(dump)文件210用于随后的分析(步骤208)。模拟转储文件210典型地包含关于在模拟中信号值如何变化的信息。接下来,可分析模拟转储文件(步骤212)以调试DUT。

图2所示的工作流程仅用于举例说明并不是要限制本发明的范围。很多变更对本领域技术人员是明显的。例如,系统可使用预编译器修改源文件,以及然后编译修改过的源文件。可替换地,系统可使用解释模拟器,其典型地在其工作流程中不需要编译步骤。注意,基于编译器的方法通常比基于解释器的方法模拟得更快且使用更少的存储器,因为基于编译器的方法避免了基于解释器的方法的额外层和低效率。通过使用增量编译,基本可减少编译源文件需要的时间,其中增量编译重用编译的模块,除非相关的源文件自最近的编译之后被更新了。

RTL模拟和门级模拟

可在不同的抽象级别模拟DUT。例如,HDL典型地描述在寄存器传输级(RTL)的设计。在这个级别,根据存储信号值的寄存器以及根据对信号值执行逻辑操作的组合逻辑限定DUT的行为。另一方面,也可在门级描述DUT,门级是比寄存器传输级低的抽象级别。在门级,DUT表现为逻辑门网络。

在较高抽象级别的模拟执行得比在较低抽象级别的模拟快,因为在较高抽象级别的每个事件或操作典型地映射到在较低抽象级别的多个事件或操作。但是,在较低抽象级别的模拟典型地比在较高抽象级别的模拟更准确,因为在较低抽象级别的模拟比在较高抽象级别的模拟更详细。因此,较高抽象级别的模拟可能会漏掉仅当执行较低抽象级别的模拟时才能显现出的错误。

设计流程的早期阶段通常以高抽象级别描述设计,以及随后的阶段以逐渐低的抽象级别描述设计。例如,可综合RTL设计以产生门级设计。

为了减少设计时间,希望在设计流程中尽早准确识别错误。如果在较晚阶段识别出错误,一定会增加设计时间,因为很可能不得不针对调试设计而重复设计流程中的很多阶段。因此,希望保证在不同抽象级别的模拟识别出一组相同的错误。具体地,RTL模拟应该与门级模拟产生一组相同的错误。否则,似乎没有错误的RTL设计可能包含仅当执行门级模拟时才能发现的错误。

注意,可能很难保证RTL模拟将恰好识别出与门级模拟相同的错误。但是,希望减少两种模拟之间的差异。

不确定值和加电模仿

HDL典型地使用户能表明信号的值是不确定的。不确定的值可解释为在逻辑优化中“不关注的”值。例如,HDL代码可为变量赋予一个特定值,其表明该变量的值是不确定的。在综合中,系统可利用具有不确定值的变量来确定使用最少数量的门的优化的逻辑电路。

例如,在Verilog中,可使用符号“X”表明变量中未知的位,可用它表明变量的值属于一组值。值“1’bX”表明1个位未知值,其可以是“1’b0”或者“1’b1”。值“2’b1X”表明2个位值,其最高有效位等于“1”且其最低有效位是未知值。因此,值“2’b1X”可以是“2’b10”或者“2’b11”。类似地,值“2’bXX”可以是4个可能的值之一,即“2’b00”、“2’b01”、“2’b10”、“2’b11”之一。如果变量的值可以是两个或更多值,则变量具有“不确定”值。

模仿在加电期间电路的行为提出非常重要的验证问题,因为在加电期间信号值通常不确定。而且,准确地模仿加电行为可能对复杂的低功率电路尤其重要,因为这些电路典型地在低电压工作;因此,信号电压中的小差别可改变信号被译为“0”还是“1”,这增加了加电信号值中不确定性的量。而且,因为这些电路是复杂的,这增加了具有关于加电信号值明确的或隐含的假设的可能性,这增加了加电信号值将违反这些假设的可能性,因此导致非法行为。

如前所述,希望在设计流程中尽早检测设计错误。特别地,希望检测在RTL设计中加电期间的非法行为。在RTL设计中可使用HDL的特殊值模仿加电行为,例如,使用Verilog中的“X”符号,当它被赋给一个变量时,表明该变量的值是不确定的。

遗憾的是,常规的HDL编译器和模拟器不能针对特定的HDL结构适当地解释不确定值。这可能因为不确定值主要为了帮助编译器优化逻辑电路,且并非要用于模拟使用不确定信号值的RTL设计的行为。因此,在常规技术中,如果用户想正确模仿加电行为,他们不能采用这种HDL结构。注意,可以编写明确地处理当变量不确定的情况的HDL代码。但是,这种方法可能很麻烦,因为它会需要用户以不自然的方式写代码。而且,重写现有的HDL代码使得它明确地处理不确定值可能是不切实际的,因为与之相关的成本是巨大的。与常规技术对比,本发明的一个实施例提供一种系统,它以一种方式解释不确定值使得能准确模仿加电行为而不需要用户重写现有的HDL代码。

图3所示为根据本发明的一个实施例的“if”结构。

源文件302可包含包括“if”语句304的HDL代码。“if”语句304使用控制表达式306确定是执行语句308还是语句310。例如,假设控制表达式306评估一个位值。如果控制表达式306的值等于“1’b1”,将执行语句308。另一方面,如果控制表达式306的值等于“1’b0”,将执行语句310。但是,我们关注当控制表达式306的值不确定时的行为,即,当控制表达式306的值等于“1’bX”时的行为。遗憾的是,在这个场景中,常规的Verilog语义将“1’bX”值视为“1’b0”值。换句话说,如果控制表达式306等于“1’bX”,在常规Verilog语义下将执行语句310。显然,如果针对模仿加电行为,控制表达式306被赋予了不确定值,常规Verilog语义将不能准确模仿此行为,因为常规的模拟器将执行“if”语句304,就像控制表达式306的值等于“1’b0”一样。

图4所示为根据本发明的一个实施例,RTL模拟与门级模拟怎样不一致。

电路402是选择器,它包括:具有值“1”和“0”的2个输入、控制输入和输出。当控制输入等于1时,“1”值的输入与输出耦合,以及当控制输入等于0时,“0”值的输入与输出耦合。可使用HDL代码404表示电路402。具体地,HDL代码404可用变量“cond”表示选择器的控制输入以及用变量“a”表示选择器的输出。当综合HDL代码404以产生门级设计时,可优化HDL代码404使得在门级,等效的HDL代码将看起来像优化的代码406。注意,编译器可能不实际产生优化的代码406;相反,它可能综合HDL代码404作为与优化的代码406等效的锁存器。

对于本领域技术人员来说显然,代码404和优化的代码406是功能相等的。但是,因为常规技术不能适当地解释不确定值,RTL模拟和门级模拟在常规的Verilog语义下可能产生不同的结果。具体地,假设“cond”变量是不确定的,例如,假设“cond”变量等于“1’bX”。因为在模拟期间Verilog将“X”值视为“0”值,常规的RTL模拟将对输出变量“a”赋值“0”。另一方面,门级模拟将对输出变量“a”赋值“X”。因此,在这个场景中,RTL模拟可能与门级模拟不一致,这是不希望的。

当对RTL模拟器的错误报告和门级模拟器的错误报告进行比较时,RTL模拟器与门级模拟器之间的这个差异可导致误报(falsepositive)或者漏报(false negative)。例如,当RTL模拟器报告了一个错误,根据门级模拟器它实际上不是错误时,可发生误报。类似地,当RTL模拟器不报告门级模拟器报告的错误时,可发生漏报。本发明的一个实施例使用户能减少RTL模拟器产生的结果与门级模拟器产生的结果之间的差异。具体地,本发明的一个实施例可使用户能通过改变HDL语义减少误报和漏报的发生。

以下部分描述了可用于模拟HDL代码使得模拟器正确地处理不确定值的系统和技术。

模拟使用不确定值行为结构

在一个实施例中,系统接收HDL代码,它包括依据表达式的值而不同动作的结构,例如,该结构可基于控制表达式的值执行代码的不同部分,或者它可基于索引表达式的值在不同的存储器位置存储数据等等。确定了表达式的值是不确定之后,系统执行由表达式控制的所有选项,以及然后以某种规定的方式合并结果。

破坏结果的一种方法是保证在选项之间不同的任一状态也变得不确定。注意,如果选项不涉及条件调度操作,合并的过程似乎容易理解。如果某些选项调度未来的事件,合并过程可能变得困难。

一个实施例当赋值发生在由不确定条件控制的代码的不同部分(或块)时创建重命名的变量。接下来,此实施例可合并所有重命名变量的值并对原始变量进行赋值。

由于合并过程典型地对重命名变量进行操作,重命名变量合并的次序一般是不相关的。例如,假设原始变量是a、b和c。此外,假设变量a与重命名变量a1和a2相关,变量b与重命名变量b1和b2相关,以及变量c与重命名变量c1和c2相关。合并过程首先合并重命名变量a1和a2以获得变量a的值。接下来,合并过程通过合并相关的重命名变量可获得变量b和c的值。但是,合并过程也可按不同的次序合并重命名变量,例如,首先合并c1和c2,然后b1和b2,以及最后a1和a2。但是,注意,在某些情况下,次序是重要的。在这种情况下,系统可保证按正确的次序合并重命名变量。

合并过程可按许多方式执行。例如,一种技术可以是如果合并操作的自变量互不相等,则输出不确定值,以及如果自变量互相相等,则输出自变量之一的值。例如,如果a1和a2互不相等,合并操作可输出不确定值。另一方面,如果a1和a2互相相等,则合并操作可输出a1的值。另一技术可以是如果控制表达式不确定则输出不确定值。因此,在这种技术中,无论自变量互相相等或不等,合并操作将总是输出不确定值。在一个实施例中,系统可优化HDL代码使得系统对输出变量赋予不确定值,而在确定控制表达式的值是不确定的之后不执行不同选项。

本发明的一个实施例使用户能选择用户想使用的合并的类型。因此,此实施例可使用户能指定在HDL代码的一个位置使用第一合并技术,以及在HDL代码的另一位置使用第二合并技术。

本发明的一个实施例修改不确定值的HDL语义,例如,当条件不确定时“if”语句的语义,当条件或case表达式不确定时case语句的语义,当敏感性列表中的一项变得不确定时控制过程的边沿敏感的事件的语义,当索引不确定时索引选择部分变量的语义,当控制表达式不确定时三元运算符的语义,从4-状态值到2-状态值的转换的语义,当敏感性列表中的一项变得不确定时过程中的边沿敏感的事件的语义,当条件不确定时级别敏感事件控制的语义,等等。

可使用多种技术修改HDL语义。例如,系统可修改或重写HDL代码(例如,使用预编译器)使得修改的HDL代码根据新的HDL语义工作。这种技术的一个优点是它可以不需要改变HDL编译器,因为新语义在预编译器中实现。可替换地,可修改HDL编译器使得它根据新语义产生目标代码。在另一方法中,可修改HDL解释器使得它根据新语义解释HDL代码。

修改HDL结构的语义

以下部分提供本发明的实施例怎样修改HDL结构的语义的例子。

“if”语句

对于具有不确定条件的“if”语句,两个选项的动作都可执行,以及然后可合并赋予其中任一的所有变量的值。

例如,考虑以下的“if”语句:

if(cond)

   a=b;

else

   a=c;

本发明的一个实施例可通过像下列一样解释此“if”语句来修改HDL语义:

if  (|cond===1′bx)

    a1=b;

    a2=c;

    a=merge(a1,a2);

else

 if(cond)

        a=b;

else

       a=c;

表达式|cond===1′bx使用“cond”变量的位执行“或”操作并确定此“或”操作的结果是否不确定。如果即使“cond”变量中的1位等于1,“或”操作的结果将为“1’b1”。但是,如果“cond”变量具有1个或多个“X”位且所有其他位是“0”,则“或”操作的结果将为“1’bX”。如果实施例确定“或”操作的结果是不确定的,实施例使用重命名的变量a1和a2模仿“if”语句的两个分支的执行,使用“合并”函数合并产生的a1和a2的值,并将合并的值赋予变量a。另一方面,如果实施例确定“或”操作的结果不是不确定的,实施例根据通常的HDL语义执行原始“if”语句。

注意,可能有许多重写原始“if”语句的方式。例如,原始“if”语句可如下重写:

a=(|cond===′x)?merge(b,c):(cond?b:c);

可替换地,原始“if”语句可如下重写:

if(cond)

    a=b;

else if(!cond)

    a=c;

else begin

     a1=b;

     a2=c;

     a=merge(a1,a2);

end

“合并”函数可使用户能控制当条件不确定时如何解释“if”语句。具体地,用户可在编译时或运行时改变“if”语句的解释。例如,用户可指定应使用“悲观(pessimistic)”的合并函数,它不考虑自变量的值返回不确定值。在以上的例子中,即使b等于c,“悲观”的合并函数将返回不确定值。

可替换地,用户可使用更“乐观(optimistic)”的合并函数,它在可能的时候试图确定已知的值。例如,“乐观”的合并函数如果自变量互相相等可返回自变量值,以及如果自变量互相不等可返回不确定值。

“乐观”的合并函数的另一个例子是这样的函数:执行自变量的逐位比较,且只有当自变量中的各位互相不等时返回其位是不确定的值,例如,假设变量b等于“2’b10”且变量c等于“2’b11”。乐观的合并函数将合并这些值,获得值“2’b1X”。举出合并函数的这些例子只是为了说明而不是将本发明限制为所公开的形式。显然对于本领域技术人员,可使用很多其他合并函数。

在“if”语句中可能没有“else”块,如下所示:

  if  (cond)

    a=b;

在以上“if”语句中,如果变量cond等于“0”,变量a不变。因此,“if”语句可重写如下:

    if(|cond===1′bx)

        a1=b;

        a2=a;

        a=merge(a1,a2);

else

if  (cond)

    a=b;

可有很多其他方式重写以上的“if”语句。例如,以上的“if”语句也可重写如下:

a=(|cond===′x)?merge(b,a):(cond?b:a);

本领域技术人员将易于理解,以上重写“if”语句的技术可适合其他情况。例如,以从最后的“if”开始自底向上的形式展开一串“elseif”语句。如果我们用上述方式重写最后的“if”语句,我们将剩下具有更少“else”的“if”语句。以这种方式,可通过反复重写单个“if”语句重写整个“if”语句。

类似地,如果在一个“if”语句中有多个赋值,也可使用上述技术处理。具体地,可为在任一选项中赋值的每个原始变量创建一组重命名变量,以及然后可合并这组重命名变量以确定原始变量的值。

“if”语句也可修改在函数或任务中变量值。在这种场景中,可以提取在不同选项中修改的变量组,以及修改的代码可为重命名变量而不是原始变量赋值,以及最后系统可执行所有必需的合并操作。

注意即使已经以正确处理不确定值的方式编写了“if”语句,仍然可以使用如上述的新语义重写或解释。例如,考虑以下使用“elseif”结构的“if”语句:

if(|cond===1′bx)

      a=′x;

else

if  (cond)

    a=b;

else

    a=c;

重写底部的“if”结构是无用的,因为条件不会是不确定的。不确定的条件将被顶部的“if”语句捕获。因此,重写底部的“if”语句将保持原始行为。换句话说,如果已经以正确处理不确定值的方式编写了“if”语句,重写“if”语句将没有损害,即,它将保持预期的行为。

HDL可支持可用于修改“if”语句的语义的指示符。例如,HDL可包括“unique”和“priority”指示符,如果嵌套的“if”语句中没有一个条件成功,且如果没有“else”块处理这种情况,则它产生错误。如果嵌套的“if”语句中多个条件为真,“unique”指示符也可产生错误。对于这些产生错误的场景,在模拟期间,所有输出变量可设置为“X”。类似地,对于“parallel”和“full”指示符,当模拟遇到这些指示符会产生错误的场景时,输出变量可设置为“X”。

例如,可修改HDL语义使得系统在具有“unique”、“priority”或者“full”指示符的“if”语句的结尾添加附加的“else”语句。此“else”语句捕获可能会产生错误的情况,且将“X”值赋给输出变量。对于包括“unique”和“parallel”指示符的“if”语句,如果在嵌套的“if”语句中有多个匹配,即,如果条件不是互斥的,系统可将“X”值赋给输出变量。

“Case”语句

根据“case”语句的常规语义,只有当与块相关的标号与控制变量或表达式匹配时才选择case语句中的一个块。因此,如果控制变量或表达式包括不确定位,如果存在缺省块,case语句可选择缺省块,或者可能根本不选择任何块。

本发明的一个实施例当控制变量或表达式包括一个或更多不确定位时修改case语句的语义。具体地,此实施例可执行与控制变量或表达式匹配的case标号相关的块。此实施例然后可合并执行不同块的结果。例如,如果控制表达式的值是“2’b1X”,此实施例可执行与标号“2’b10”和“2’b11”相关的块,且合并结果。

case语句的行为等效于嵌套的“if”语句。例如,考虑以下case语句:

case  (a)

10:s0;

11:s1;

12:s2;

endcase

以上的case语句实际上与下面所示的“if”语句等效:

if    (a===10)s0;

else if  (a===11)s1;

else if  (a===12)s2;

可以根据“if”语句的新语义解释以上所示的等效“if”语句。注意,case语句的常规语义使用case比较运算符(“===”)。本发明的一个实施例可通过使用正规的比较运算符(“==”)替代case比较运算符(“===”),来改变case语句的语义。

如果在标号或者case条件中有任何明确的“X”或“Z”位,语义可保持不变。而且,本发明的一个实施例不以特殊方式对待case语句中的缺省条件,即,如果case条件是不确定的,缺省条件也可视为case语句中的一个选项。

可以与正规的case语句一致地处理“casex”和“casez”语句。例如,通过根据case语句的具体类型,扩展文字标号中的任何“X”或“Z”位,它们可转换成正规的case语句。注意,扩展“X”或“Z”位将是2-状态的值。例如,“casex”语句中“X”或“Z”位可扩展为“0”和“1”。在“casez”语句中,“Z”位可扩展为“0”和“1”,但是“X”位不可扩展。一旦“casex”或“casez”语句被转换成正规的case语句,则可根据如上所述的新case语义解释它。

系统Verilog允许“unique”和“priority”指示符与case语句一起使用。综合也允许“full”和“parallel”指示符与case语句一起使用。可以像针对“if”语句对待它们一样处理这些指示符。具体地,如果有漏掉的匹配,此实施例可添加缺省的标号,它对所有赋值的变量赋予“X”值。类似地,如果有多匹配情形(parallel或unique破坏),可对相关的变量赋予“X”值。

将像对待不指定不确定值的行为的正常case语句一样对待指定case表达式中的不确定值的行为的case语句。换句话说,已编写以处理不确定值的case语句可以不需要与已编写不处理不确定值的case语句不同地处理。但是,根据新语义解释这种case语句可能覆盖用户想要的行为。

过程敏感性

过程的敏感性列表确定过程是否被触发。如果敏感性列表包括不确定值,问题在于是否将触发过程。本发明的一个实施例合并两个场景的结果,即,过程被触发的场景以及过程未被触发的场景。例如,此实施例可合并当过程被触发时过程赋予变量的新值和对应于过程未被触发的场景的先前值。

敏感性列表中的不确定值可以是信号上的边沿运算符,或者对应于过程中边沿和级别敏感的项的普通信号。对于边沿运算符,当边沿转入不确定值或者转出不确定值时,不确定值可出现。本发明的实施例处理这两种类型的不确定转变,因为对于这两种类型的转变,逻辑所采样的值可能不同,导致不同的输出赋值。

为了便于说明,我们将使用“边沿”运算符表示2个值之间的转变。具体地,我们将使用“边沿”运算符说明本发明的实施例怎样通过改变转变的HDL语义处理不确定转变。例如,“edge([01])clk”表示时钟clk上的上升沿。同样,“posedge”的Verilog语义等效于“edge([01][0X][0Z][X1][Z1])”,即,正边沿包括从0到1、从0到X、从0到Z、从X到1或从Z到1的转变。

在Verilog中,具有输入“d”、输出“q”和时钟“clk”的D触发器可模仿如下:

always@(posedge clk)q<=d;

本发明的一个实施例对D触发器使用以下语义:

always@(edge([01])clk)q<=d;

always@(edge([0x][0z][x1][z1])  clk)q<=merge(d,q);

换句话说,对于D触发器,从0到1的转变像以前一样处理,但是从0到X、从0到Z、从X到1或者从Z到1的转变将导致合并“d”和“q”的值,并将合并的值赋给“q”。

变量索引表达式

变量索引表达式基于选择器变量或表达式选择向量或数组的一部分。如果选择器变量或表达式是不确定的,被选择的向量或数组的一部分是不确定的。在常规HDL语义下,当对索引不确定的数组执行读操作时,读操作返回不确定值。当索引具有不确定值时,本发明的一个实施例不改变对向量或数组的读操作的语义。换句话说,如果使用不确定的索引值对向量或数组执行读操作,此实施例返回不确定值。本发明的另一实施例可通过合并与不确定索引可具有的索引值相关的向量或数组元素,以及返回合并的值作为读操作的结果,来修改常规HDL语义。

在常规HDL语义下,当对索引不确定的数组执行写操作时,写操作不写任何数组元素,即,写操作不做任何事。本发明的一个实施例通过合并将用当前存储在与不确定索引可具有的索引值相关的向量或数组元素中的值所写的值,以及将合并的值写到那些向量或数组元素中,来修改常规HDL语义。

例如,假设数组“mem”存储使用3位索引可存取的8个元素。如果把值“val”写到索引“3’b00X”,则根据常规语义,将不会写值“val”,因为索引具有不确定值。相反,本发明的一个实施例将写到数组元素mem[3’b000]和mem[3’b001]。具体地,此实施例将把值“merge(val,mem[3’b000])”写到数组元素mem[3’b000],并把值“merge(val,mem[3’b001])”写到数组元素mem[3’b001]。

三元运算符

在常规HDL语义下,三元运算符“?”的行为通常比它的门级实现更“乐观”。本发明的一个实施例修改三元运算符的行为使得它更“悲观”。

具体地,对于标量“b”和“c”,三元运算“a?b:c”可以在门级实现为“(a&b)|(~a&c)”。在常规HDL语义下,如果“b”和“c”相等,即使控制变量a是不确定的,此三元运算可返回标量“b”或“c”的值。但是,如果控制变量a是不确定的,即使“b”和“c”的值相等,门级实现将返回不确定值。因为门级实现在HDL解释不返回不确定值的情况下返回不确定值,门级语义可能比HDL语义更“悲观”。

在一个实施例中,系统可接收用户可选的合并函数。确定控制表达式的值是不确定的之后,系统可使用用户可选的合并函数确定输出变量的值,并存储输出变量的值。

本发明的一个实施例修改三元运算符的语义使得当条件不确定时,三元运算符将执行选项的合并,并返回合并的值。具体地,如果在HDL语句“a?b:c”中变量“a”是不确定的,三元运算符将返回值“merge(b,c)”。

从4状态到2状态的转换

另一种可能有问题的结构是从4状态到2状态的转换行为。如果转换的4状态值具有一些非2状态值(例如,X或Z),则在转换期间将丢失信息。在一个实施例中,当发生这种转换时,模拟器产生运行警告。可替换地,模拟可发出运行错误并停止模拟。用户可选择模拟的行为。

修改HDL结构的语义的过程

注意基于控制表达式执行的HDL代码部分可能比简单赋值复杂得多,可导致非常复杂的行为。本发明的一个实施例通过保证函数调用执行的任何副作用不提交给合并函数来限制复杂度的量。换句话说,可执行代码中的任何函数或任务,就像它们被正常调用一样,且其结果不合并。在另一实施例中,如果具有对有副作用的任务或函数的调用,系统可抑制新语义。例如,通过编程接口调用的任何用户函数可导致系统抑制新语义。在又一实施例中,系统可检查函数调用以及确定函数调用是否对在函数调用之外存取的非局部变量(例如全局变量或通过引用函数调用传递的变量)赋值。如果是,此实施例可通过把合并的值赋给这些变量,对这些变量应用新语义。

以下部分描述根据新语义模拟HDL代码的过程。注意,很多修改和变更对本领域技术人员将是明显的。例如,代替使用解释器模拟HDL代码,系统可编译HDL代码以产生目标代码,当它被计算机执行时导致计算机根据新HDL语义模拟HDL代码。可替换地,系统可修改或重写HDL代码使得当修改的HDL代码被编译时,产生目标代码,当被计算机执行时可导致计算机根据新HDL语义模拟HDL代码。

在一个实施例中,术语“表达式”和“语句”不是可互换的,因为它们涉及不同的编程语言结构。具体地,HDL表达式和HDL语句可与HDL的语法中不同的非终端符号相关。在一个实施例中,语句可包括表达式,但表达式不能包括语句。

图5所示为根据本发明的一个实施例,模拟条件语句的过程的流程图。

此过程可开始于接收描述RTL设计的HDL代码,其中HDL代码包括确定输出变量的值的条件语句,以及其中条件语句使用控制表达式确定是否执行第一组HDL语句以确定输出变量的值,或者是否执行第二组HDL语句以确定输出变量的值(步骤502)。控制表达式可以是与HDL语法一致的HDL表达式。一组HDL语句可包括0个或多个HDL语句。

例如,HDL代码可包括“if”语句,它使用控制表达式,例如条件,确定是执行第一组HDL语句还是执行第二组HDL语句。可替换地,HDL代码可包括“case”语句,它使用控制表达式确定执行哪一组HDL语句。此外,HDL代码可包括过程,其使用控制表达式,例如敏感性列表,确定是否执行一组HDL语句。

在一个实施例中,三元运算符,例如“?”运算符,不是条件语句。三元运算符使用条件表达式的值确定是否评估第一表达式还是评估第二表达式。另一方面,条件语句使用条件表达式的值确定是否评估第一组语句还是评估第二组语句。如果实施例将表达式和语句作为不同的HDL结构对待,则三元运算符不是条件语句。

如上所述,一组HDL语句可以是“空”,即,它可以不包含任何HDL语句。例如,考虑不具有“else”块的“if”语句。这个“if”语句只有一组HDL语句,如果条件为真时被执行;对应于“else”块的那组HDL语句为“空”。类似地,过程典型地基于敏感性列表执行一组HDL语句。如果敏感性列表中描述的条件不为真,过程通常不执行任何代码。

接下来,系统可模拟HDL代码。具体地,在模拟期间,系统可检查控制表达式的值是否是不确定的(步骤504)。

如果控制表达式的值是已知的,即,如果控制表达式的值中没有任何位是不确定位,系统可根据常规语义模拟HDL代码(步骤506)。具体地,系统可使用控制表达式的值确定是执行第一组HDL语句还是第二组HDL语句,以及因此确定输出变量的值。

另一方面,如果控制变量的值是不确定的,系统可根据新语义模拟HDL代码(步骤508)。

具体地,系统可执行第一组HDL语句以确定与输出变量相关的第一临时值(步骤510)。

接下来,系统可执行第二组HDL语句以确定与输出变量相关的第二临时值(步骤512)。

然后系统可使用第一临时值和第二临时值确定输出变量的值(步骤514)。如果一组HDL语句为空,执行这组HDL语句等效于什么都不做,即执行NOP。例如,如果第二组HDL语句为空,系统将简单地跳转到下一步骤,即,系统将使用第一临时值和输出变量的现有值确定输出值。

在一个实施例中,系统可使用“合并”函数通过合并第一临时值和第二临时值确定输出变量的值。合并函数可将合并的值设置为第一临时值或第二临时值。可替换地,如果第一临时值不等于第二临时值,合并函数可将合并的值设置为特定值,例如“X”,其表明输出变量的值是不确定的。例如,如果第一临时值是“2’b10”且第二临时值是“2’b11”,一个合并函数可返回“2’b10”,另一合并函数可返回“2’b11”,以及又一合并函数可返回“X”。

在又一实施例中,系统通过执行两个值的逐位合并可合并第一临时值或第二临时值。具体地,如果第一临时值和第二临时值中的对应位不相等,系统可将输出变量中的一位设置为“X”。否则,如果这些位相互相等,系统可将输出变量中的对应位设置为等于这一位的值。例如,如果第一临时值是“2’b10”且第二临时值是“2’b11”,合并函数可返回“2’b1X”。

在一个实施例中,系统通过使用用户可选的合并函数合并第一临时值和第二临时值,来确定输出变量的值。可选择用户可选的合并函数使得RTL设计的行为与综合的门级设计的行为基本相同。在一个实施例中,在运行期间系统可改变用户可选的合并函数功能。例如,模拟器或模拟可执行程序可显现可用于暂停模拟的用户界面。接下来,用户可选择不同的用户可选的合并函数功能。接下来,用户可使用新的用户可选的合并函数功能继续模拟。可替换地,用户可指定在编译期间使用哪个用户可选的合并函数功能。

继续图5所示的过程,然后系统可在计算机可读存储介质上存储输出变量的值(步骤516)。例如,系统可在与输出变量相关的存储器位置上存储输出变量的值。

对图5所示的过程的很多修改和变更是可能的。例如,在一个实施例中,系统可接收HDL代码,它包括基于控制表达式的值执行HDL代码的不同部分的HDL结构。接下来,确定控制表达式的值是不确定的之后,系统可对输出变量赋特定值,它表明输出变量的值是不确定的。即使HDL代码的不同部分会对输出变量赋同一值,此实施例可对输出变量赋特定值。注意,在这个实施例中,系统可能不使用合并函数或对变量重命名,因为系统一旦确定控制表达式的值是不确定的就可对输出变量赋特定值。换句话说,系统可省略合并函数,因为结果不是重命名变量的函数。

在另一实施例中,系统可接收HDL代码,如果时钟变量的值从第一时钟值改变为第二时钟值,它对输出变量赋予输入变量的值。但是,如果时钟变量的值未从第一时钟值改变为第二时钟值,HDL代码可不改变输出变量的值。接下来,确定时钟变量的值从第一时钟值改变为不确定值或者从不确定值改变为第二时钟值之后,系统可使用输入变量的值和输出变量的当前值确定合并的值。然后系统可对输出变量赋予合并的值。

图6所示为根据本发明的一个实施例,模拟使用变量索引表达式的结构的过程的流程图。

此过程可开始于接收描述RTL设计的HDL代码,其中HDL代码使用索引表达式确定存储位置,以及然后在该存储位置存储值(步骤602)。例如,HDL代码可包括把值写到用索引表达式确定的数组元素的语句。索引表达式可以是与HDL语法一致的HDL表达式。存储位置可以是用于存储值的计算机可读存储介质上的位置。例如,存储位置可以是用于存储向量或数组元素的存储器位置。

接下来,系统可模拟HDL代码。具体地,在模拟期间,系统可检查索引表达式的值是否是不确定的(步骤604)。

如果索引表达式的值是已知的,系统可根据常规语义模拟HDL代码(步骤606)。具体地,系统可使用索引表达式的值确定存储位置,并把值写到该存储位置。

另一方面,如果控制表达式的值是不确定的,系统可根据新语义模拟HDL代码(步骤608)。

具体地,系统可为索引表达式的值确定一组候选索引值(步骤610)。例如,如果索引表达式的值是“2’b1X”,这组候选索引值可包括“2’b10”和“2’b11”。

对于每个候选索引值,系统可确定候选存储位置(步骤612)。例如,系统可选择候选索引值并使用所选的候选索引值确定候选存储位置。

接下来,系统可确定当前存储在候选存储位置的值(步骤614)。

然后系统可使用将要写到该存储位置的值以及当前存储在候选存储位置的值,确定合并的值(步骤616)。如上所述。系统可使用不同的合并函数确定合并的值。

接下来,系统可在候选存储位置存储合并的值(步骤618)。

图7所示为根据本发明的一个实施例的计算机系统。

计算机系统可用于模拟、编译或修改HDL代码。计算机系统702包括处理器704、存储器706和存储设备708。计算机系统702可耦合到显示器714、键盘710和点击设备712。存储设备708可存储HDL代码716、预编译器718、修改的HDL代码720、编译器722、模拟可执行程序724和解释器726。

用户可能想根据新HDL语义模拟HDL代码716描述的RTL设计。用户可使用预编译器718重写或修改HDL代码716以产生修改的HDL代码720。然后可使用编译器722编译修改的HDL代码720以产生模拟可执行程序724。当计算机系统702执行模拟可执行程序时,可导致计算机系统702根据新语义模拟RTL设计的行为。可替换地,用户可对解释器726提供修改的HDL代码720以根据新语义模拟RTL设计。

如果新HDL语义完全由预编译器718实现,编译器722和解释器726可使用常规HDL语义。可替换地,如果新HDL语义由编译器722或解释器726实现,我们可以不需要预编译器718或预编译步骤。在另一变更中,新HDL语义的一些方面可由预编译器718实现,而其他方面可由编译器722或解释器726实现。

编译器可在目标代码中插入标记使调试器能确定对应于部分目标代码的部分HDL代码。如果编译器实现新语义,可能不得不改变它在目标代码中插入标记的方式使得调试器可继续使HDL代码与目标代码相关。调试器可能还需要被修改使得它正确地解释标记。

此详细说明中的数据结构和代码典型地存储在计算机可读存储介质上,它可以是可存储计算机系统使用的代码和/或数据的任何设备或介质。这包括,但不限于,易失存储器、非易失存储器、磁和光存储设备,如磁盘驱动器、磁带、CD(压缩盘)、DVD(数字多用途盘或数字视频盘),或者现在已知或以后开发的能存储计算机可读介质的其他介质。

而且,本发明的实施例的上述说明仅用于示例和说明。它们不是穷举的或者要将本发明限制到所公开的形式。因此,很多修改和变更对本领域技术人员将是明显的。此外,以上公开不是要限制本发明。本发明的范围由所附权利要求限定。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号