前言
enum可用於一系列常量的定義。典型是用於狀態機的狀態建模,使得code更為清晰。

流程
本次需要一個top層模塊描述狀態機和定義文件即可。
(1)definition.sv內容為:使用one_hot編碼。
`ifndef
DFFS_DONE
`define
DFFS_DONE
package
p_demo
;
localparam
p_width
=
4
;
typedef enum
logic
[
3
:
0
]
{
//one_hot coder
e_adc_idel
=
4'b0001
,
e_adc_cache
=
4'b0010
,
e_adc_transfer
=
4'b0100
,
e_adc_work
=
4'b1000
}
e_adc_state
;
endpackage
import
p_demo
::*
;
`endif
(2)demo_sv.sv內容為:隨便寫個狀態機試試。
`include
"definitions.sv"
module
demo_sv
(
input
logic
i_clk,
output
logic
o_b
);
e_adc_state
es_state
=
e_adc_idel;
//enum類型變量定義
logic
[p_width
-
1
:
0
] l_cnt
=
'0
;
always_ff
@
(
posedge
i_clk)
begin
l_cnt
<=
l_cnt
+
'd1
;
end
always_ff
@
(
posedge
i_clk)
//狀態機跳轉邏輯
begin
if
(l_cnt
==
'd0
)
es_state
<=
e_adc_idel;
else
begin
case
(es_state)
e_adc_idel
:
begin
if
(l_cnt
==
'd4
)
es_state
<=
e_adc_cache;
end
e_adc_cache
:
begin
if
(l_cnt
==
'd15
)
es_state
<=
e_adc_work;
end
e_adc_transfer
:
begin
if
(l_cnt
==
'd9
)
es_state
<=
e_adc_cache;
end
e_adc_work
:
begin
if
(l_cnt
==
'd29
)
es_state
<=
e_adc_transfer;
end
default
:
es_state
<=
e_adc_idel;
endcase
end
end
assign
o_b
=
(es_state
==
e_adc_transfer)
?
1'b1
:
1'b0
;
endmodule
:
demo_sv
(3)使用vivado2018.3綜合看看。

注意:匿名枚舉是不可綜合的。


以上。