SystemVerilog 语言简介 ( 一 ) SystemVerilog 语言简介 ( 一 ) SystemVerilog 语言简介 ( 一 ) 1. 接口 (Interface) Verilog 模块之间的连接是通过模块端口进行的 为了给组成设计的各个模块定义端口, 我对期望的硬件设计有一个详细的认识 不幸的是, 在设计的早期, 我们很难把握设计的细节 而且, 一旦模块的端口定义完成后, 我们也很难改变端口的配置 另外, 一个设计中的许多模块往往具有相同的端口定义, 在 Verilog 中, 我们必须在每个模块中进行相同的定义, 这为我们无谓的工作量 SystemVerilog 提供了一个新的 高层抽象的模块连接, 这个连接被称为接口 (In 关键字 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);... file:///g /SystemVerilog/SystemVerilog 语言简介 ( 一 ).htm (1 of 5)2008-7-4
SystemVerilog 语言简介 ( 一 ) endmodule module top; reg clk = 0; chip_bus a; // 实例接口 // 将接口连接到模块实例 RAM mem(a, clk); CPU cpu(a, clk); endmodule 实际上,SystemVerilog 的接口不仅仅可以表示信号的绑定和互连 由于 Syste 包含参数 常量 变量 结构 函数 任务 initial 块 always 块以及连续赋值语 SystemVerilog 的接口还可以包含内建的协议检查以及被使用该接口的模块所共用的 2. 全局声明和语句 在 Verilog 中, 除了一个模块可以作为模块实例引用其他模块外, 并不存在一个全局空间 Verilog 允许任意数目的顶层模块, 因此会产生毫无关联的层次树 SystemVeriog 增加了一个被称为 $root 的隐含的顶级层次 任何在模块边界之外的声明在于 $root 空间中 所有的模块, 无论它处于哪一个设计层次, 都可以引用 $root 中声明的名字 这样, 如果某些变量 函数或其它信息被设计中的所有模块共享, 那么我们就可以将它们作为全局声明和语句 全局声明和语句的一个使用实例如下 : reg error _flag; // 全局变量 function compare (...); // 全局函数 always @(error_flag) // 全局语句... module test; chip1 u1 (...) file:///g /SystemVerilog/SystemVerilog 语言简介 ( 一 ).htm (2 of 5)2008-7-4
SystemVerilog 语言简介 ( 一 ) endmodule module chip1 (...); FSM u2 (...); always @(data) error_flag = compare(data, expected); endmodule module FSM (...);... always @(state) error_flag = compare(state, expected); endmodule 3. 时间单位和精度 在 Verilog 中, 表示时间的值使用一个数来表示, 而不带有任何时间单位 例如 : forever #5 clock = ~clock; 从这一句中我们无法判断 5 代表的是 5ns? 5ps? 还是其他 Verilog 的时间单位块的属性, 并使用编译器指令 `timescale 来设置 使用这种方法具有固有的缺陷, 因为编译器指令的执行依赖于源代码的编译顺序, 编译器总是将它遇到的最后一个 `timescale 设置的时间单位和精度作为之后的标准 那么, 假如有些模块之前没有使用 `timescale 设置时间单位和精度, 这就有可能出现同一个源代码的不同仿真会出现不同结果的情况 SystemVerilog 为了控制时间单位加入了两个重要的增强 首先, 时间值可以显式地位 时间单位可以是 s ms ns ps 或 fs 时间单位作为时间值的后缀出现 例如: forever #5ns clock = ~clock; 其次,SystemVerilog 允许使用新的关键字 (timeunits 和 timeprecision) 来指定时间单这些声明可以在任何模块中指定, 同时也可以在 $root 空间中全局指定 时间单位和精度必须是 10 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 一 ).htm (3 of 5)2008-7-4
SystemVerilog 语言简介 ( 一 ) 的幂, 范围可以从 s 到 fs 例如 : timeunits 1ns; timeprecision 10ps; 4. 抽象数据类型 Verilog 提供了面向底层硬件的线网 寄存器和变量数据类型 这些类型代表了 4 态逻辑值用来在底层上对硬件进行建模和验证 线网数据类型还具有多个强度级别, 并且能够为多驱动源的线网提供解析功能 SystemVerilog 包括了 C 语言的 char 和 int 数据类型, 它允许在 Verilog 模型和 C++ 代码 Verilog PLI 不再需要集成总线功能模型 算法模型和 C 函数 Syst 加入了几个新的数据类型, 以便能够在更抽象的层次上建模硬件 char: 一个两态的有符号变量, 它与 C 语言中的 char 数据类型相同, 可以是一个 8 位整数 (ASCII) 或 short int(unicode); int: 一个两态的有符号变量, 它与 C 语言中的 int 数据类型相似, 但被精确地定义成 32 位 ; shortint: 一个两态的有符号变量, 被精确地定义成 16 位 ; longint: 一个两态的有符号变量, 它与 C 语言中的 long 数据类型相似, 但被精确地定义成 64 位 ; byte: 一个两态的有符号变量, 被精确地定义成 8 位 ; bit: 一个两态的可以具有任意向量宽度的无符号数据类型, 可以用来替代 Verilog 数据类型 ; logic: 一个四态的可以具有任意向量宽度的无符号数据类型, 可以用来替代 Verilo 线网或 reg 数据类型, 但具有某些限制 ; shortreal: 一个两态的单精度浮点变量, 与 C 语言的 float 类型相同 ; void: 表示没有值, 可以定义成一个函数的返回值, 与 C 语言中的含义相同 SystemVerilog 的 bit 和其他数据类型允许用户使用两态逻辑对设计建模, 这种方法对效率 由于 Verilog 语言没有两态数据类型, 因此许多仿真器都通过将这种功能作为仿真器选项提供 这些选项不能够在所有的仿真器之间移植, 而且在需要时用三态或四态逻辑的设计中 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 一 ).htm (4 of 5)2008-7-4
SystemVerilog 语言简介 ( 一 ) 强制使用两态逻辑还具有副作用 SystemVerilog 的 bit 数据类型能够极大改进仿真器在需要的时候仍然可以使用三态或四态逻辑 通过使用具有确定行为的数据类型来代替专有的仿真器选项, 两态模型能够在所有的 SystemVerilog 仿真器间移植 SystemVerilog 的 logic 数据类型比 Verilog 的线网和寄存器数据类型更加灵活次上建模硬件都更加容易 logic 类型能够以下面的任何一种方法赋值 : 通过任意数目的过程赋值语句赋值, 能够替代 Verilog 的 reg 类型 ; 通过单一的连续赋值语句赋值, 能够有限制地替代 Verilog 的 wire 类型 ; 连接到一个单一原语的输出, 能够有限制地替代 Verilog 的 wire 类型 ; 由于 logic 数据类型能够被用来替代 Verilog 的 reg 或 wire( 具有限制 ), 这就使得能够在一个抽象层次上建模, 并且随着设计的不断深入能够加入一些设计细节而不必改变数据类型的声明 logic 数据类型不会表示信号的强度也不具有线逻辑的解析功能, 因此 logic 数据类型比 Verilo wire 类型更能有效地仿真和综合 5. 有符号和无符号限定符 缺省情况下,Verilog net 和 reg 数据类型是无符号类型,integer 类型是一 2001 标准允许使用 signed 关键字将无符号类型显式地声明成有符号类型 System 的能力, 它可以通过 unsigned 关键字将有符号数据类型显式地声明成有无符号数据类型 int unsigned j; 值得注意的是 unsigned 在 Verilog 中是一个保留字, 但并没有被 Verilog 标 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 一 ).htm (5 of 5)2008-7-4
SystemVerilog 语言简介 ( 二 ) 6. 用户定义的类型 SystemVerilog 语言简介 ( 二 ) Verilog 不允许用户定义新的数据类型 SystemVerilog 通过使用 typed 数据类型, 这一点与 C 语言类似 用户定义的类型可以与其它数据类型一样地使用在声明当中 例如 : typedef unsigned 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 为枚举类型指定一个名字, 从而允许这个枚举类型可以在许多地方使用 例如 : typedef enum {FALSE=1'b0, TRUE} boolean; boolean ready; file:///g /SystemVerilog/SystemVerilog 语言简介 ( 二 ).htm (1 of 5)2008-7-4
SystemVerilog 语言简介 ( 二 ) boolean 8. 结构体和联合体 test_complete; 在 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 为结构体或联合体的定义指定一个名字 typedef struct { reg [7:0] opcode; reg [23:0] addr; } instruction; // 命名的结构体 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 二 ).htm (2 of 5)2008-7-4
SystemVerilog 语言简介 ( 二 ) instruction IR; // 结构体实例 一个结构体可以使用值的级联来完整地赋值, 例如 : instruction = {5, 200}; 结构体可以作为一个整体传递到函数或任务, 也可以从函数或任务传递过来, 也可以作为模块端口进行传递 9. 数组 在 Verilog 中可以声明一个数组类型,reg 和线网类型还可以具有一个向量宽度 在个对象名前面声明的尺寸表示向量的宽度, 在一个对象名后面声明的尺寸表示数组的深度 例如 : reg [7:0] r1 [1:256]; // 256 个 8 位的变量 在 SystemVerilog 中我们使用不同的术语表示数组 : 使用 压缩数组 (pack array) 这一术语表示在对象名前声明尺寸的数组 ; 使用 非压缩数组 (unpack 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 中, 既在命名的块中也可以在未命名的块中声明 在未命名的块中, 不能够使用层次名来 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 二 ).htm (3 of 5)2008-7-4
SystemVerilog 语言简介 ( 二 ) 访问变量 所有的变量类型, 包括用户定义的类型 枚举类型 结构体和联合体都可以在 begin-end 或 fork-join 语句组中声明 11. 常量 在 Verilog 中有三种特性类型的常量 :parameter specparam 和 localparam 而在 SystemVerilog 中, 允许使用 const 关键字声明常量 例如 : const char colon = : ; 12. 可重定义的数据类型 SystemVerilog 扩展了 Verilog 的 parameter, 使其可以包含类个模块中的数据类型在模块的每一个实例中重新定义 例如 : module foo; # (parameter type VAR_TYPE = shortint;) (input logic [7:0] i, output logic [7:0] VAR_TYPE j = 0; // 如果不重新定义,j 的数据类型为 shortint endmodule module bar; logic [3:0] i, o; foo #(.VAR_TYPE(int)) u1 (i, o); // 重新将 VAR_TYPE 定义成 int 类型 endmodule 13. 模块端口连接 在 Verilog 中, 可以连接到模块端口的数据类型被限制为线网类型以及变量类型中的 reg integer 和 time 而在 SystemVerilog 中则去除了这种限制, 任何数据类型通过端口传递, 包括实数 数组和结构体 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 二 ).htm (4 of 5)2008-7-4
SystemVerilog 语言简介 ( 二 ) 14. 字母值 在 Verilog 中, 当指定或赋值字母值的时候存在一些限制 而 SystemVeril 如何指定作了下面的增强 : 一个字母值的所有位均可以使用 `0 `1 `z 或 `x 作相同的填充 这就允许充一个任意宽度的向量, 而无需显式地指定向量的宽度, 例如 : bit [63:0] data; data = `1; // 将 data 的所有位设置成 1 一个字符串可以赋值成一个字符数组, 象 C 语言一样加入一个空结束符 如果尺寸不同, 它象 C 中一样进行左调整, 例如 : char foo [0:12] = hello worldn ; v: 垂直 TAB f: 换页 a: 响铃 加入了几个特殊的串字符 : x02: 用十六进制数来表示一个 ASCII 字符 数组可以使用类似于 C 初始化的语法赋值成字符值, 但它还允许复制操作符 括号的嵌套必须精确地匹配数组的维数 ( 这一点与 C 不同 ), 例如 : int n [1: 2] [1:3] = {{0, 1, 2}, {3{4}}}; file:///g /SystemVerilog/SystemVerilog 语言简介 ( 二 ).htm (5 of 5)2008-7-4
SystemVerilog 语言简介 ( 三 ) 15. 强制类型转换 SystemVerilog 语言简介 ( 三 ) Verilog 不能将一个值强制转换成不同的数据类型 SystemVerilog 通过使用的强制转换功能 这种强制转换可以转换成任意类型, 包括用户定义的类型 例如 : int' (2.0 * 3.0) // 将结果转换为 int 类型 mytype' (foo) // 将 foo 转换为 mytype 类型 一个值还可以通过在强制转换操作符前指定一个 10 进制数来转换成不同的向量宽度, 例如 : 17' (x - 2) // 将结果转换为 17 位宽度也可以将结果转换成有符号值, 例如 : signed' (x) // 将 x 转换为有符号值 16. 操作符 Verilog 没有 C 语言的递增 (++) 和递减 (--) 操作符 而 SystemVerilo ++ 和 --: 递增和递减操作符 ; += -= *= /= %= &= ^= = <<= >>= <<<= 和 >>> 17. 唯一性和优先级决定语句 在 Verilog 中, 如果没有遵循严格的编码风格, 它的 if-else 和 case 语句会在 RTL 仿真和 RT 有不一致的结果 如果没有正确使用 full_case 和 parallel_case 综合指令还会引起一些其它的错误 SystemVerilog 能够显式地指明什么时候一条决定语句的分支是唯一的, 或者什么时先级 我们可以在 if 或 case 关键字之前使用 unique 或 requires 关键字 这些关键字可以向仿真综合编译器 以及其它工具指示我们期望的硬件类型 工具使用这些信息来检查 if 或 case 语句是否正确建模了期望的逻辑 例如, 如果使用 unique 限定了一个决定语句, 那么在不希望的 case 值出现的时候仿真器就能够发布一个警告信息 bit [2:0] a; file:///g /SystemVerilog/SystemVerilog 语言简介 ( 三 ).htm (1 of 6)2008-7-4
SystemVerilog 语言简介 ( 三 ) unique if ((a==0) (a==1)) y = in1; else if (a==2) y = in2; else if (a==4) y = in3; // 值 3 5 6 7 会引起一个警告 priority if (a[2:1]==0) y = in1; // a 是 0 或 1 else if (a[2]==0) y = in2; // a 是 2 或 3 else y = in3; // 如果 a 为其他的值 unique case (a) 0, 1: y = in1; 2: y = in2; 4: y = in3; endcase // 值 3 5 6 7 会引起一个警告 priority casez (a) 2'b00? : y = in1; // a 是 0 或 1 2'b0?? : y = in2; // a 是 2 或 3 default : y = in3; // 如果 a 为其他的值 endcase 18. 底部检测的循环 Verilog 包含 for while 和 repeat 循环, 这几个循环都是在循环的起始处检测循环条件 SystemVerilog 加入了一个 do-while 循环, 这种循环在执行语句的结尾处检测循环条件 19. 跳转语句 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 三 ).htm (2 of 6)2008-7-4
SystemVerilog 语言简介 ( 三 ) 在语句的执行过程中,C 语言提供了几种方式来跳转到新的语句, 包括 :return break continue 和 goto 在 Verilog 中除了通过使用 disable 语句跳转到语句组的尾部外, 没有提供任它跳转语句 使用 disable 语句执行中止和继续功能要求加入块的名字, 并且会产生不直观的代码 SystemVerilog 加入了 C 语言的 break 和 continue 关键字, 这两个关键字不要求使外,SystemVerilog 还加入了一个 return 关键字, 它可以用来在任何执行点上退出一个 break: 退出一个循环, 与 C 语言相同 ; continue: 跳转到一个循环的尾部, 与 C 语言相同 ; return 表达式 : 退出一个函数 ; 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 语言一样为单个语句设置标签 语句标签放置在语句的前这条语句 例如 : file:///g /SystemVerilog/SystemVerilog 语言简介 ( 三 ).htm (3 of 6)2008-7-4
SystemVerilog 语言简介 ( 三 ) initial test1: read_enable = 0; begin test2: for (i=0; i<=255; i++) end 21. 对事件控制的增强 Verilog 使用 @ 标记来控制基于特定事件的执行流,SystemVerilog 增强了 @ 有条件的事件控制 @ 标记的一个基本应用就是推断一个具有使能输入的锁存器 下面的例子演示了一个锁存器建模的基本风格 always @(data or en) if (en) y <= data; 这种编码风格对仿真来说是效率低下的, 因为即使在使能输入无效的时候, 数据输入的每次改变都会触发事件控制 SystemVerilog 在事件控制中加入了一个 iff 条件 只有 iff 条件为真的条件下通过将使能判断移入到事件控制里面, 使得只有在锁存器输出能够改变的时候事件控制才会被触发 例如 : always @(a or en iff en==1) y <= a; 事件控制中的表达式 Verilog 允许在 @ 事件控制列表中使用表达式, 例如 : file:///g /SystemVerilog/SystemVerilog 语言简介 ( 三 ).htm (4 of 6)2008-7-4
SystemVerilog 语言简介 ( 三 ) always @((a * b)) always @(memory[address]) 在第一个例子中, 是当操作数发生改变的时候还是只有当运算结果发生改变的时候才会触发事件控制? 在第二个例子中, 是当 memory 的地址发生变化的时候还是只有当 memory 的值发时候才会触发事件控制? 当 @ 事件控制中包含表达式的时候,IEEE Verilog 标准允许同的优化 这就可能导致在不同的仿真器间有不同的仿真结果, 可能还会导致仿真与综合之间的结果不一致 SystemVerilog 加入了一个 changed 关键字, 在事件控制列表中它被用作符 @(changed ( 表达式 )) 能够显式地定义只有当表达式的结果发生改变的时候才会制 例如 : always @(changed (a * b)) always @(changed memory[address]) 事件控制中的赋值 Verilog 不允许在事件控制中使用赋值 SystemVerilog 允许在事件控制中使制仅仅敏感于赋值表达式右侧的变化 例如 : always @(y = a * b) 22. 新的过程 Verilog 使用 always 过程来表示时序逻辑 组合逻辑和锁存逻辑的 RTL 模型 综合工具和工具必须根据过程起始处的事件控制列表以及过程内的语句来推断 always 过程的意图 这种推断会导致仿真结果和综合结果之间的不一致 SystemVerilog 增加了三个新的过程来显的意图 例如 : always_ff: 表示时序逻辑的过程 ; always_comb: 表示组合逻辑的过程 ; always_latch: 表示锁存逻辑的过程 always_comb @(a or b or sel) begin file:///g /SystemVerilog/SystemVerilog 语言简介 ( 三 ).htm (5 of 6)2008-7-4
SystemVerilog 语言简介 ( 三 ) if (sel) y = a; else y = b; end 软件工具能够检查事件控制敏感列表和过程的内容来保证逻辑的功能匹配过程的类型 例如, 工具能够检查一个 always_comb 过程能够敏感过程内读取的所有外部值, 对逻辑的每一个变量进行赋值, 并且检查分支是否覆盖了所有可能的条件 如果任何一个条件没有满足, 软件工具均会报告该过程没有正确建模组合逻辑 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 三 ).htm (6 of 6)2008-7-4
SystemVerilog 语言简介 ( 四 ) 23. 动态过程 SystemVerilog 语言简介 ( 四 ) Verilog 通过使用 fork-jion 提供了一种静态的并发过程 每一个分支都是一个分离的 并行的程 fork-jion 中任何语句的执行必须在组内的每一个过程完成后才会执行 例如 : initial begin fork send_packet_task (1, 255, 0); send_packet_task (7, 128, 5); watch_result_task (1, 255, 0); watch_result_task (7, 128, 5); jion // 所有的任务必须完成后才会到达这里 end SystemVerilog 通过 process 关键字加入了一个新的 动态的过程 它为一个过续执行而无需等待其他过程完成 过程不会阻塞过程或任务内的语句执行 这种方式能够建模多线程的过程 例如 : initial begin process send_packet_task (1, 255, 0); process send_packet_task (7, 128, 5); process watch_result_task (1, 255, 0); process watch_result_task (7, 128, 5); end // 所有的过程并行运行 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 四 ).htm (1 of 4)2008-7-4
SystemVerilog 语言简介 ( 四 ) 24. 任务和函数增强 SystemVerilog 为 Verilog 的任务和函数作了几个增强 静态和自动的存储 缺省情况下, 在 Verilog 任务或函数内的所有存储都是静态的 Verilog-2001 成自动的 在 SystemVerilog 中 :(1). 在一个静态任务和函数内的特定数据可的 声明成自动的数据在块中具有完整的生命周期, 并且在任务和函数调用的入口处初始化 ; (2). 在一个自动的任务或函数中的特定数据可以显式地声明成静态的 自动的任务或函数中成静态的数据在一个块的本地范围内具有静态的生命周期 从任何点返回 Verilog 在一个任务或函数中执行到 endtask 或 endfunction 关键字的时候返回 函数的返回值函数名赋的最后一个值 SystemVerilog 加入了一个 return 关键字, 使用这个关键字, 数可以在任何点上返回 多语句 Verilog 要求一个任务或函数只具有一个语句或语句块 多条语句必须组合到一个单一的 be end 或 fork-jion 块中 SystemVerilog 去除了这种限制 因此, 多条语句可以在一个任出而无需使用的 begin-end 或 fork-jion 每有分组的语句就像在 begin-end 中一样顺序执行 我们还可以产生一个没有语句的任务或函数定义 void 函数 Verilog 要求一个函数具有一个返回值, 函数的调用接收这个返回值 SystemVer 数据类型, 这个数据类型可以作为一个函数的返回值类型 void 函数可以像 Verilog 任调用, 而无需接收一个返回值 void 函数和任务的差别在于函数存在几个限制, 例如没有时间制等 函数的输入和输出 Verilog 标准要求一个函数至少具有一个输入并且函数只能具有输入 SystemVer 制 函数可以具有任意数目的输入 输出以及输入输出, 也可以什么也没有 25. 连续赋值的增强 在 Verilog 中, 连续赋值语句的左侧只能是线网类型, 例如 wire 连续赋值语句被认为是线网动源, 而线网可以拥有任意数据的驱动源 SystemVerilog 允许除 reg 类型以外的任何 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 四 ).htm (2 of 4)2008-7-4
SystemVerilog 语言简介 ( 四 ) 连续赋值语句的左侧 与线网不同, 所有其它数据类型被限制为只能有一个连续赋值语句驱动 为相同的变量混合使用连续赋值语句和过程赋值语句是不被允许的 26. $bit 系统函数 在 Verilog 中没有类似于 C 语言中 sizeof 的函数 SystemVerilog 加入一个新的数返回保存一个值所需的硬件位的数目 ( 一个四态值要求一个硬件位 ), 这个函数还可以用来确定一个结构体所代表的硬件位的数目 27. `define 的增强 SystemVerilog 增强了 `define 编译器指令的能力以便支持将字符串作为宏的参数 宏中可以包含一个隔离的引号, 它的前面必须具有一个反勾号 (` ), 这就允许字符串中包含宏参数 宏文本可以在行的尾部包含一个反斜杠 ('') 来表示在下一行继续 如果宏文本字符串中包含反斜杠, 则反斜杠应该被放在两个反勾号之间, 这样它就不会被认为是 Verilog 转义标识符始 宏文本字符串还可以包含双反勾号 (``), 它允许标识符能够从参数中构建 这些增强使得 `define 指令更加灵活 例如 :`include 指令后可以紧跟一个宏名字来替代一个字符串 `define f1../project_top/opcode_defines `include `f1 28. 状态机建模 SystemVerilog 允许在更高的抽象层次上对状态机建模 这些结构包括 : 枚举类型 一个特殊的 state 数据类型 ; 一个迁移语句 一个迁移操作符 29. 断言 SystemVerilog 中加入了断言的功能来改善系统的验证过程 30. 结论 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 四 ).htm (3 of 4)2008-7-4
SystemVerilog 语言简介 ( 四 ) SystemVerilog 为 Verilog-2001 标准提供了一系列的扩展 这些扩展使容易 file:///g /SystemVerilog/SystemVerilog 语言简介 ( 四 ).htm (4 of 4)2008-7-4