1. 程式人生 > >c和verilog的enum列舉型別

c和verilog的enum列舉型別

Verilog中的列舉型別與C語言中一樣。

C語言中列舉型別 1、應用場合 
在程式中,可能需要為某些整數定義一個別名,我們可以利用預處理指令#define來完成這項工作:

#define MON  1 

#define TUE   2

 #define WED  3

 #define THU   4

 #define FRI    5

 #define SAT   6

 #define SUN   7

在此,我們定義一種新的資料型別,希望它能完成同樣的工作。這種新的資料型別叫列舉型。

 以下程式碼定義了這種新的資料型別:

enum DAY

 { 
      MON=1, TUE, WED, THU, FRI, SAT, SUN

 };

(1) 列舉型是一個集合,集合中的元素(列舉成員)是一些命名的整型常量,元素之間用逗號,隔開;

(2) DAY是一個識別符號,可以看成這個集合的名字,是一個可選項,即是可有可無的項;

(3) 第一個列舉成員的預設值為整型的0,後續列舉成員的值在前一個成員上加1,如果把第一個改為1,

後續成員依次為2,3,4…;

(4)可以在定義列舉型別時初始化各個成員的值,從而自定義某個範圍內的整數;

(5) 列舉型是預處理指令#define的替代;

(6) 型別定義以分號;結束。

2、引用方法

(1)定義後引用 enum DAY { 
      MON=1, TUE, WED, THU, FRI, SAT, SUN

 }; 
enum DAY yesterday; 

enum DAY today; 
enum DAY tomorrow; //變數tomorrow的型別為列舉型enum DAY 
enum DAY good_day, bad_day; //變數good_day和bad_day的型別均為列舉型 
其中任何一個列舉資料型別enum DAY都是在所以定義的enum DAY成員範圍變化。

(2)定義時引用

enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //變數days的型別為列舉型enum week

(3)用typedef把列舉型別定義為別名

typedefenum workday


    saturday,     

sunday = 0,     

monday,    

 tuesday,    

 wednesday,    

 thursday,     

friday 

} workday; //此處的workday為列舉型enum workday的別名 
workday today, tomorrow; //變數today和tomorrow的型別為列舉型workday,也即enum workday。

同時,enum workday中的workday可以省略。

Verilog中列舉型別

Verilog中的列舉型別應用與c語言一致。如用在狀態機的狀態定義中。

1、 用列舉型別定義狀態機狀態 

typedefenum logic[4:0] {REQ_IDLE=5'b00001, REQ_READ, REQ_READ_RETURN, REQ_WRITE1, REQ_WRITE2, REQ_WRITE_WAIT_REQ_RDY, REQ_WRITE_WAIT_DATA_RDY } request_fsm_t; 

這裡採用了typedef為enum logic[4:0]定義為別名request_fsm_t

2、 引用

定義狀態機當前狀態和下一個狀態。

例子 
`timescale 1ps/1ps 

moduleenum_test; 
typedefenum logic[4:0] {REQ_IDEL=5'b00001, REQ_READ, REQ_READ_RETURN, REQ_WRITE1, REQ_WRITE2, REQ_WRITE_WAIT_REQ_RDY, REQ_WRITE_WAIT_DATA_RDY} req; 

reqreq_ps;

 reqreq_ns; 

initial

 begin 
$display(REQ_IDEL); 

$display(REQ_READ); 
$display(REQ_READ_RETURN);

 $display(REQ_WRITE1);

 $display(REQ_WRITE2); 
$display(REQ_WRITE_WAIT_REQ_RDY);

$display(REQ_WRITE_WAIT_DATA_RDY);

 end endmodule