首页 > 编程知识 正文

c语言枚举类型enum定义,枚举类型enum定义

时间:2023-05-04 06:47:39 阅读:126829 作者:4793

文章列表1、枚举类型1、枚举类型值2、枚举类型的基类2、枚举类型用法示例1、使用传统verilog语言define和parameter的状态机的代码2、使用系统verilog枚举类型enum的代码

内容:本文的主要目的是为了说明枚举类型的定义,为什么需要枚举类型,一个例子说明枚举类型的基本类型,另一个例子说明枚举类型的重要性

提示:以下为本文正文内容,以下案例可供参考

另一方面,枚举类型1 .枚举类型的值默认情况下,枚举类型列表中的标签表示的实际数值是int类型的整数,枚举列表中的第一个标签表示数字0,第二个名称表示数字1,第三个名称表示数字2等等。 示例: enum {A=1,b,c,X=24,y,Z} list1; 标签a明确地分配给1,b自动表示2,c表示3。 的数值显式定义为24,y和z分别表示25和26。

枚举列表中的每个标签必须具有唯一的值。 如果两个标签有相同的值,就会发生错误。 在以下示例中,c和d的值相同,为3,因此会发生错误。

enum {A=1,b,c,D=3} list2; //错误2 .枚举类型的基类枚举类型是具有一组标签值的变量或线网,因此枚举类型有Verilog或Systemverilog基类。 枚举类型的缺省基类是int,它是32位2类型。

//1位宽的枚举类型,双状态基类enum bit {TRUE,FALSE} Boolean; //2位宽的枚举类型,四状态基类enum logic[1:0] {WAIT,LOAD,READY} state; 如果为明确定义枚举类型的枚举标签赋值,则该值的宽度必须与基类的宽度匹配。

enum logic[2:0] {WAIT=3'b001,LOAD=3'b010,READY=3'b100} state; 为枚举标签分配与枚举类型声明的基类宽度不同的值是错误的。 下面的例子是错误的。 默认情况下,枚举变量设置为int基类,为标签指定3位值将导致错误。

enum {WAIT=3'b001,LOAD=3'b010,READY=3'b100} state; 这是错误的。 int类型为32位,但其中枚举元素的变量宽度为3位,这违背了值宽度与基类宽度匹配的规定。

如果枚举列表的标签超出了基类可以表示的宽度,这是错误的。

enum logic {A=1'b0、b、C} list5 //错误,对于1位宽,//只有0和1枚举值的基类为4状态数据类型时,将枚举标签分配给x或z是合法的。

enum logic{ON=1'b1,OFF=1'bz} out; 如果枚举列表中的一个标签分配了x或z,则必须先显式分配值。 尝试将x或z与指定标签的值加1自动获取值是错误的。

enum logic[1:0]{WAIT,ERR=2'bxx,LOAD,READY}state; //错误,无法确定LOAD的值2,枚举类型的使用示例1。 使用传统的verilog语言define和parameter编写状态机代码时(例如

` define fetch3' h0 ` define write3' h1 ` define add3' H2 ` define sub3' H3 ` define mult3' H4 ` define div3' H5 ` define shift write,input wire [ 2:0 ] instructioninputwireclock,resetN ); 参数等待=0,加载=1,存储=2; reg [1:0] state,next_state; always@(Posedgeclk,negedge resetN ) if (! resetn (状态=waite; else state=next_state; always@(state ) Begincase ) state ) WAITE : next_state=LOAD; LOAD : next_state=STORE; STORE : next_state=WAITE; endcaseendalways@(state,instruction ) begin read=0; write=0if (state==load instruction==` fetch ) read=1; else if (state==store instruction==` write ) write=1; 结束模块。这是模拟波形

这是用verilog编写的代码,是使用常数值的变量,如本示例中的state所示

和next_state,必须声明为标准的Verilog变量类型,这意味着软件工具无法限定这些信号的有效值仅仅是这些常数数值,在这个例子上,没有采用什么方法来限制state和next_state有一个值3,或者有一位或多位被设置成X或者Z的值,因此,模型本身必须加入对这些值的限定检验,至少,需要一个综合的“full case”编译指令来综合工具,状态变量只使用case列表中的常数值,然而,综合编译指令的使用并不影响仿真,这可能会引起仿真行为和由综合产生的结构级设计并不相同。

2.使用systemverilog 枚举类型 enum撰写代码  从图中可以看出仿真结果正常,使用systemverilog撰写上述代码 package chip_type;typedef enum {FETCH, WRITE, ADD, SUB, MULT, DIV, SHIFT, NOP} instr_t;endpackage;import chip_type::*;module sv_5( output logic read, write, input instruction, input clk, resetN);enum {WAIT,LOAD,STORE} state,next_state;always @(posedge clk or negedge resetN) begin if(!resetN) state <= WAIT; else state <= next_state; end always @(state) begin case(state) WAIT: next_state=LOAD; LOAD: next_state=STORE; STORE: next_state=WAIT; endcase end always @(state,instruction) begin read=0; write=0; if(state == LOAD && instruction == `FETCH) read=1; else if(state == STORE && instruction ==`WRITE) write=1; end endmodule

  testbench

`timescale 1ns/1nsimport chip_type::*;module sv_5_tb;logic clk,resetN;instr_t instruction;wire read,write;sv_5 u1(.instruction(instruction), .read(read), .write(write), .clk(clk), .resetN(resetN)); always #5 clk= ~clk;initialbegin clk=0; instruction=FETCH; //FETCH resetN=0;#20 resetN=1;#2000$finish; endendmodule

 仿真波形

 在这个例子中,变量State和Next_state只能有WAITE、LOAD、和STORE三种有效值,所有的软件工具,包括仿真、综合和形式验证都用相同的方式解释对于枚举类型变量合法值的约束,所以systemverilog撰写的case语句中不需要加入default,也不会生成锁存器。
 分析利用systemverilog仿真的波形,read与write的数值是不定态,而且state,next_state的数值也没有发生更新,这是为什么呢??
 always块建立的组合逻辑不会在零时刻自动触发,
这是因为state是枚举类型,枚举类型的缺省值是int两态数据类型,所以默认初始值是0,0时刻复位没有任何变化,所有不会触发。

总结  通过举例可以发现,枚举类型enum的引入带来了以下优点:
 (1)systemverilog引入了枚举类型enum之后,简化了代码的复杂度,使得代码便于维护和调试。
 (2)使用systemverilog enum枚举类型可以避免锁存器的产生,但是使用verilog撰写的代码必须设置default的缺省值选项,否则会生成锁存器。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。