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