转载请标明出处

用户自定义和枚举数据类型

1. 用户自定义类型(typedef)

局部typedef定义:只用于设计的特定部分时,typedef的定义可在module或interface中

共享typedef定义:当在多个模型中使用时,typedef的定义可在包中进行,             module,interface,program block可以通过导入包子项来使用typedef定义

Eg:

package chip_types;

`ifdef TWO_STATE

typedef bit dtype_t;  //当宏定义TWO_STATE时定义dtype_t为bit类型

`else

typedef logic dtype_t;

`endif

Endpackage

import chip_types::dtype_t; // import 定义 into $unit

module counter

(output dtype_t [15:0] count,

Input dtype_t clock, resetN);

...

Endmodule

2. 枚举数据类型(enum)

想给数值一个label时,Verilog和SV会采取不同的方法:

Verilog:

用parameter/`define来定义一组常数或者宏名。

Eg:`define FETCH 3'h7 //宏定义

module controller (output reg read...);

parameter LOAD = 0;      //常数定义

always @(State) begin

if (State == LOAD && instruction == `FETCH)    //使用label

...

Endmodule

SV:

使用枚举enum

Eg:  package chip_types;

typedef enum {FETCH, WRITE, ADD, SUB,MULT, DIV, SHIFT, NOP }instr_t;

//用户自定义枚举类型instr_t

Endpackage

import chip_types::*; //import包定义到$unit编译单元域

module controller (input instr_t instruction,...);       //input instr_t类型instruction

enum {WAITE, LOAD, STORE} State, NextState;    //枚举类型State, NextState,

//他俩的值只能是{}中的label

always_comb begin

if (State == LOAD && instruction == FETCH)  //使用label

...

Endmodule

从包中导入enum时,只导入定义名时不会自动导入枚举值标签。所以一般用*导入整个包或者显示导入每个标签。

.2.1. 枚举类型标签序列

state

创建单个标签state

state[N]

创建标签序列 state0,state1, ... stateN-1

state[N:M]

创建标签序列,由stateN开始,到stateM(正反向不存在)

2.2. 枚举类型标签作用域

enum列表中的label在其作用域内必须是唯一的(label唯一)

这里的作用域包括:$unit, modules, interfaces, programs,

begin...end blocks, fork...join blocks, tasks and functions

.2.3. 枚举类型值

枚举类型值在没有显示指定时,默认int从0自加。且label的值也要唯一(value唯一)

Eg:  enum {A=1, B, C, X=24, Y, Z} list;             //A=1,B=2,C=3,X=24,Y=25,Z=26

.2.4. 枚举类型的基类

枚举类型的默认基类(base type)是int,也可以对枚举类型的基类进行显示声明

Eg:

enum logic [1:0] {WAITE, LOAD, READY} state;    //2位宽的枚举类型,四态基类

注意label数涉及到value的值,要与基类类型匹配。

.2.5. 自定义枚举类型

typedef enum {WAITE, LOAD, READY} states_t;     //自定义枚举类型states_t

states_t state, next_state;  //声明枚举state,next_state

同类型枚举变量可以互相赋值

2.6. 枚举类型的专用系统任务(system tasks)和方法(method)

方法(method):SV提供了一些能自动处理enum的内置函数

调用方式(类似C++):

<enum_variable_name>.first:返回指定变量枚举列表的第一个成员的值

<enum_variable_name>.last:返回指定变量枚举列表的最后一个成员的值

<enum_variable_name>.next(<N>):从枚举变量的当前位置算起,返回后面第N个 成员的值。如果枚举变量当前值不在枚举变量列表中,则返回列表中第一 个成员的value。<N>可缺省。缺省时返回枚举列表中下一个成员的值。

<enum_variable_name>.prev(<N>):从枚举变量的当前位置算起,返回前面第N个 成员的值。如果枚举变量当前值不在枚举变量列表中,则返回列表中最后 一个成员的value。<N>可缺省。缺省时返回枚举列表中前一个成员的值。

<enum_variable_name>.num:返回变量的枚举列表中元素个数

<enum_variable_name>.name:返回枚举变量中代表这个value的字符串

Systemverilog for design 笔记(三)的更多相关文章

  1. Systemverilog for design 笔记(六)

    转载请标明出处 第一章 有限状态机建模(FSM,finite state machine) 1.1.    使用枚举类型建立状态机模型 l  三过程块建模风格:三个过程块分别实现: a.状态转换(al ...

  2. Systemverilog for design 笔记(七)

    转载请标明出处 第一章 接口(interface) 1.1.    接口的概念 接口允许许多信号合成一组由一个端口表示. 1.2.    接口声明 //接口定义 Interface main_bus ...

  3. Systemverilog for design 笔记(五)

    转载请标明出处 第一章 System Verilog过程块.任务和函数 1.1.    verilog通用目的always过程块(procedural block)(可综合) always过程块的综合 ...

  4. Systemverilog for design 笔记(四)

    转载请标明出处 数组.结构体和联合体 1. 结构体(struct) 1.1. 结构体声明 结构体默认是变量,也可以声明为线网 var struct { // 通过var进行结构体变量声明 logic ...

  5. SystemVerilog for design 笔记(二)

    转载请标明出处 1. System Verilog文本值和数据类型 1.1. 增强的文本值赋值 相对于verilog,SV在文本值赋值时可以1.无需指定进制    2.赋值可以是逻辑1 用法: reg ...

  6. Systemverilog for design 笔记(一)

    转载请标明出处 一.     System Verilog 声明的位置 1.       包(packages) Verilog要求局部声明: variables, nets, tasks and f ...

  7. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  8. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  9. Mastering Web Application Development with AngularJS 读书笔记(三)

    第一章笔记 (三) 一.Factories factory 方法是创建对象的另一种方式,与service相比更灵活,因为可以注册可任何任意对象创造功能.例如: myMod.factory('notif ...

随机推荐

  1. 零基础入门python爬虫(一)

    ✍写在前面: 欢迎加入纯干货技术交流群Disaster Army:317784952 接到5月25日之前要交稿的任务我就一门心思想写一篇爬虫入门的文章,可是我并不会.还好有将近一个月的时间去学习,于是 ...

  2. 面试问烂的 Spring AO,全文详解

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  3. socketserver 模块简介

    一.socketserver模块简介 socketserver模块简化了网络编程,模块下有五个服务类:BaseServer.TCPServer.UDPServer.UnixStreamServer.U ...

  4. 极客大挑战 2019 web 部分解

    复现环境:buuoj 0x01:Havefun F12查看源码,明显html注释里是一段php get方式传参数,payload:http://f5cdd431-df98-487f-9400-e8d0 ...

  5. word写文档体会

    1.找一个文档规范要求. 2.根据文档的规范要求调整正文的格式,标题1的格式,标题2的格式,标题3的格式,图表的格式,把没用的那些格式都删除掉. 3.图注表注后空格一行. 4.设置页眉页脚. 5.生成 ...

  6. 介绍Mobility Group

    Mobility或Roaming是无线客户端能够安全地从一个AP无缝关联到另一个AP的能力,并且延迟尽可能的短. 当无线客户端和AP关联并通过AP进行身份验证时,注册AP的WLC会将客户端条目放在自己 ...

  7. zabbix4.4安装和简要设置

    简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.它能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决 ...

  8. retrying 模块

    我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过 try 块去进行重试,但是每次都写那么一堆 try 块,真的是太麻烦了,所以今天就来说一个比较 pythonic 的模块,retr ...

  9. fastdfs下载文件自定义文件名称

    fdfs 存储节点storage安装nginx,修改nginx配置文件 location /group1/M00/ { root /fdfs/storage/data; if ($arg_attnam ...

  10. 计划任务cron,date,时间同步ntp,chrony

    取出磁盘利用率最大值 ,写个脚本,做判断,只要快满了,就报警 计划周期性执行的任务提交给crond,到指定时间会自动运行 系统cron任务:系统维护作业  /etc/crontab 用户cron任务: ...