爱游戏-System Verilog的概念以及与verilog的对比

System Verilog的概念和与verilog的对照 时候:2024-12-27 23:13:03 手机看文章

扫描二维码随时随地手机看文章

 

SystemVerilog是一种硬件描写和验证说话(HDVL),它基在IEEE1364-2001 Verilog硬件描写说话(HDL),并对其进行了扩大,包罗扩充了C说话数据类型、布局、紧缩和非紧缩数组、 接口、断言等等,这些都使得SystemVerilog在一个更高的抽象条理上提高了设计建模的能力。SystemVerilog由Accellera开辟,它首要定位在芯片的实现和验证流程上,并为系统级的设计流程供给了壮大的毗连能力。下面我们从几个方面临SystemVerilog所作的加强进行扼要的介绍,期望可以或许经由过程这个介绍使大师对SystemVerilog有一个归纳综合性的领会。1. 接口(Interface)Verilog模块之间的毗连是经由过程模块端口进行的。为了给构成设计的各个模块界说端口,我们必需对期望的硬件设计有一个具体的熟悉。不幸的是,在设计的初期,我们很难掌控设计的细节。并且,一旦模块的端口界说完成后,我们也很难改变端口的设置装备摆设。别的,一个设计中的很多模块常常具有不异的端口界说,在Verilog中,我们必需在每一个模块中进行不异的界说,这为我们增添了无谓的工作量。SystemVerilog供给了一个新的、高层抽象的模块毗连,这个毗连被称为接口(Interface)。接口在要害字interface和endinterface之间界说,它自力在模块。接口在模块中就像一个单一的端口一样利用。在最简单的情势下,一个接口可以认为是一组线网。例如,可以将PCI总线的所有旌旗灯号绑定在一路构成一个接口。经由过程利用接口,我们在进行一个设计的时辰可以不需要起首成立各个模块间的互连。跟着设计的深切,各个设计细节也会变得愈来愈清楚,而接口内的旌旗灯号也会很轻易地暗示出来。当接口产生转变时,这些转变也会在利用该接口的所有模块中反应出来,而无需更改每个模块。下面是一个接口的利用实例:复制代码1 interface chip_bus;// 界说接口23 wireread_request, read_grant;45 wire [7:0]address, data;67 endinterface: chip_bus89 1011 module RAM(chip_bus io, // 利用接口1213 inputclk);1415 //可使用io.read_request援用接口中的一个旌旗灯号1617 endmodule1819 2021 module CPU(chip_busio, input clk);2223 ...2425 endmodule2627 2829 module top;3031 reg clk = 0;3233 chip_busa; // 实例接口3435 //将接口毗连到模块实例3637 RAM mem(a,clk);3839 CPU cpu(a,clk);4041 endmodule现实上,SystemVerilog的接口不但仅可以暗示旌旗灯号的绑定和互连。因为SystemVerilog的接口中可以包括参数、常量、变量、布局、函数、使命、initial块、always块和持续赋值语句,所以SystemVerilog的接口还可以包括内建的和谈查抄和被利用该接口的模块所共用的功能。2. 全局声明和语句在Verilog中,除一个模块可以作为模块实例援用其他模块外,其实不存在一个全局空间。别的,Verilog答应肆意数量的顶层模块,是以会发生毫无联系关系的条理树。SystemVeriog增添了一个被称为美金root的隐含的顶级条理。任安在模块鸿沟以外的声明和语句都存在在美金root空间中。所有的模块,不管它处在哪个设计条理,都可以援用美金root中声明的名字。如许,假如某些变量、函数或其它信息被设计中的所有模块同享,那末我们便可以将它们作为全局声明和语句。全局声明和语句的一个利用实例以下:1 reg error_flag; // 全局变量23 function compare(...); // 全局函数45 always@(error_flag) // 全局语句67 ...89 module test;1011 chip1 u1(...)1213 endmodule1415 1617 module chip1(...);1819 FSM u2(...);2021 always@(data)2223 error_flag= compare(data, expected);2425 endmodule2627 2829 module FSM(...);3031 ...3233 always @(state)3435 error_flag= compare(state, expected);3637 endmodule3. 时候单元和精度在Verilog中,暗示时候的值利用一个数来暗示,而不带有任什么时候间单元。例如:forever #5clock= ~clock;从这一句中我们没法判定5代表的是5ns? 5ps? 仍是其他。Verilog的时候单元和精度是作为每个模块的属性,并利用编译器指令`timescale来设置。利用这类方式具有固有的缺点,由于编译器指令的履行依靠在源代码的编译挨次,编译器老是将它碰到的最后一个`timescale设置的时候单元和精度作为以后的尺度。那末,假设有些模块之前没有利用`timescale设置时候单元和精度,这就有可能呈现统一个源代码的分歧仿真会呈现分歧成果的环境。SystemVerilog为了节制时候单元插手了两个主要的加强。起首,时候值可以显式地指定一个单元。时候单元可所以s、ms、ns、ps或fs。时候单元作为时候值的后缀呈现。例如:forever #5nsclock= ~clock;其次,SystemVerilog答应利用新的要害字(timeunits和timeprecision)来指按时间单元和精度。这些声明可以在任何模块中指定,同时也能够在美金root空间中全局指定。时候单元和精度必需是10的幂,规模可以从s到fs。例如:timeunits 1ns;timeprecision 10ps;4. 抽象数据类型Verilog供给了面向底层硬件的线网、寄放器和变量数据类型。这些类型代表了4态逻辑值,凡是用来在底层上对硬件进行建模和验证。线网数据类型还具有多个强度级别,而且可以或许为多驱动源的线网供给解析功能。SystemVerilog包罗了C说话的char和int数据类型,它答应在Verilog模子和验证法式中直接利用C和C++代码。VerilogPLI不再需要集成总线功能模子、算法模子和C函数。SystemVerilog还为Verilog插手了几个新的数据类型,以便可以或许在更抽象的条理上建模硬件。l char:一个两态的有符号变量,它与C说话中的char数据类型不异,可所以一个8位整数(ASCII)或short int(Unicode);l int:一个两态的有符号变量,它与C说话中的int数据类型类似,但被切确地界说成32位;l shortint:一个两态的有符号变量,被切确地界说成16位;l longint:一个两态的有符号变量,它与C说话中的long数据类型类似,但被切确地界说成64位;l byte:一个两态的有符号变量,被切确地界说成8位;l bit:一个两态的可以具有肆意向量宽度的无符号数据类型,可以用来替换Verilog的reg数据类型;l logic:一个四态的可以具有肆意向量宽度的无符号数据类型,可以用来替换Verilog的线网或reg数据类型,但具有某些限制;l shortreal:一个两态的单精度浮点变量,与C说话的float类型不异;l void:暗示没有值,可以界说成一个函数的返回值,与C说话中的寄义不异。SystemVerilog的bit和其他数据类型答应用户利用两态逻辑对设计建模,这类方式对仿真机能更有用率。因为Verilog说话没有两态数据类型,是以很多仿真器都经由过程将这类功能作为仿真器的一个选项供给。这些选项不克不及够在所有的仿真器之间移植,并且在需要时用三态或四态逻辑的设计中强迫利用两态逻辑还具有副感化。SystemVerilog的bit数据类型可以或许极年夜改良仿真器的机能,同时在需要的时辰依然可使用三态或四态逻辑。经由过程利用具有肯定行动的数据类型来取代专有的仿真器选项,两态模子可以或许在所有的SystemVerilog仿真器间移植。SystemVerilog的logic数据类型比Verilog的线网和寄放器数据类型加倍矫捷,它使得在任何抽象条理上建模硬件都加倍轻易。logic类型可以或许以下面的任何一种方式赋值:l 经由过程肆意数量的进程赋值语句赋值,可以或许替换Verilog的reg类型;l 经由过程单一的持续赋值语句赋值,可以或许有限制地替换Verilog的wire类型;l 毗连到一个单一原语的输出,可以或许有限制地替换Verilog的wire类型;因为logic数据类型可以或许被用来替换Verilog的reg或wire(具有限制),这就使得可以或许在一个更高的抽象条理上建模,而且跟着设计的不竭深切可以或许插手一些设计细节而没必要改变数据类型的声明。logic数据类型不会暗示旌旗灯号的强度也不具有线逻辑的解析功能,是以logic数据类型比Verilog的wire类型更能有用地仿真和综合。5. 有符号和无符号限制符缺省环境下,Verilog net和reg数据类型是无符号类型,integer类型是一个有符号类型。Verilog-2001尺度答应利用signed要害字将无符号类型显式地声明成有符号类型。SystemVerilog插手了类似的能力,它可以经由过程unsigned要害字将有符号数据类型显式地声明成有没有符号数据类型。例如:int unsigned j;....SystemVerilog说话简介SystemVerilog是一种硬件描写和验证说话(HDVL),它基在IEEE1364-2001 Verilog硬件描写说话(HDL),并对其进行了扩大,包罗扩充了C说话数据类型、布局、紧缩和非紧缩数组、 接口、断言等等,这些都使得SystemVerilog在一个更高的抽象条理上提高了设计建模的能力。SystemVerilog由Accellera开辟,它首要定位在芯片的实现和验证流程上,并为系统级的设计流程供给了壮大的毗连能力。下面我们从几个方面临SystemVerilog所作的加强进行扼要的介绍,期望可以或许经由过程这个介绍使大师对SystemVerilog有一个归纳综合性的领会。1. 接口(Interface)Verilog模块之间的毗连是经由过程模块端口进行的。为了给构成设计的各个模块界说端口,我们必需对期望的硬件设计有一个具体的熟悉。不幸的是,在设计的初期,我们很难掌控设计的细节。并且,一旦模块的端口界说完成后,我们也很难改变端口的设置装备摆设。别的,一个设计中的很多模块常常具有不异的端口界说,在Verilog中,我们必需在每一个模块中进行不异的界说,这为我们增添了无谓的工作量。SystemVerilog供给了一个新的、高层抽象的模块毗连,这个毗连被称为接口(Interface)。接口在要害字interface和endinterface之间界说,它自力在模块。接口在模块中就像一个单一的端口一样利用。在最简单的情势下,一个接口可以认为是一组线网。例如,可以将PCI总线的所有旌旗灯号绑定在一路构成一个接口。经由过程利用接口,我们在进行一个设计的时辰可以不需要起首成立各个模块间的互连。跟着设计的深切,各个设计细节也会变得愈来愈清楚,而接口内的旌旗灯号也会很轻易地暗示出来。当接口产生转变时,这些转变也会在利用该接口的所有模块中反应出来,而无需更改每个模块。下面是一个接口的利用实例:interface chip_bus;// 界说接口wireread_request, read_grant;wire [7:0]address, data;endinterface: chip_busmodule RAM(chip_bus io, // 利用接口inputclk);//可使用io.read_request援用接口中的一个旌旗灯号endmodulemodule CPU(chip_busio, input clk);...endmodulemodule top;reg clk = 0;chip_busa; // 实例接口//将接口毗连到模块实例RAM mem(a,clk);CPU cpu(a,clk);endmodule现实上,SystemVerilog的接口不但仅可以暗示旌旗灯号的绑定和互连。因为SystemVerilog的接口中可以包括参数、常量、变量、布局、函数、使命、initial块、always块和持续赋值语句,所以SystemVerilog的接口还可以包括内建的和谈查抄和被利用该接口的模块所共用的功能。2. 全局声明和语句在Verilog中,除一个模块可以作为模块实例援用其他模块外,其实不存在一个全局空间。别的,Verilog答应肆意数量的顶层模块,是以会发生毫无联系关系的条理树。SystemVeriog增添了一个被称为美金root的隐含的顶级条理。任安在模块鸿沟以外的声明和语句都存在在美金root空间中。所有的模块,不管它处在哪个设计条理,都可以援用美金root中声明的名字。如许,假如某些变量、函数或其它信息被设计中的所有模块同享,那末我们便可以将它们作为全局声明和语句。全局声明和语句的一个利用实例以下:reg error_flag; // 全局变量function compare(...); // 全局函数always@(error_flag) // 全局语句...module test;chip1 u1(...)endmodulemodule chip1(...);FSM u2(...);always@(data)error_flag= compare(data, expected);endmodulemodule FSM(...);...always @(state)error_flag= compare(state, expected);endmodule3. 时候单元和精度在Verilog中,暗示时候的值利用一个数来暗示,而不带有任什么时候间单元。例如:forever #5clock= ~clock;从这一句中我们没法判定5代表的是5ns? 5ps? 仍是其他。Verilog的时候单元和精度是作为每个模块的属性,并利用编译器指令`timescale来设置。利用这类方式具有固有的缺点,由于编译器指令的履行依靠在源代码的编译挨次,编译器老是将它碰到的最后一个`timescale设置的时候单元和精度作为以后的尺度。那末,假设有些模块之前没有利用`timescale设置时候单元和精度,这就有可能呈现统一个源代码的分歧仿真会呈现分歧成果的环境。SystemVerilog为了节制时候单元插手了两个主要的加强。起首,时候值可以显式地指定一个单元。时候单元可所以s、ms、ns、ps或fs。时候单元作为时候值的后缀呈现。例如:forever #5nsclock= ~clock;其次,SystemVerilog答应利用新的要害字(timeunits和timeprecision)来指按时间单元和精度。这些声明可以在任何模块中指定,同时也能够在美金root空间中全局指定。时候单元和精度必需是10的幂,规模可以从s到fs。例如:timeunits 1ns;timeprecision 10ps;4. 抽象数据类型Verilog供给了面向底层硬件的线网、寄放器和变量数据类型。这些类型代表了4态逻辑值,凡是用来在底层上对硬件进行建模和验证。线网数据类型还具有多个强度级别,而且可以或许为多驱动源的线网供给解析功能。SystemVerilog包罗了C说话的char和int数据类型,它答应在Verilog模子和验证法式中直接利用C和C++代码。VerilogPLI不再需要集成总线功能模子、算法模子和C函数。SystemVerilog还为Verilog插手了几个新的数据类型,以便可以或许在更抽象的条理上建模硬件。l char:一个两态的有符号变量,它与C说话中的char数据类型不异,可所以一个8位整数(ASCII)或short int(Unicode);l int:一个两态的有符号变量,它与C说话中的int数据类型类似,但被切确地界说成32位;l shortint:一个两态的有符号变量,被切确地界说成16位;l longint:一个两态的有符号变量,它与C说话中的long数据类型类似,但被切确地界说成64位;l byte:一个两态的有符号变量,被切确地界说成8位;l bit:一个两态的可以具有肆意向量宽度的无符号数据类型,可以用来替换Verilog的reg数据类型;l logic:一个四态的可以具有肆意向量宽度的无符号数据类型,可以用来替换Verilog的线网或reg数据类型,但具有某些限制;l shortreal:一个两态的单精度浮点变量,与C说话的float类型不异;l void:暗示没有值,可以界说成一个函数的返回值,与C说话中的寄义不异。SystemVerilog的bit和其他数据类型答应用户利用两态逻辑对设计建模,这类方式对仿真机能更有用率。因为Verilog说话没有两态数据类型,是以很多仿真器都经由过程将这类功能作为仿真器的一个选项供给。这些选项不克不及够在所有的仿真器之间移植,并且在需要时用三态或四态逻辑的设计中强迫利用两态逻辑还具有副感化。SystemVerilog的bit数据类型可以或许极年夜改良仿真器的机能,同时在需要的时辰依然可使用三态或四态逻辑。经由过程利用具有肯定行动的数据类型来取代专有的仿真器选项,两态模子可以或许在所有的SystemVerilog仿真器间移植。SystemVerilog的logic数据类型比Verilog的线网和寄放器数据类型加倍矫捷,它使得在任何抽象条理上建模硬件都加倍轻易。logic类型可以或许以下面的任何一种方式赋值:l 经由过程肆意数量的进程赋值语句赋值,可以或许替换Verilog的reg类型;l 经由过程单一的持续赋值语句赋值,可以或许有限制地替换Verilog的wire类型;l 毗连到一个单一原语的输出,可以或许有限制地替换Verilog的wire类型;因为logic数据类型可以或许被用来替换Verilog的reg或wire(具有限制),这就使得可以或许在一个更高的抽象条理上建模,而且跟着设计的不竭深切可以或许插手一些设计细节而没必要改变数据类型的声明。logic数据类型不会暗示旌旗灯号的强度也不具有线逻辑的解析功能,是以logic数据类型比Verilog的wire类型更能有用地仿真和综合。5. 有符号和无符号限制符缺省环境下,Verilog net和reg数据类型是无符号类型,integer类型是一个有符号类型。Verilog-2001尺度答应利用signed要害字将无符号类型显式地声明成有符号类型。SystemVerilog插手了类似的能力,它可以经由过程unsigned要害字将有符号数据类型显式地声明成有没有符号数据类型。例如:intunsigned j;值得留意的是unsigned在Verilog中是一个保存字,但并没有被Verilog尺度利用。6. 用户界说的类型Verilog不答应用户界说新的数据类型。SystemVerilog经由过程利用typedef供给了一种方式来界说新的数据类型,这一点与C说话近似。用户界说的类型可以与其它数据类型一样地利用在声明傍边。例如:typedefunsigned int uint;uint a, b;一个用户界说的数据类型可以在它的界说之前利用,只要它起首在空的typedef中申明,例如:typedef int48; // 空的typedef,在其他处所进行完全界说int48 c;7. 列举类型在Verilog说话中不存在列举类型。标识符必需被显式地声明成一个线网、变量或参数并被赋值。SystemVerilog答应利用近似在C的语法发生列举类型。一个列举类型具有一组被定名的值。缺省环境下,值从初始值0最先递增,可是我们可以显式地指定初始值。列举类型的例子以下:enum {red,yellow, green} RGB;enum {WAIT=2’b01, LOAD, DONE} states;我们还可使用typedef为列举类型指定一个名字,从而答应这个列举类型可以在很多处所利用。例如:typedefenum {FALSE=1’b0, TRUE} boolean;boolean ready;booleantest_complete;8. 布局体和结合体在Verilog说话中不存在布局体或结合体,而布局体或结合体在将几个声明组合在一路的时辰很是有效。SystemVerilog增添告终构体和结合体,它们的声明语法近似在C。struct {reg [15:0] opcode;reg [23:0] addr;} IR;union {int I;shortreal f;} N;布局体或结合体中的域可以经由过程在变量名和域名字之间插入句点(.)来援用:IR.opcode = 1; // 设置IR变量中的opcode域N.f = 0.0; // 将N设置成浮点数的值我们可使用typedef为布局体或结合体的界说指定一个名字。typedefstruct{reg [7:0] opcode;reg [23:0] addr;} instruction; // 定名的布局体instruction IR; // 布局体实例一个布局体可使用值的级联来完全地赋值,例如:instruction = {5,200};布局体可以作为一个整体传递到函数或使命,也能够从函数或使命传递过来,也能够作为模块端口进行传递。9. 数组在Verilog中可以声明一个数组类型,reg和线网类型还可以具有一个向量宽度。在一个对象名前面声明的尺寸暗示向量的宽度,在一个对象名后面声明的尺寸暗示数组的深度。例如:reg [7:0] r1 [1:256]; // 256个8位的变量在SystemVerilog中我们利用分歧的术语暗示数组:利用“紧缩数组(packed array)”这一术语暗示在对象名前声明尺寸的数组;利用“非紧缩数组(unpacked array)”这一术语暗示在对象名后面声明尺寸的数组。紧缩数组可以由下面的数据类型构成:bit、logic、reg、wire和其它的线网类型。不管是紧缩数组仍是非紧缩数组都可以声明成多维的尺寸。bit [7:0] a; // 一个一维的紧缩数组bit b [7:0]; //一个一维的非紧缩数组bit [0:11] [7:0] c; //一个二维的紧缩数组bit [3:0] [7:0] d [1:10]; // 一个包括10个具有4个8位字节的紧缩数组的非紧缩数组非紧缩尺寸在紧缩尺寸之前援用,这就答应将全部紧缩数组作为一个单一的元素进行援用。在上面的例子中,d[1]援用非紧缩数组的一个单一元素,这个元素是一个包括4个字节的数组。10. 在为定名的块中声明Verilog答应变量在一个定名的begin-end或fork-join语句组中声明。相对语句组来讲,这些变量是当地的,但它们可以被条理化地援用。在SystemVerilog中,既可以在定名的块中也能够在未定名的块中声明。在未定名的块中,不克不及够利用条理名来拜候变量。所有的变量类型,包罗用户界说的类型、列举类型、布局体和结合体都可以在begin-end或fork-join语句组中声明。11. 常量在Verilog中有三种特征类型的常量:parameter、specparam和localparam。而在SystemVerilog中,答应利用const要害字声明常量。例如:const charcolon= “:”;12. 可重界说的数据类型SystemVerilog扩大了Verilog的parameter,使其可以包括类型。这个壮大的功能使得一个模块中的数据类型在模块的每个实例中从头界说。例如:module foo;# (parameter typeVAR_TYPE = shortint;)(input logic[7:0] i, output logic [7:0] o);VAR_TYPE j = 0; // 假如不从头界说,j的数据类型为shortint…endmodulemodule bar;logic [3:0] i, o;foo#(.VAR_TYPE(int)) u1 (i, o); // 从头将VAR_TYPE界说成int类型endmodule13. 模块端口毗连在Verilog中,可以毗连到模块端口的数据类型被限制为线网类型和变量类型中的reg、integer和time。而在SystemVerilog中则去除这类限制,任何数据类型都可以经由过程端口授递,包罗实数、数组和布局体。14. 字母值在Verilog中,当指定或赋值字母值的时辰存在一些限制。而SystemVerilog则为字母值若何指定作了下面的加强:l 一个字母值的所有位都可以利用`0、`1、`z或`x作不异的填充。这就答应填充一个肆意宽度的向量,而无需显式地指定向量的宽度,例如:bit [63:0] data;data = `1; //将data的所有位设置成1l 一个字符串可以赋值成一个字符数组,象C说话一样插手一个空竣事符。假如尺寸分歧,它象C中一样进行左调剂,例如:char foo[0:12] = “hello worldn”;l 插手了几个非凡的串字符:v:垂直TABf:换页a:响铃x02:用十六进制数来暗示一个ASCII字符l 数组可使用近似在C初始化的语法赋值成字符值,但它还答应复制操作符。括号的嵌套必需切确地匹配数组的维数(这一点与C分歧),例如:int n[1: 2] [1:3] = {{0, 1, 2}, {3{4}}};15. 强迫类型转换Verilog不克不及将一个值强迫转换成分歧的数据类型。SystemVerilog经由过程利用’操作符供给了数据类型的强迫转换功能。这类强迫转换可以转换成肆意类型,包罗用户界说的类型。例如:int’ (2.0 *3.0) // 将成果转换为int类型mytype’ (foo) // 将foo转换为mytype类型一个值还可以经由过程在强迫转换操作符前指定一个10进制数来转换成分歧的向量宽度,例如:17’(x- 2) // 将成果转换为17位宽度也能够将成果转换成有符号值,例如:signed’(x) // 将x转换为有符号值16. 操作符Verilog没有C说话的递增(++)和递减(--)操作符。而SystemVerilog插手了几个新的操作符:l ++和--:递增和递减操作符;l +=、-=、*=、/=、%=、 =、^=、|=、 =、 =、 =和 =赋值操作符;17. 独一性和优先级决议语句在Verilog中,假如没有遵守严酷的编码气概,它的if-else和case语句会在RTL仿真和RTL综合间具有纷歧致的成果。假如没有准确利用full_case和parallel_case综合指令还会引发一些其它的毛病。SystemVerilog可以或许显式地指明甚么时辰一条决议语句的分支是独一的,或甚么时辰需要计较优先级。我们可以在if或case要害字之前利用unique或requires要害字。这些要害字可以向仿真器、综合编译器、和其它东西唆使我们期望的硬件类型。东西利用这些信息来查抄if或case语句是不是准确建模了期望的逻辑。例如,假如利用unique限制了一个决议语句,那末在不但愿的case值呈现的时辰仿真器就可以够发布一个正告信息。bit [2:0]a;unique if((a==0) || (a==1)) y= in1;else if (a==2) y=in2;else if (a==4) y=in3; // 值3、5、6、7会引发一个正告priorityif (a[2:1]==0) y = in1; // a是0或1else if (a[2]==0) y = in2; // a是2或3else y = in3; // 假如a为其他的值unique case (a)0, 1: y = in1;2: y = in2;4: y = in3;endcase // 值3、5、6、7会引发一个正告prioritycasez(a)2’b00?: y = in1; // a是0或12’b0?? : y = in2; // a是2或3default : y = in3; //假如a为其他的值endcase18. 底部检测的轮回Verilog包括for、while和repeat轮回,这几个轮回都是在轮回的肇端处检测轮回前提。SystemVerilog插手了一个do-while轮回,这类轮回在履行语句的结尾处检测轮回前提。19. 跳转语句在语句的履行进程中,C说话供给了几种体例来跳转到新的语句,包罗:return、break、continue和goto。在Verilog中除经由过程利用disable语句跳转到语句组的尾部外,没有供给任何其它跳转语句。利用disable语句履行中断和继续功能要求插手块的名字,而且会发生不直不雅的代码。SystemVerilog插手了C说话的break和continue要害字,这两个要害字不要求利用块名字。别的,SystemVerilog还插手了一个return要害字,它可以用来在任何履行点上退出一个使命或函数。l break:退出一个轮回,与C说话不异;l continue:跳转到一个轮回的尾部,与C说话不异;l return 表达式:退出一个函数;l return:退出一个使命或void类型的函数。SystemVerilog没有包括C说话中的goto语句。20. 块名字和语句标签在Verilog中,我们可以经由过程在begin或fork要害字以后指命名字来为begin-end或fork-jion语句指命名字。这个指定的名字代表全部语句块。SystemVerilog还答应在end或jion要害字以后指定一个匹配的块名字。这类机制很轻易将end或jion与对应的begin或fork联系起来,特别是在一个长的块或嵌套的块中。块结尾处的名字是可选的,但假如利用的话,它必需与块肇端处的名字不异。例如:begin: foo// 在begin以后的块名字…fork: bar // 具着名字的嵌套的块…jion: bar // 必需具有不异的名字…end: foo // 必需具有不异的名字SystemVerilog还答应像C说话一样为单个语句设置标签。语句标签放置在语句的前面,用来标识这条语句。例如:initialbegintest1: read_enable = 0;…test2: for (i=0; i =255; i++)…end21. 对事务节制的加强Verilog利用@标识表记标帜来节制基在特定事务的履行流,SystemVerilog加强了@事务节制。l 有前提的事务节制@标识表记标帜的一个根基利用就是揣度一个具有使能输入的锁存器。下面的例子演示了一个锁存器建模的根基气概。always @(data or en)if (en)y =data;这类编码气概对仿真来讲是效力低下的,由于即便在使能输入无效的时辰,数据输入的每次改变城市触发事务节制。SystemVerilog在事务节制中插手了一个iff前提。只有iff前提为真的前提下,事务节制才会被触发。经由过程将使能判定移入到事务节制里面,使得只有在锁存器输出可以或许改变的时辰事务节制才会被触发。例如:always @(a or en iff en==1)y l 事务节制中的表达式Verilog答应在@事务节制列表中利用表达式,例如:always @((a * b))always @(memory[address])在第一个例子中,是当操作数产生改变的时辰仍是只有当运算成果产生改变的时辰才会触发事务节制?在第二个例子中,是当memory的地址产生转变的时辰仍是只有当memory的值产生转变的时辰才会触发事务节制?当@事务节制中包括表达式的时辰,IEEE Verilog尺度答应仿真器进行分歧的优化。这便可能致使在分歧的仿真器间有分歧的仿真成果,可能还会致使仿真与综合之间的成果纷歧致。SystemVerilog插手了一个changed要害字,在事务节制列表中它被用作一个润色符。@(changed (表达式))可以或许显式地界说只有当表达式的成果产生改变的时辰才会触发事务节制。例如:always @(changed (a * b))always @(changed memory[address])l 事务节制中的赋值Verilog不答应在事务节制中利用赋值。SystemVerilog答应在事务节制中利用赋值表达式。事务节制仅仅敏感在赋值表达式右边的转变。例如:always @(y = a * b)22. 新的进程Verilog利用always进程来暗示时序逻辑、组合逻辑和锁存逻辑的RTL模子。综合东西和其它软件东西必需按照进程肇端处的事务节制列表和进程内的语句来揣度always进程的意图。这类揣度会致使仿真成果和综合成果之间的纷歧致。SystemVerilog增添了三个新的进程来显式地唆使逻辑的意图。l always_ff:暗示时序逻辑的进程;l always_comb:暗示组合逻辑的进程;l always_latch:暗示锁存逻辑的进程。例如:always_comb@(aor b or sel) beginif (sel) y = a;else y = b;end软件东西可以或许查抄事务节制敏感列表和进程的内容来包管逻辑的功能匹配进程的类型。例如,东西可以或许查抄一个always_comb进程可以或许敏感进程内读取的所有外部值,对逻辑的每个分支的不异变量进行赋值,而且查抄分支是不是笼盖了所有可能的前提。假如任何一个前提没有知足,软件东西均会陈述该进程没有准确建模组合逻辑。23. 动态进程Verilog经由过程利用fork-jion供给了一种静态的并发进程。每个分支都是一个分手的、并行的进程。fork-jion中任何语句的履行必需在组内的每个进程完成后才会履行。例如:initialbeginforksend_packet_task (1,255, 0);send_packet_task (7,128, 5);watch_result_task (1,255, 0);watch_result_task (7,128, 5);jion // 所有的使命必需完成后才会达到这里endSystemVerilog经由过程process要害字插手了一个新的、动态的进程。它为一个进程发生分支,然后继续履行而无需期待其他进程完成。进程不会梗阻进程或使命内的语句履行。这类体例可以或许建模多线程的进程。例如:initialbeginprocess send_packet_task (1,255, 0);processsend_packet_task(7, 128, 5);processwatch_result_task(1, 255, 0);processwatch_result_task(7, 128, 5);end //所有的进程并交运行24. 使命和函数加强SystemVerilog为Verilog的使命和函数作了几个加强。l 静态和主动的存储缺省环境下,在Verilog使命或函数内的所有存储都是静态的。Verilog-2001答应将使命和函数声明成主动的。在SystemVerilog中:(1). 在一个静态使命和函数内的特定命据可以显式地声明成主动的。声明成主动的数据在块中具有完全的生命周期,而且在使命和函数挪用的进口处初始化;(2). 在一个主动的使命或函数中的特定命据可以显式地声明成静态的。主动的使命或函数中声明成静态的数据在一个块的当地规模内具有静态的生命周期。l 从任何点返回Verilog在一个使命或函数中履行到endtask或endfunction要害字的时辰返回。函数的返回值是给函数名赋的最后一个值。SystemVerilog插手了一个return要害字,利用这个要害字,一个使命或函数可以在任何点上返回。l 多语句Verilog要求一个使命或函数只具有一个语句或语句块。多条语句必需组合到一个单一的begin-end或fork-jion块中。SystemVerilog去除这类限制。是以,多条语句可以在一个使命或函数中列出而无需利用的begin-end或fork-jion。每有分组的语句就像在begin-end中一样挨次履行。我们还可以发生一个没有语句的使命或函数界说。l void函数Verilog要求一个函数具有一个返回值,函数的挪用领受这个返回值。SystemVerilog插手了一个void数据类型,这个数据类型可以作为一个函数的返回值类型。void函数可以像Verilog使命一样进行挪用,而无需领受一个返回值。void函数和使命的不同在在函数存在几个限制,例如没有时候节制等。l 函数的输入和输出Verilog尺度要求一个函数最少具有一个输入而且函数只能具有输入。SystemVerilog去除这些限制。函数可以具有肆意数量的输入、输出和输入输出,也能够甚么也没有。25. 持续赋值的加强在Verilog中,持续赋值语句的左边只能是线网类型,例如wire。持续赋值语句被认为是线网的驱动源,而线网可以具有肆意数据的驱动源。SystemVerilog答应除reg类型之外的任何数据类型用在持续赋值语句的左边。与线网分歧,所有其它数据类型被限制为只能有一个持续赋值语句驱动。为不异的变量夹杂利用持续赋值语句和进程赋值语句是不被答应的。26. 美金bit系统函数在Verilog中没有近似在C说话中sizeof的函数。SystemVerilog插手一个新的美金bit内建函数。这个函数返回保留一个值所需的硬件位的数量(一个四态值要求一个硬件位),这个函数还可以用来肯定一个布局体所代表的硬件位的数量。27. `define的加强SystemVerilog加强了`define编译器指令的能力以便撑持将字符串作为宏的参数。宏的文本字符串中可以包括一个隔离的引号,它的前面必需具有一个反勾号(`”),这就答应字符串中包括宏参数。宏文本可以在行的尾部包括一个反斜杠(’’)来暗示鄙人一行继续。假如宏文本字符串中包括反斜杠,则反斜杠应当被放在两个反勾号之间,如许它就不会被认为是Verilog转义标识符的最先。宏文本字符串还可以包括双反勾号(``),它答应标识符可以或许从参数中构建。这些加强使得`define指令加倍矫捷。例如:`include指令后可以紧跟一个宏名字来替换一个字符串。`define f1“../project_top/opcode_defines”`include `f128. 状况机建模SystemVerilog答应在更高的抽象条理上对状况机建模。这些布局包罗:l 列举类型l 一个非凡的state数据类型;l 一个迁徙语句l 一个迁徙操作符29. 断言SystemVerilog中插手了断言的功能来改良系统的验证进程。30. 结论SystemVerilog为Verilog-2001尺度供给了一系列的扩大。这些扩大使得年夜型设计的建模和验证加倍轻易。

欲知详情,请下载word文档 下载文档

上一篇:爱游戏-英特尔新补丁修复五大问题,精细化超频释放酷睿Ultra 200S性能潜力 下一篇:爱游戏-华为云入选Gartner®云数据库挑战者象限