zoukankan      html  css  js  c++  java
  • Systemverilog for design 笔记(三)

    转载请标明出处

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

    1. 用户自定义类型(typedef

    局部typedef定义:只用于设计的特定部分时,typedef的定义可在moduleinterface

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

    Eg

    package chip_types;

    `ifdef TWO_STATE

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

    `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时,VerilogSV会采取不同的方法:

    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. 枚举类型值

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

    Eg:  enum {A=1, B, C, X=24, Y, Z} list;             //A=1B=2C=3X=24Y=25Z=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;  //声明枚举statenext_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的字符串

  • 相关阅读:
    linux中的中断处理框架
    linux中的异常处理流程
    如何使用次设备号控制多个LED
    装载内核模块时,自动添加设备文件
    第一个字符设备驱动程序
    网络文件系统
    点击全选或全不选,一个页面有多个全选和全不选的时候
    ubuntu 20.04 遇到的问题
    Ubuntu20.04 初始没有的东西
    Ubuntu 20 安装pycharm备忘
  • 原文地址:https://www.cnblogs.com/daisyuer/p/9212945.html
Copyright © 2011-2022 走看看