您当前的位置:五五电子网电子知识单片机-工控设备综合-其它SystemVerilog语言简介(上) 正文
SystemVerilog语言简介(上)

SystemVerilog语言简介(上)

点击数:7797 次   录入时间:03-04 11:37:43   整理:http://www.55dianzi.com   综合-其它

  enum {red, yellow, green} RGB;
enum {WAIT=2’b01, LOAD, DONE} states;

  我们还可以使用typedef为枚举类型指定一个名字,从而允许这个枚举类型可以在许多地方使用。例如:

typedef enum {FALSE=1’b0, TRUE} boolean;
boolean ready;
boolean test_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为结构体或联合体的定义指定一个名字。

typedef struct {
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语句组中声明。

www.55dianzi.com

   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] o);
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中则去除了这种限制,任何数据类型都可以通过端口传递,包括实数、数组和结构体。

  14. 字母值

  在Verilog中,当指定或赋值字母值的时候存在一些限制。而SystemVerilog则为字母值如何指定作了下面的增强:

  一个字母值的所有位均可以使用`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}}};



上一页  [1] [2] 


本文关键字:暂无联系方式综合-其它单片机-工控设备 - 综合-其它