SystemVerilog语言简介(二)

简介: <p align="left">6. 用户定义的类型</p> <p align="left">  </p> <p align="left">Verilog不允许用户定义新的数据类型。SystemVerilog通过使用typedef提供了一种方法来定义新的数据类型,这一点与C语言类似。用户定义的类型可以与其它数据类型一样地使用在声明当中。例如:</p> <blockquote> <d

6. 用户定义的类型

 

Verilog不允许用户定义新的数据类型。SystemVerilog通过使用typedef提供了一种方法来定义新的数据类型,这一点与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;

 

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扩展了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中,可以连接到模块端口的数据类型被限制为线网类型以及变量类型中的regintegertime。而在SystemVerilog中则去除了这种限制,任何数据类型都可以通过端口传递,包括实数、数组和结构体。

14. 字母值

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

l         一个字母值的所有位均可以使用`0、`1、`z或`x作相同的填充。这就允许填充一个任意宽度的向量,而无需显式地指定向量的宽度,例如:

bit [63:0] data;

 

data = `1; //data的所有位设置成1

 

l         一个字符串可以赋值成一个字符数组,象C语言一样加入一个空结束符。如果尺寸不同,它象C阅读全文(112)  

相关文章
|
C语言
C语言入门篇(四)上
C语言入门篇(四)上
|
C语言
C语言入门篇(三)上
C语言入门篇(三)上
|
存储
第三章:C51 编程语言
第三章:C51 编程语言
62 0
|
4月前
|
存储 Rust 编译器
【Rust学习】03_通用编程概念
您成功了!这是一个相当大的章节:您了解了变量、标量和复合数据类型、函数、注释、 if 表达式和循环!若要练习本章中讨论的概念。
46 2
|
C语言
C语言入门篇(三)下
C语言入门篇(三)下
|
6月前
|
Java 程序员 C#
C++ 编程入门指南:深入了解 C++ 语言及其应用领域
C++是一种由Bjarne Stroustrup开发的跨平台编程语言,以C语言为基础并添加了面向对象特性。它用于创建高性能应用,支持类和对象,提供高级系统资源控制。C++经历了多次更新,包括C++11、C++14、C++17和C++20。因其可移植性和代码重用,成为流行选择。学习C++简单有趣,与C、C#、Java有共通性。开始C++编程,可以从打印&quot;Hello World!&quot;的简单程序入手。关注微信公众号`Let us Coding`获取更多内容。
114 0
|
C语言
C语言入门篇(四)下
C语言入门篇(四)下
|
算法 程序员 C语言
01-C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
01-C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
|
JavaScript 前端开发 Unix
1.C 语言简介
1.C 语言简介
165 0
|
Rust 安全 JavaScript
Rust通用编程概念
Rust通用编程概念
下一篇
无影云桌面