System verilog概述

System verilog概述
System verilog概述

SystemVerilog断言及其应用

神州龙芯集成电路设计公司

陈先勇 徐伟俊 杨鑫 夏宇闻

[摘要]:在介绍SystemVerilog断言的概念、使用断言的好处、断言的分类、断言的组成以及断言如何被插入到被测设计(DUT)的基础上,本文详细地介绍了如何使用不同的断言语句对信号之间的复杂时序关系进行严格的检查,并针对每个例子展示了在ModelSim 6.1b仿真环境中所显示的波形。本文旨在帮助读者理解如何使用断言对设计中信号间复杂时序关系进行验证的方法,并由此介绍一些基本的SystemVerilog断言、操作符、代码段和断言验证方法学。

关键字:SystemVerilog,断言, DUT, SVA,Assertion

1.前言

当今,数字电路的规模和复杂度在不断增长,这使得对设计进行彻底的验证将成为一项巨大的挑战。在整个芯片设计过程中,验证工作所需的时间将占去设计周期的70%~80%,验证工程师的人数将是设计工程师的两倍。这就迫切需要提高验证工作的效率,以解决验证瓶颈问题。

传统上,对被测设计(DUT)的验证都是通过在DUT的输入端口加上具有特定时序激励,然后观察DUT的内部状态变化和最后的输出信号,以确定DUT工作是否正确。这种方法对简单的小规模的设计很有用。但当设计规模变大时,要想使用这种方法来验证DUT是不现实的。因为对于规模大的设计,要想遍历设计将遇到的各种情况,验证其正确性,需要成千上万的特定时序激励。并且如果设计稍有一点变动,这些时序激励就得重新编写。设计的复杂性迫使验证工程师使用随机测试平台来生成更多的验证激励。高级验证语言,如OVA,PSL等,便在创建复杂测试平台时得到了广泛的应用。但这些验证语言和RTL级的编码语言不一致,使得验证很容易出现错误,造成调试工作的不方便。

SystemVerilog的出现可以解决这些问题。 SystemVerilog是在Verilog语言的基础上发展而来的,用SystemVerilog语言可以很容易地生成复杂的随机测试激励,并能方便地编写断言和测试代码覆盖率的代码。断言在验证过程中的用途如下图所示:

图1 验证过程中的断言

由此可见,用SystemVerilog描述的断言可以应用于设计过程的各个阶段,它不仅能快而准确地定位设计中的错误,还能统计功能覆盖率。用SystemVerilog描述的断言能显著提高验证准确性和验证效率,加快设计进程,提高我们对设计的信心。

2.SVA概述

SystemVerilog语言是Verilog语言的增强,它增强了Verilog原有的编程能力,又引入了新的数据类型和验证方法。SystemVerilog断言(以下简称SVA)就属于这些新的验证方法中的一种。

那么什么是断言呢?断言就是对设计属性(行为)的描述,它是用描述性语言来描述设计的属性。在仿真过程中,如果一个被描述的属性不是我们期望的那样,那么断言就会失败;或者在仿真过程中,如果出现了一个不应该出现的属性,那么断言也会失败。

那么为什么要使用断言呢?原有的Verilog语言是一种过程性语言,设计它的目的是用于硬件描述,不是用于仿真验证,因此它不能很好地控制时序。要描述复杂的时序关系,Verilog 语言需要编写冗长的代码,很容易出错,且不易维护。SVA是一种描述性语言,可以完美地描述和控制时序相关的问题,而且语言本身简洁易读,容易维护。SVA还提供了许多内嵌的函数用于测试特定的时序关系和自动收集功能覆盖率数据。并且当断言失败时,仿真系统会根据失败断言的严重程度来决定是打印一条错误提示信息还是退出仿真过程,便于定位出错的位置。

比如要验证这样一个属性:“当信号a在某一个时钟周期为高电平时,那么在接下来的2~4个时钟周期内,信号b应该为高电平”。用Verilog语言描述这样一个属性需要一大段代码,而用SVA描述就只需要几行代码。下面的代码为SVA。

例1:

property a2b_p;

@(posedge sclk) $rose(a) |-> [2:4] $rose(b);

endproperty

a2b_a: assert property(a2b_p);

a2b_c: cover property(a2b_p);

property和endproperty为SVA的关键字,用于描述属性。a2b_p为属性的名字。$rose为SVA的内嵌函数,用于检查信号的上升沿。assert property也为SVA的关键字,表示并发断言。a2b_a为断言的名字,它把属性a2b_p作为参数。a2b_c为覆盖语句,它用于记录断言的成功。下图为本断言在ModelSim 6.1b环境中的仿真波形和断言出错信息。

图1 断言例1的波形和断言错误提示信息

断言信号为高阻态表示断言没有被激活,断言信号为1表示断言被激活,正在检查时序属性。倒三角表示断言在此刻失败,正三角表示断言在此刻成功。从上图可以看出,断言a2b_a一共进行了3次时序检查,第1、3次失败,第2次成功。

第1次断言失败。在sclk(2)处,信号a被拉高,但这时采到的a的值仍为0。在sclk(3)处,信号a被拉低,但这时采到的a的值为1,而前一个时钟采到a的值为0,表示a的上升沿到来,即$rose(a)成立,整个断言被激活,然后进行后序时序检查。在接下来的2~4个时钟周期,并没有采样到信号b的上升沿,则在sclk(7)处断言被标记为失败,断言退出激活状态。

第2次断言成功。在sclk(9)处,采样到信号a的上升沿,断言被激活。在随后的第3个时钟周期又采样到信号b的上升沿,断言成功,随即断言退出激活状态。

第3次断言失败,其断言检测过程和第1、2次类似,请读者自己分析。

由此我们可以看出SVA在时序检查时的巨大优势:只需几句代码就可以检查一类时序问题。而且在检查时,仿真验证系统不仅会打印出错信息,还会在波形中进行标记。这对于我们检查信号间的时序关系非常方便。

3.SVA分类及组成

3.1 断言分类

SVA分为并发断言和即时断言。

并发断言的计算基于时钟周期,在时钟边沿根据变量的采样值计算表达式。它可以放在过程块(procedural block)、模块(module)、接口(interface)或一个程序块(program)的定义中。并发断言可以在静态(形式化)验证工具和动态(仿真)验证工具中使用。上面的例子就是并发断言。

即时断言基于事件的变化,表达式的计算就像Verilog中的组合逻辑赋值一样,是立即被求值的,而不是时序相关的。它必须放在过程块的定义中,只能用于动态仿真。一个即时断言的例子如下:

例2:

always_comb

immi_a: assert (a && b);

即时断言被当作过程块的一部分。当信号a或者信号b发生变化时,always_comb块被执行。区别即时断言和并发断言的关键词是“property”。我们在进行时序检查时,通常使用并发断言,而很少使用即时断言。

3.2 断言的组成和建立过程

任何复杂的时序模型,其功能总是由多个逻辑事件的组合来表示的。这些事件可以是简单的同一时钟沿被求值的布尔表达式,也可以是经过几个时钟周期求值计算得到的事件。SVA使用关键字sequence(序列)来表示这些事件。许多序列可以被有序地组合起来形成设计的属性,SVA用关键字property来表示属性。最后属性要在断言中被调用才能真正发挥作用。同时我们还应该用覆盖语句来记录断言成功的次数。由此可以看出断言的建立过程为“编写布尔表达式 —> 编写序列(sequence)-> 编写属性(property)—> 编写断言(assert property)和覆盖语句(cover property)”。它们的语法格式为:

序列 属性 断言和覆盖

sequence name_s;

; endsequence property name_p;

; or

;

endproperty

name_a:assert property

(property name);

name_c:cover property

(property name);

表1 序列、属性、断言语法格式

注意:上表中斜体字为名字。为了方便识别,序列以_s结尾,属性以_p结尾,断言以_a结尾,覆盖语句以_c结尾。

4.断言的具体应用举例

4.1 简单逻辑值检查

假设要检查“信号a在每个时钟上升沿都为高电平,如果信号在任何一个时钟上升沿不为高电平,断言将失败”。这可以通过下面的代码实现:

例3:

sequence s1_s;

@(posedge sclk) a;

endsequence

a1_a: assert property(s1_s);

c1_c: cover property(s1_s);

其检查波形和断言出错信息为:

在sclk(0)处,仿真刚开始,a还没有被赋值,为不定态x,所以在sclk(0)处,断言失败。在sclk(1)处,采样当a为0,断言失败。在其余时钟上升沿处,分析方法类似。最后断言在第0、1、2、7、12、13、14个时钟上升沿失败,在其余时钟上升沿成功。

我们除了可以使用仿真环境默认的断言错误提示信息外,还可以在断言中添加自己的提示信息,如例4所示:

例4:

sequence s1_s;

@(posedge sclk) a;

endsequence

a1_a: assert property(s1_s)

$display (“assertion success”,$time)

else

$display(“assertion faild”,$time);

其提示信息为:

上面例子中的a可以为单个信号,也可以为同一时钟周期的布尔表达式,如a&&b,a||b,还可以为跨越多个时钟周期的布尔表达式,如a ##2 b。下面的例子检查如果信号a在某个时钟周期为高电平,两个时钟周期后信号b也必须为高电平。

例5:

sequence s2_s;

@(posedge sclk) a ##2 b;

endsequence

a2_a: assert property(s2_s);

c2_c: cover property(s2_s);

其检查波形为:

4.2 信号边沿检查

SVA提供了3个内嵌函数,用于检查信号的边沿变化。

?$rose(布尔表达式或信号名)

当信号/表达式的最低位由0或x变为1时返回真值。

?$fell(布尔表达式或信号名)

当信号/表达式的最低位由1变为0或x时返回真值。

?$stable(布尔表达式或信号名)

当信号/表达式的最低位不发生变化时返回真值。

例6:

sequence rose_s;

@(posedge sclk) $rose(a);

endsequence

sequence fell_s;

@(posedge sclk) $fell(a);

endsequence

sequence stable_s;

@(posedge sclk) $stable(a);

endsequence

rose_a: assert property(rose_s);

fell_a: assert property(fell_s);

stable_a: assert property(stable_s);

其检查波形为:

rose_a用于检测信号a的上升沿,它只在“a在当前时钟周期为高电平,在前一个时钟周期为低电平或不定态x”的情况下才成功,如第3、8、11个时钟周期,在其它情况下失败。

fell_a用于检测信号a的下降沿,它只在“a在当前时钟周期为低电平,在前一个时钟周期为高电平或不定态x”的情况下才成功,如第3、8、11个时钟周期,在其它情况下失败。在sclk(0)处,采样到a为不定态x。在sclk(1)处,采样到a为0。a从x变到0,本仿真环境认为是a的下降沿,所有断言成功。

stable_a用于检查信号a不变的情况,它只在“a在当前时钟周期为一个电平,在前一个时钟周期也为同样的电平”的情况下成功。如第0、2、4、5、6、8、10、11、13个时钟周期。在sclk(0)处,采样到a为不定态x,仿真系统认为在0时刻之前a同样为不定态x,所有在sclk(0)处断言成功。

4.3 使用蕴含操作符进行检查

在例5中,属性在每个时钟上升沿都会被检查。如果信号a在某个时钟上升沿不为高电平,断言就会失败,仿真系统随即产生一条错误提示信号。显然,这不是一个有效的错误信息,因为我们关心的是信号a和信号b之间的时序关系,而不只是关系信号a的电平值。这个错误只表示我们在这个时钟周期没有检测到断言的有效起始点。虽然这些断言是良性的,但它会在一段时间内产生大量的错误信息。为了避免这种错误的产生,SVA提供了“蕴含”操作符(implication,|->)。其形式为:a |-> b。

蕴含操作符的左边项为“先行算子”(antecedent),右边项为“后序算子”(consequent)。先行算子是约束条件,当先行算子匹配(成功)时,后序算子才能被计算。如果先行算子不成功,那么整个属性就被默认成功,叫“空成功”(vacuous success)。蕴含结构只能被用在属性定义中,不能用在序列定义中。蕴含操作符分为两类:交叠蕴含操作符(overlapped implication,|->)和非交叠蕴含操作符(non_overlapped implication,|=>)。

非交叠蕴含操作符“|->”表示如果先行算子匹配,后序算子在同一个时钟周期开始计算。

交叠蕴含操作符“|=>”表示:如果先行算子匹配,后序算子在下一个时钟周期开始计算。 下面例子中,non_overloap_impli_a为含有非交叠蕴含操作符的断言,overlap_impli_a为含有交叠蕴含操作符的断言。

例7:

property overloap_impli_p;

@(posedge sclk) a |-> b;

endproperty

property non_overloap_impli_p;

@(posedge sclk) a |=> b;

Endproperty

overlap_impli_a: assert property(overloap_impli_p);

overlap_impli_c: cover property(overloap_impli_p);

non_overloap_impli_a: assert property(non_overloap_impli_p);

non_overloap_impli_c: cover property(non_overloap_impli_p);

其检查波形为:

overloap_impli_a用于检测“信号a在某个时钟周期为高电平,并且信号b在同一个时钟周期也为高电平”的情况。整个断言只有在检测到信号a为高电平时才能被激活。由图可以看出,在所有被激活的断言中,一共有8次成功,5次失败。

non_overlap_impli_a用于检测“信号a在某个时钟周期为高电平,并且信号b在下一个时钟周期也为高电平”的情况。整个断言只有在检测到信号a为高电平时才能被激活。由图可以看出,在所有被激活的断言中,一共有6次成功,6次失败。

4.3 使用序列的重复操作符进行检查

序列的重复操作符分为3类:连续重复,跳转重复和非连续重复。

“[*m]”为连续重复操作符。“a[*3]”表示a被连续重复3次,“a[*1:3]”表示a被连续重复1~3次。连续重复的相邻两次重复之间只有一个时钟间隔。

“[->m]”为跳转重复操作符。“a[->3]”表示a被跳转重复3次,“a[->1:3]”表示a 被跳转重复1~3次。跳转重复的每一次重复之前可以有任意个时钟周期的间隔。

“[=m]”为非连续重复操作符。“a[=3]”表示a被非连续重复3次,“a[=1:3]”表示a 被非连续重复1~3次。非连续重复的每一次重复之前可以有任意个时钟周期的间隔,最后一次重复之后可以有任意个时钟周期的间隔。

例8:

property cons_rep_p;

@(posedge sclk) $rose(a) |-> ##1 b[*3] ##1 c;

endproperty

property goto_rep_p;

@(posedge sclk) $rose(a) |-> ##1 b[->3] ##1 c;

endproperty

property non_cons_rep_p;

@(posedge sclk) $rose(a) |-> ##1 b[=3] ##1 c;

endproperty

cons_rep_a: assert property(cons_rep_p);

cons_rep_c: cover property(cons_rep_p);

goto_rep_a: assert property(goto_rep_p);

goto_rep_c: cover property(goto_rep_p);

non_cons_rep_a: assert property(non_cons_rep_p);

non_cons_rep_c: cover property(non_cons_rep_p);

上图中,在sclk(3)处a为高电平,3个断言都被激活。1个时钟周期后,b出现3次连续的重复,再过1个时钟周期后,c为高电平,这样3个断言都成功。

在sclk(10)处a为高电平,3个断言都被激活。1个时钟周期后,b为低电平,断言cons_rep_a 就失败。再过1个时钟周期,b出现3次不连续的重复,再过1个时钟周期,c为高电平,这样断言goto_rep_a和non_cons_rep_a成功。

在sclk(20)处a为高电平,3个断言都被激活。1个时钟周期后,b为低电平,断言cons_rep_a 就失败。再过1个时钟周期,b出现3次不连续的重复,再过1个时钟周期,c为低电平,断言goto_rep_a也失败。最后再过1个时钟周期,c为高电平,断言non_cons_rep_a成功。

5.结论

SVA作为SystemVerilog语言最重要的内容之一,它可以在以下地方监视信号间的各种时序关系:(1)设计模块的内部;(2)模块与模块间的连接信号;(3)和RTL代码放在一起进行综合,用于调试;(3)进行设计的功能覆盖。而且SVA和可综合的RTL级语言都被统一到了systemVerilog语言,使得设计工程师和验证工程师可以很好地沟通,方便管理,加快设计进程。

上面列举地SVA实例只是SVA内部的一小部分,读者要想更深入地研究SVA和SystemVerilog 语言,可以查阅“参考资料”中列出的文献。

SystemVerilog语言及其断言必然会在复杂逻辑电路的验证工作中,逐步取代Verilog和SystemC,成为新一代的硬件设计和验证语言。

参考文献:

【1】《SystemVerilog验证方法学》,夏宇闻,杨雷,陈先勇,徐伟俊,杨鑫 译,北京航空航天大学出版社,ISBN:978-7-81124-079-5。

【2】《Verilog数字系统设计教程》,夏宇闻 编著,北军航空航天大学,ISBN:7-81077-302-X。【3】《SystemVerilog应用手册》,陈俊杰等译,清华大学出版社,ISBN:7-302-13441-3/TP.8442。

【4】SystemVerilog语法手册,《IEEE Standard for SystemVerilog-Unified Hardware Design,Specification,and Verification Language》。

【5】《SYSTEMVERILOG FOR VERIFICATION》,CHRIS SPEAR,Synopsys,Inc.

关于硬件描述语言(VHDL和Verilog)概要

关于硬件描述语言【VHDL和Verilog】 随着EDA技术的发展,使用硬件语言设计PLD/FPGA成为一种趋势。目前最主要的硬件描述语言是VHDL和Verilog HDL。 究竟选择VHDL还是verilog HDL? 这是一个初学者最常见的问题。其实两种语言的差别并不大,他们的描述能力也是类似的。掌握其中一种语言以后,可以通过短期的学习,较快的学会另一种语言。选择何种语言主要还是看人的使用习惯。如果您是集成电路(ASIC)设计人员,则必须首先掌握verilog,因为在IC设计领域,90%以上的公司都是采用verilog进行IC设计。对于PLD/FPGA设计者而言,两种语言可以自由选择。 学习HDL的几点重要提示 1.了解HDL的可综合性问题: HDL有两种用途:系统仿真和硬件实现。如果程序只用于仿真,那么几乎所有的语法和编程方法都可以使用。但如果我们的程序是用于硬件实现(例如:用于FPGA设计),那么我们就必须保证程序“可综合”(即程序的功能可以用硬件电路实现)。不可综合的HDL语句在软件综合时将被忽略或者报错。应当牢记一点:“所有的HDL描述都可以用于仿真,但不是所有的HDL描述都能用硬件实现。” 2. 用硬件电路设计思想来编写HDL: 学好HDL的关键是充分理解HDL语句和硬件电路的关系。编写HDL,就是在描述一个电路,写完一段程序以后,应当对生成的电路有一些大体上的了解,而不能用纯软件的设计思路来编写硬件描述语言。要做到这一点,需要多实践,多思考,多总结。 3.语法掌握贵在精,不在多: 30%的基本HDL语句就可以完成95%以上的电路设计,很多生僻的语句并不能被所有的综合软件所支持,在程序移植或者更换软件平台时,容易产生兼容性问题,

SystemVerilog

SystemVerilog 语言简介 SystemVerilog 是一种硬件描述和验证语言(HDVL),它基于 IEEE 1364-2001 Verilog 硬件描述语言 (HDL) 并对其进行了扩展, , 包括扩充了 C 语言数据类型、结构、压缩和非压缩数组、 接口、断 言等等, 这些都使得 SystemVerilog 在一个更高的抽象层次上提高了 设计建模的能力。SystemVerilog 由 Accellera 开发,它主要定位在 芯片的实现和验证流程上, 并为系统级的设计流程提供了强大的连接 能力。 下面我们从几个方面对 SystemVerilog 所作的增强进行简要的 介绍, 期望能够通过这个介绍使大家对 SystemVerilog 有一个概括性 的了解。 1. 接口(Interface) Verilog 模块之间的连接是通过模块端口进行的。为了给组成设 计的各个模块定义端口, 我们必须对期望的硬件设计有一个详细的认 识。不幸的是,在设计的早期,我们很难把握设计的细节。而且,一 旦模块的端口定义完成后,我们也很难改变端口的配置。另外,一个 设计中的许多模块往往具有相同的端口定义,在 Verilog 中,我们必 须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。 SystemVerilog 提供了一个新的、高层抽象的模块连接,这个连 接被称为接口(Interface)。接口在关键字 interface 和 endinterface 之间定义,它独立于模块。接口在模块中就像一个单一的端口一样使 用。在最简单的形式下,一个接口可以认为是一组线网。例如,可以 将 PCI 总线的所有信号绑定在一起组成一个接口。通过使用接口, 我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。 随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信 号也会很容易地表示出来。当接口发生变化时,这些变化也会在使用 该接口的所有模块中反映出来,而无需更改每一个模块。 下面是一个 接口的使用实例: interface chip_bus; // 定义接口 wire read_request, read_grant; wire [7:0] address, data; endinterface: chip_bus
更多免费资料下载请进: https://www.360docs.net/doc/5213590253.html, 中国最大的免费课件资料库

计算机基础知识概述

计算机基础知识概述 一、概述 1.计算机的发展 (1)1946年,美国宾夕法尼亚大学成功研制了世界上第一台电子数学积分计算机。(计算机简称:ENIAC) (2)ENIAC的特点 a.采用二进制 b.储存程序控制 2.计算机的特点、用途和分类 (1)特点 a.高速、精确的运算能力 b.准确的逻辑判断能力 c.强大的存储能力 d.自动功能 e.网络与通讯功能 (2)用途 a.科学计算 b.信息处理 c.过程控制 d.辅助功能 e.网络通信 f.人工智能

g.多媒体应用 h.嵌入式系统 (3)分类 a.按处理数据的类型分类 数字计算机、模拟计算机、数字和模拟计算机(混合计算机) b.按用途分类 专用计算机、通用计算机 c.按性能、规模和处理能力分类 巨型机、大型计算机、微型计算机、工作站和服务器 二、信息的表示和储存 1.计算机中的单位及换算 (1)单位 位(bit)是计算机中数据的最小单位,代码只有0和1,采用多个数码表示一个数,其中每一个数码称为1位。 字节(Byte)是存储容量的基本单位,一个字节由8位二进制位组成。 1KB=1024B=210B 1MB=1024KB=220B 1GB=1024MB=230B 1TB=1024GB=240B 2.进位计数制及其转换(见笔记)

3.字符的编码 (1)字符包括西文字符和中文字符。ASCII码是常用的字符编码,被指定为国际标准。国际通用ASCII码是7位,即用7位二进制数来表示一个字符的编码,共有27=128个不同的编码值。 (2)特殊字符的编码 a字符的编码为1100001,十进制为97;b为98 A字符的编码为1000001,十进制为65;B为66 0字符的编码为0110000,十进制为48;1为49 空格(SP)编码为0100000 回车(CR)编码为0001101 删除(DEL)编码为1111111 退格(BS)编码为0001000 小写比大写字母的码值大32 计算机内一个字节存放一个7位ASCII码,最高位置为0 (3)汉字输入码分类 音码、音形码、形码数字码 三、计算机硬件系统 1.组成 a.运算器(加法器+寄存器+累加器) b.控制器(指令寄存器+指令译码器+操作控制器+程序计数器) c.存储器

system verilog教程

SystemVerilog Tutorials 下面的手册会帮助你了解一些SystemVerilog中最重要的新特点。手册还提供了一些代码样本和例子使你可以对语言有更好"感觉"。这些辅导假设你们已经了解了一些Verilog语言。如果没有,你可以先去看看Verilog设计者指南(V erilog Designer’s Guide)。 * Data types * RTL design * Interfaces * Clocking * Assertion-based verification * Classes * Testbench automation and constraints * The Direct Programming Interface (DPI) SystemVerilog 的数据类型 这个手册将描述Systemverilog新引进的数据类型。他们大多数都是可以综合的,并且可以使RTL级描述更易于理解和书写。 整型和实型 SystemVerilog引进了几种新的数据类型。C语言程序员会熟悉其中的大多数。引进新的数据类型构思是这样的,如果C语言和SystemVerilog有相同的数据类型可以使C语言算法模型更容易的转化为SystemVerilog模型。 Verilog的变量类型有四态:既是0,1,X,Z。SystemVerilog引进了新的两态数据类型,每一位只可以是0或是1。当你不需要使用的X和Z值时,譬如在写Testbench和做为for语句的循环变量。使用两态变量的RTL级模型,可以使模拟器更有效率。并且使用得当的话将不会对综合结果产生影响。 二态整型 类型描述例子 Bit user-defined size bit [3:0] a_nibble; Byte 8 bits, unsigned byte a, b; Shortint 16 bits, signed shortint c, d; Int 32 bits, signed int i,j; Longint 64 bits, signed longint lword;

Systemverilog的一个牛人总结

转一篇Systemverilog的一个牛人总结 (2012-12-12 16:47:06) 转载▼ 标签: 分类:Dreamywork systemverilog 验证 面向对象 杂谈 Systemverilog 数据类型 l 合并数组和非合并数组 1)合并数组: 存储方式是连续的,中间没有闲置空间。 例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个32bit的数据。 表示方法: 数组大小和位,必须在变量名前指定,数组大小必须是【msb:lsb】 Bit[3:0] [7:0] bytes ; 2)二维数组和合并数组识别: 合并数组: bit [3:0] [7:0] arrys; 大小在变量名前面放得,且降序 二维数组: int arrays[0:7] [0:3] ; 大小在变量名后面放得,可降序可升序 位宽在变量名前面,用于识别合并和非合并数组,位宽在后面,用于识别数组中元素个数。 3)非合并数组 一般仿真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。 非合并数组:字的地位存放变量,高位不用。 表示方法: Bit [7:0] bytes; 4)合并数组和非合并数组的选择 (1)当需要以字节或字为单位对存储单元操作。 (2)当需要等待数组中变化的,则必须使用合并数组。例如测试平台需要通过存储器数据的变化来唤醒,需要用到@,@只能用于标量或者合并数组。

Bit[3:0] [7:0] barray[3] ; 表示合并数组,合并数组中有3个元素,每个元素时8bit,4个元素可以组成合并数组 可以使用barry[0]作敏感信号。 l 动态数组 随机事物不确定大小。 使用方法:数组在开始是空的,同时使用new[]来分配空间,在new[n]指定元素的个数。 Int dyn[]; Dyn = new[5]; //分配5个元素空间 Dyn.delete() ; //释放空间 l 队列 在队列中增加或删除元素比较方便。 l 关联数组 当你需要建立一个超大容量的数组。关联数组,存放稀疏矩阵中的值。 表示方法: 采用在方括号中放置数据类型的形式声明: Bit[63:0] assoc[bit[63:0]]; l 常量: 1)Verilog 推荐使用文本宏。 好处:全局作用范围,且可以用于位段或类型定义 缺点:当需要局部常量时,可能引起冲突。 2)Parameter 作用范围仅限于单个module 3)Systemverilog: 参数可以在多个模块里共同使用,可以用typedef 代替单调乏味的宏。 过程语句 l 可以在for循环中定义变量,作用范围仅在循环内部 for(int i=0;i<10;i++) array[i] =i; l 任务、函数及void函数 1)区别:

SystemVerilog语言简介(doc 26页)

SystemVerilog语言简介(doc 26页)

SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等,这些都使得SystemVerilog在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog由Accellera 开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。下面我们从几个方面对SystemV erilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。 1. 接口(Interface) Verilog模块之间的连接是通过模块端口进行的。为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。不幸的是,在设计的早期,我们很难把握设计的细节。而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。 SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。接口在关键字interface和e ndinterface之间定义,它独立于模块。接口在模块中就像一个

单一的端口一样使用。在最简单的形式下,一个接口可以认为是一组线网。例如,可以将PCI总线的所有信号绑定在一起组成一个接口。通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。下面是一个接口的使用实例:

system verilog 类的继承

类的继承 SystemVerilog支持单继承(类似Java,而不像C++). 有一个让SystemVerilog支持多重继承的提案[1], 但是短期内不会看到曙光。 目录 ? 1 什么是继承? ? 2 有什么好处 ? 3 开-关定律 ? 4 参考资料 什么是继承? 继承是面向对象编程范式的关键概念。类用来创建用户自定义类型. 继承使得用户可以用非常安全,非侵入的方式对类的行为进行增加或者修改。 使用继承可以定义子类型,在子类型中增加新的方法和数据。被继承的类一般称为基类(SystemVerilog中的超类),得到的新类一般称为引申类(或子类)。 为什么继承如此重要? 因为它使得复用得以实现。让我们通过实例来说明. 假设我们对一个图像模块进行建模. 对其中一部分,我们写了一个代表颜色的类: class Color; byte unsigned red; byte unsigned green; byte unsigned blue; function new(byte unsigned red_=255, byte unsigned green_=255, byte unsigned blue_=255); red=red_; green=green_; blue=blue_; endfunction:new function mix(Color other); function brighter(float percent); task draw_pixel(int x,int y);

Now现在它的下一个版本希望能够处理部分透明的图像。为此,我们给Color类增加了一个alpha成员,。alpha代表图像的透明度。alpha越大,图像的像素越结实(不透明)。'0'代表完全透明,使得图片的背景全部可见。因此,我们修改color类如下: class Color; byte unsigned red; byte unsigned green; byte unsigned blue; byte unsigned alpha; function new(byte unsigned red_=255, byte unsigned green_=255, byte unsigned blue_=255, byte unsigned alpha_=255); red=red_; green=green_; blue=blue_; alpha=alpha_; endfunction:new function mix(Color other);// new implementation -- would depend on // alpha values for both the colors function brighter(float percent);// original implementation good enough task draw_pixel(int x,int y);// new implementation // Other functions ... endclass:Color 注意,即使许多代码是由之前版本的Color类复制而来,我们还是需要单独维护两个版本的代码。这时继承就可以发挥作用,使用继承,我们可以简单的从原始的Color类继承出新类,来添加alpha成员。 class ColorWithAlpha extends Color; byte unsigned alpha; function new(byte unsigned red_=255, byte unsigned green_=255, byte unsigned blue_=255, byte unsigned alpha_=255);

电工基础知识概述

第一章电工基本基础 第一节直流电路和分析方法 本节主要讨论电路的基本物理量、电路的基本定律,以及应用它们来分析与计算各种直流电路的方法,包括分析电路的工作状态和计算电路中的电位等。这些问题虽然在本节直流电路中提出,但也同样适用于后文介绍的线性交流电路与电子电路中,是分析计算电路的重要基础。 一、电路及基本物理量 1.电路和电路图 电路是由电工设备和元器件按一定方式连接起来的总体,它提供了电流通过的路径。如居室的照明灯电路、收音机电子电路、机床控制电气电路等。随着电流的流动,在电路中进行能量的传输和转换,通常把电能转换成光、热、声、机械等形式的能量。 电路可以是简单的,也可能是复杂的。实际的电路由元件、电气设备和连接导线连接构成。为了便于对电路进行分析和计算,通常把实际的元件加以理想化,用国家统一规定的电路图形符号表示;用这些简单明了的图形符号来表示电路连接情况的图形称为电路图。 例如,图1—1(a)所示的符号代表干电池(电源),长线端代表正极,短线端代表负极。图1—1(b)所示的符号代表小灯泡(负载)。图1—l(c)所示的符号代表开关。用直线表示连接导线将它们连接起来,就构成了一个电路,如图1—2所示。 一般电路都是由电源、负载、开关和连接导线四个基本部分组成的。电源是把非电能能量转换成电能,向负载提供电能的设备,如干电池、蓄电池和发电机等。负载即用电器,是将电能转变成其他形式能量的元器件。如电灯可将电能转变为光能,电炉可将电能转变为热能,扬声器可将电能转变为声能,而电动机可将电能转变为机械能等。开关是控制电路接通或断开的器件。连接导线的作用是输送与分配电路中的电能。 2.电路的基本物理量 (1)电流电荷有规则的运动就形成电流。通常在金属导体内部的电流是自由电子在 电场力作用下运动而形成的。而在电解液中(如蓄电池中),电流是由正、负离子在电场力作用下,沿着相反方向的运动而形成的。 电流的大小用电流强度即电荷的流动率来表示。设在极短的时间内通过导体横截面的电荷量为dq如,则 电流强度 dq i dt (1—l) 其中i是电流强度的符号,电流强度习惯上常被称为电流。 如果任意一时刻通过导体横截面的电荷量都是相等的,而且方向也不随时间变化,

system_verilog教程

基于断言的验证技术 SystemVerilog Tutorials 下面的手册会帮助你了解一些SystemVerilog中最重要的新特点。手册还提供了一些代码样本和例子使你可以对语言有更好"感觉"。这些辅导假设你们已经了解了一些Verilog语言。如果没有,你可以先去看看Verilog设计者指南(V erilog Designer’s Guide)。 * Data types * RTL design * Interfaces * Clocking * Assertion-based verification * Classes * Testbench automation and constraints * The Direct Programming Interface (DPI) SystemVerilog 的数据类型 这个手册将描述Systemverilog新引进的数据类型。他们大多数都是可以综合的,并且可以使RTL级描述更易于理解和书写。 整型和实型 SystemVerilog引进了几种新的数据类型。C语言程序员会熟悉其中的大多数。引进新的数据类型构思是这样的,如果C语言和SystemVerilog有相同的数据类型可以使C语言算法模型更容易的转化为SystemVerilog模型。 Verilog的变量类型有四态:既是0,1,X,Z。SystemVerilog引进了新的两态数据类型,每一位只可以是0或是1。当你不需要使用的X和Z值时,譬如在写Testbench和做为for语句的循环变量。使用两态变量的RTL级模型,可以使模拟器更有效率。并且使用得当的话将不会对综合结果产生影响。 二态整型 类型描述例子 Bit user-defined size bit [3:0] a_nibble;

Systemverilog的数据类型教程

本教程将介绍新引入Systemverilog的数据类型。他们大多数是可综合的,而且使得RTL级描述更易于被编写和理解。 整型和实型 SystemVerilog 引入了几种新的数据类型。C语言程序员会熟悉其中的大多数。引进新的数据类型构思是这样的,如果C语言和SystemVeri log有相同的数据类型的话可以使C语言算法模型更容易的转化为Syst emVerilog模型。 Verilog的变量类型是四态类型:即0,1,X(未知值)和Z(高阻值)。SystemVerilog新引入了两态的数据类型,每一位只可以是0或者1。当你不需要使用的X和Z值时,譬如在写Testbench和做为For 语句的循环变量时。使用两态变量的RTL级模型,可以使仿真器效率更高。而且使用得当的话将不会对综合结果产生任何的影响。 注意:和C语言不一样,SystemVerilog指定了一些固定宽度的数据类型。 logic是一种比reg型更好更完善的数据类型。我们将会看到,你可

以使用logic型来替代过去您有可能使用reg型或wire型的地方。 数组 在Verilog-1995中,你可以定义标量或是矢量类型的线网和变量。你也可以定义一维数组变量类型的存储器数组。在Verilog-2001中允许多维的线网和变量数组存在,并且取消了部分存储器数组用法的限制。 SystemVerilog进一步完善了数组的概念,并对数组重新进行了定义,从而允许对数组进行更多的操作。 在SystemVerilog中,数组可以有压缩尺寸或是非压缩尺寸的属性,也可以同时具有两种属性。考虑下面的例子: reg [3:0][7:0] register [0:9]; 压缩尺寸是[3:0]和[7:0],非压缩尺寸是[0:9] 。(只要你喜欢可以有任意大小的压缩尺寸和非压缩尺寸) 压缩尺寸: 1)保证将在存储器中产生连续的数据 2)可以复制到任何其他的压缩对象中 3)可切片("部分选取") 4)仅限于位类型(bit, logic, int等),其中有些(如int)有固定的 尺寸 相比之下,非压缩数组在内存中的排列方式由仿真器任意选定。我们可以可靠地复制非压缩数组到另一个具有相同数据类型的数组中。对于不同数据类型的数组,你必须使用强制类型转换(有几个非压缩数组转换到压缩数组的规则)。其中非压缩数组可以是任意的类型,如实数数组。

SystemVerilog 中的随机化激励

SystemVerilog中的随机化激励 神州龙芯集成电路设计公司 杨鑫 徐伟俊 陈先勇 夏宇闻 [摘要]:随着集成电路的验证工作日渐复杂,对验证的可靠性提出了越来越高的要求。传统的验证工作中也使用随机化激励以便减轻测试代码编写的工作量,以提升验证的可靠性。在SystemVerilog更强调了利用随机化激励函数以提高验证代码的效率和验证可靠性的重要性。本文以VMM库为例,阐述了如何在SystemVerilog中使用随机化函数来编写高效率的测试代码,重点介绍了可重用验证函数库的使用方法,以帮助读者理解如何使用SystemVerilog高效率地完成复杂的设计验证。 关键字:VMM SystemVerilog 激励随机化 1. 前言 随着电路工艺设计技术的不断发展,集成电路的逻辑设计变得越来越复杂,随之对验证工作提出了更高的要求。由于投片(tip-out)的费用较高,很有必要在投片前对芯片设计进行全面、可信的验证,以尽量减少“设计——测试——投片——调试——发现Bug修改设计”这一流程的迭代次数。因此在集成电路芯片的设计中,尤其是复杂逻辑设计中,对测试工作的效率和可靠性提出了更高的要求。 在传统的验证方法中,也有将激励随机化的方法,这样可以用较少的测试代码生成较多、较全面的测试激励。这些方法减少了人为因素的干扰,能有效地提高验证的工作效率和可靠性。 在SystemVerilog中,强调在验证中使用可重用的验证IP,包括如何生成随机化激励。对于如何尽可能地使用已有的验证IP,以及编写符合标准的可重用验证组件,SystemVerilog提供了一整套的工作机制,这使得符合规范的随机化激励组件能够很好地在多个设计间复用,这更进一步地提高了验证工作的效率和可靠性。 2. 在验证中使用随机化激励 在验证中,可以依照DUT(Design Under Test,被测设计,以下简称DUT)的验证要求来设计定向的激励,并对照DUT的预期响应,用人工的方法来判断设计是否正确。但也可以使用随机化激励来驱动DUT,并使用特定的机制来完成响应的自检测。 利用随机化来产生激励可以看作一种近似的自动化激励产生,因为随机化足够长的时间后,所生成的激励可以覆盖绝大部分的待验证特性。但是纯粹的随机化激励效率并不高,因为其中正确的,或是有意义的激励只占很少一部分。必须使用一定的约束条件限制随机化的范围,从而产生大量随机而有意义的激励。

家具基础知识概述

一:世界家具行业发展简史 世界家具风格的演变。 1、歌特式家具(古典式) 2、意大利家具(米兰国际展在全世界最具影响力,在15世纪文化复兴以后,建筑影响了家具的风格) 3、德国家具(15——20世纪) A、北日耳曼风格家具(以雕刻和镶嵌来装饰) B、北欧风格家具(以原木为材料,在丹麦、瑞典等北欧是一种潮流) C、德国的包豪斯家具(20世纪依赖机器,设计师将工艺、工业融于一起) 4、英国家具 A、都铎式家具:15世纪,虽具皇家色彩但有些苯拙,简单粗糙,橡木时期; B、雅可宾式家具:16世纪,特点是球/圆形脚、家具直线多,这种样式也叫弗兰德式; C、胡桃木时期:17世纪初,曲线代替雅可宾的直线;

D、安娜女王式家具:17世纪中叶,曲线椅子、弯脚和琴式高椅背,东方风格、刺绣; E、奇彭代尔.赫普怀特家具风行:融合了中国元素的回纹、窗格造型。 同时期其它风行的家具还有 A)、亚当式家具:六角八角形,椭圆形,古典精神 B )、新个人风格:19世纪 5、法国家具 A、巴洛克式(路易十四式)风格,17世纪,豪华奔放型(深圳金凤凰同其风格); B、洛可可风格,17世纪下半页,是为巴洛克风格的延续,很粗放,不够细腻; C、帝国式家具:粗线条、古典题材、深绿、红褐,红木、檀木、花梨等为材料 D、新古典主义风格:法国、英国、美国等流行于19世纪(是对巴洛克、洛可可风格的延续简单线条,透明型) 以下国家的流行风格都是由其发展而来: 法国的帝欧式 英国的摄政式 美国的邓肯法夫式 现代的迪卡、天一、金凤凰、也源于此风格。 6、美国家具:1 7、18世纪,简单造型,形式多样,美式新

古典家具由英法起源。 7、中国:可以说发展于明清时期(红木家具时期) A、明代家具:14——18世纪,结构沿用中国早期建筑的梁柱结构,简洁、比例适中,对称均匀,线条挺秀,舒展。现在的“友联)具有明式风格。 B、清代家具:设计简单,继承了明代家具的整体结构,以不施过多装饰的特点见长;显得华丽、厚重。现代的“美联“具有清式风格。 明式家具巧妙而合理使用各种榫卯结构,造型蕴涵着对比美,对称和均衡的美。 清代家具漆冷红工艺,弯腿造型,雕刻屏风。 C、红木家具的特色和流派。 明式家具没有流派,到清朝才出现各地特色的家具。具体有:苏式、广式、宁式、京式。 (a)、苏式。明式家具是苏式的代表作,由于广式、京式家具的涌现,进入宫廷的苏式家具就越来越少。生产出来的家具就逐渐转向市场。为了能迎合各消费层次的不同需求,必须改进苏式家具的工艺和用料,表面用料整齐、文理漂亮、而在背板、顶底板、抽斗侧板及底板用其它杂木代替,雕花采用不规则的图案,如灵芝、云头,图案的随意性大,无标准,做工要求低。在接缝区采用贴布补救涨缩毛病,保持典雅的民族装饰风格及精湛的传统工艺。

System Verilog笔记总结

Systemverilog 数据类型 l 合并数组和非合并数组 1)合并数组: 存储方式是连续的,中间没有闲置空间。 例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个32bit的数据。 表示方法: 数组大小和位,必须在变量名前指定,数组大小必须是【msb:lsb】 Bit[3:0] [7:0] bytes ; 2)二维数组和合并数组识别: 合并数组: bit [3:0] [7:0] arrys; 大小在变量名前面放得,且降序 二维数组: int arrays[0:7] [0:3] ; 大小在变量名后面放得,可降序可升序 位宽在变量名前面,用于识别合并和非合并数组,位宽在后面,用于识别数组中元素个数。 3)非合并数组 一般仿真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。 非合并数组:字的地位存放变量,高位不用。 表示方法: Bit [7:0] bytes; 4)合并数组和非合并数组的选择 (1)当需要以字节或字为单位对存储单元操作。 (2)当需要等待数组中变化的,则必须使用合并数组。例如测试平台需要通过存储器数据的变化来唤醒,需要用到@,@只能用于标量或者合并数组。 Bit[3:0] [7:0] barray[3] ; 表示合并数组,合并数组中有3个元素,每个元素时8bit,4个元素可以组成合并数组 可以使用barry[0]作敏感信号。 l 动态数组 随机事物不确定大小。 使用方法:数组在开始是空的,同时使用new[]来分配空间,在new[n]指定元素的个数。 Int dyn[]; Dyn = new[5]; //分配5个元素空间 Dyn.delete() ; //释放空间

最新整理Systemverilog语言简介.doc

SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 1364-20 xx Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充了C语言数据类型、结构、压缩和非压缩数组、接口、断言等等,这些都使得SystemVerilo g在一个更高的抽象层次上提高了设计建模的能力。SystemVerilog由Acceller a开发,它主要定位在芯片的实现和验证流程上,并为系统级的设计流程提供了强大的连接能力。下面我们从几个方面对SystemVerilog所作的增强进行简要的介绍,期望能够通过这个介绍使大家对SystemVerilog有一个概括性的了解。 1. 接口(Interface) Verilog模块之间的连接是通过模块端口进行的。为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。不幸的是,在设计的早期,我们很难把握设计的细节。而且,一旦模块的端口定义完成后,我们也很难改变端口的配置。另外,一个设计中的许多模块往往具有相同的端口定义,在Verilog中,我们必须在每个模块中进行相同的定义,这为我们增加了无谓的工作量。 SystemVerilog提供了一个新的、高层抽象的模块连接,这个连接被称为接口(Interface)。接口在关键字interface和endinterface之间定义,它独立于模块。接口在模块中就像一个单一的端口一样使用。在最简单的形式下,一个接口可以认为是一组线网。例如,可以将PCI总线的所有信号绑定在一起组成一个接口。通过使用接口,我们在进行一个设计的时候可以不需要首先建立各个模块间的互连。随着设计的深入,各个设计细节也会变得越来越清晰,而接口内的信号也会很容易地表示出来。当接口发生变化时,这些变化也会在使用该接口的所有模块中反映出来,而无需更改每一个模块。下面是一个接口的使用实例:interface chip_bus; // 定义接口 wire read_request, read_grant; wire [7:0] address, data; endinterface: chip_bus module RAM (chip_bus io, // 使用接口 input clk); // 可以使用io.read_request引用接口中的一个信号 endmodule module CPU(chip_bus io, input clk); ...

英语语言基础知识概述

英语语言基础知识概述 了解到了英语的衍变、英语词汇、英语语法、英语语音等基础知识;通过了解和掌握与英语学习有关的语言基础知识,为英语学习奠定一定的基础。 一、英语的衍变 英语有着悠久的历史,它的发展和衍变过程主要经历过以下几个阶段: (1)罗马帝国 公元前55年,罗马统帅恺撒,正率兵征战高卢,率军跨过英吉利海峡,罗马人的到来,让这个没有文字只有语言的,史前时代的土著民族进入了拉丁文字时代。这是在因英语成型之前的第一次引进拉丁文字,拉丁语成了官方语言。 (2)西日尔曼民族 在公元五世纪西日尔曼民族来到英伦三岛,成为了统治者。来到岛上的主要是Anglo-Saxon 人。这一时期,几乎所有的英语都是日尔曼语固有的词汇,这些词汇奠定了古英语的基础。日尔曼语中的前缀,后缀派生构词法,在这一时期也传入了英语,使英语成为了一门繁殖能力很强的语言。所以英语,尤其是古英语跟德语的语法几乎一样,词汇十分相似。 (3)诺曼征服 诺曼人是法国北部的人,打败了法国北部的高卢人,又逐渐被法国的文化所同化。法国统治的400多年里,为英国带来了丰富的法语词汇。当时的法国社会是三种语言并行的社会,法语是贵族使用的语言,拉丁语是宗教语言,英语是市井阶层使用的语言。所以从法语中引入了学多与国家政治有关,与艺术生活有关的词汇。 (4)文艺复兴 文艺复兴的目的是摆脱中世纪宗教思想的束缚,因此大量借鉴古希腊罗马的语言,在英语中引入了大量拉丁词汇。例如以o结尾的单词,大部分都是艺术词汇,还有许多医学词汇都借鉴了拉丁词根。 二、英语词的构成 英语词除拟声词外,绝大多数是由词根或根词加词缀或不加词缀,或者再通过合成、缩略等构成的。换句话说,英语词大多数是来源于下列构词方法:派生法、合成法、转化法、缩略法、逆法、拟声法。 (1)派生法: 英语词中的派生词有两大类型:一是以根词为主,附加前缀后缀构成;另一类是以词根为主,附加前缀或后缀构成。 第一类型包括以下几种:前缀十根词、根词十后缀、前缀十根词+后缀、组合形式十根词,这一类型的派生词大多出现在术语中 第二类型则包括以下几种:前缀+词根、词根十后缀、前缀+词根十后缀,有时几个前缀后缀在连在一起用、组合形式+组合形式,组合形式的结合不限于两个,科技术语中三个组合而成的词比比皆是。组合形式结合成词后还可以加上后缀,以改变其词性。由此可见,组合形式具有构词能力强,结合灵活的特点。 (2)合成法 把两个或两个以上独立的词结合在一起构成新词的方法叫合成法,用合成法构成的词叫 合成词。英语词有许多词是按合成法构成的。复合词的意义一般可从词面上一目了然,但也有少数词义比较曲折,不易看出。合成词按词类可分为四种:1、合成词;2、合成形容词;3、合

System verilog概述

SystemVerilog断言及其应用 神州龙芯集成电路设计公司 陈先勇 徐伟俊 杨鑫 夏宇闻 [摘要]:在介绍SystemVerilog断言的概念、使用断言的好处、断言的分类、断言的组成以及断言如何被插入到被测设计(DUT)的基础上,本文详细地介绍了如何使用不同的断言语句对信号之间的复杂时序关系进行严格的检查,并针对每个例子展示了在ModelSim 6.1b仿真环境中所显示的波形。本文旨在帮助读者理解如何使用断言对设计中信号间复杂时序关系进行验证的方法,并由此介绍一些基本的SystemVerilog断言、操作符、代码段和断言验证方法学。 关键字:SystemVerilog,断言, DUT, SVA,Assertion 1.前言 当今,数字电路的规模和复杂度在不断增长,这使得对设计进行彻底的验证将成为一项巨大的挑战。在整个芯片设计过程中,验证工作所需的时间将占去设计周期的70%~80%,验证工程师的人数将是设计工程师的两倍。这就迫切需要提高验证工作的效率,以解决验证瓶颈问题。 传统上,对被测设计(DUT)的验证都是通过在DUT的输入端口加上具有特定时序激励,然后观察DUT的内部状态变化和最后的输出信号,以确定DUT工作是否正确。这种方法对简单的小规模的设计很有用。但当设计规模变大时,要想使用这种方法来验证DUT是不现实的。因为对于规模大的设计,要想遍历设计将遇到的各种情况,验证其正确性,需要成千上万的特定时序激励。并且如果设计稍有一点变动,这些时序激励就得重新编写。设计的复杂性迫使验证工程师使用随机测试平台来生成更多的验证激励。高级验证语言,如OVA,PSL等,便在创建复杂测试平台时得到了广泛的应用。但这些验证语言和RTL级的编码语言不一致,使得验证很容易出现错误,造成调试工作的不方便。 SystemVerilog的出现可以解决这些问题。 SystemVerilog是在Verilog语言的基础上发展而来的,用SystemVerilog语言可以很容易地生成复杂的随机测试激励,并能方便地编写断言和测试代码覆盖率的代码。断言在验证过程中的用途如下图所示:

个人总结Verilog代码编写的25条经验

个人总结Verilog代码编写的25条经验 1、对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; 2、使用有意义的信号名、端口名、函数名和参数名; 3、信号名长度不要太长; 4、对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀; 5、对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; 6、对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; 7、对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; 8、当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示; 9、尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; 10、在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等; 11、使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; 12、每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性; 13、建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; 14、在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; 15、在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序: 输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals; 16、在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误; 17、如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性;

利用Systemverilog+UVM搭建SOC及ASIC的RTL验证环境

基于SV+UVM搭建SOC/ASIC验证平台 UVM-1.1中提供了一个UBUS的例子,但是该例子对于刚刚入门的人来说还是需要一定时间去消化的,本文对该例子进行一步一步的简化,可以帮助理解。 [1-11]如何顺序的写UVM平台(1)-Basic [1- 1.平台可以在前期规划好,但是对于搭建平台的人来说,调试永远是最大的问题,如果都 将一个个component都写完了,调试起来还是有点痛苦的,所以我更倾向于一步一步的调试平台;先写一个可以pass的基本平台,然后在不断的扩展该平台,最后在各个component中加入所需要的function或者task。当然,当对搭建平台数量以后,现在基本对平台中的component一次性搭建完成,然后调试并添加需要的function或者task即可。 2.最简单的UVM平台,一个interface,一个DUT,一个TOP,一个test,一个ENV就 可以工作了,然后慢慢的添加各个component; 3.写interface 4.写top module,在top中例化DUT,interface和DUT在top中include uvm_config_db#(virtual ubus_if)::set(uvm_root::get(),"*","vif",vif);

run_test(); 5.写Makefile,此时编译可以通过 6.写自定义的package,然后在top中include该package typedef uvm_config_db#(virtual ubus_if)ubus_vif_config; typedef virtual ubus_if ubus_vif; 后来证明,这两句话在ubus的env中根本没有用上; 7.定义Environment,并将该文件加入到自定义的package中,这个时候编译不能通过 此处的get和top中的set是一对,如果top中没有set则会报告·uvm_fatal中的错误if(!uvm_config_db#(virtual ubus_if)::get(this,"","vif",vif)) `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".vif"}); 8.定义base_test,需要在top中include该test文件,并在makefile中加入编译该test的 命令;此时可以再次编译通过,并运行最basic的testcase

相关文档
最新文档