liuiang的个人空间 https://blog.eetop.cn/liuiang [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

SystemVerilog语言简介(三)

热度 1已有 4365 次阅读| 2006-7-26 13:24

天气: 阴雨
心情: 高兴

http://www.pld.com.cn/HDL/systemverilog/2.htm

 

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;

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]; // 2568位的变量

 

SystemVerilog中我们使用不同的术语表示数组:使用“压缩数组(packed array)”这一术语表示在对象名前声明尺寸的数组;使用“非压缩数组(unpacked array)”这一术语表示在对象名后面声明尺寸的数组。压缩数组可以由下面的数据类型组成:bitlogicregwire以及其它的线网类型。无论是压缩数组还是非压缩数组都可以声明成多维的尺寸。

 

bit [7:0] a; // 一个一维的压缩数组

 

bit b [7:0]; //一个一维的非压缩数组

 

bit [0:11] [7:0] c; //一个二维的压缩数组

 

bit [3:0] [7:0] d [1:10]; // 一个包含10个具有48位字节的压缩数组的非压缩数组

 

非压缩尺寸在压缩尺寸之前引用,这就允许将整个压缩数组作为一个单一的元素进行引用。在上面的例子中,d[1]引用非压缩数组的一个单一元素,这个元素是一个包含4个字节的数组。

 

10. 在为命名的块中声明

Verilog允许变量在一个命名的begin-endfork-join语句组中声明。相对于语句组来说,这些变量是本地的,但它们可以被层次化地引用。在SystemVerilog中,既可以在命名的块中也可以在未命名的块中声明。在未命名的块中,不能够使用层次名来访问变量。所有的变量类型,包括用户定义的类型、枚举类型、结构体和联合体都可以在begin-endfork-join语句组中声明。

 

11. 常量

Verilog中有三种特性类型的常量:parameterspecparamlocalparam。而在SystemVerilog中,允许使用const关键字声明常量。例如:

 

const char colon = “:”;

 

12. 可重定义的数据类型

SystemVerilog扩展了Verilogparameter,使其可以包含类型。这个强大的功能使得一个模块中的数据类型在模块的每一个实例中重新定义。例如:

 

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

 

 

 

1

点赞

刚表态过的朋友 (1 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 1

    好友
  • 3

    获赞
  • 9

    评论
  • 1911

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-7 23:19 , Processed in 0.015678 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部