前言
这一篇来介绍几个SV新增的语法typedef/enum/struct,这几个语法相信有学过C语言的人都不陌生,用法上基本上也都差不多,不过这几个语法不单可以用在验证当中,也可以用在设计上,在描述硬体上可以更简洁,下面我会给几个使用上的例子来说明。
typedef
typedef用来自定义资料型态,透过下面语法去宣告一个新的资料型态
typedef <data_type> <type_name>
Example1
typedef logic[15:0] example;module test; example a = 16'h3456; initial begin $display("a = %x", a); $display("size of a = %d",$bits(a)); endendmodule
a = 3456, size of a = 16
enum
enum用来描述一个变数的合法值範围,并且要给每一个值一个自定义的名字。
enum {Mon,Tue,Wed,Thur,Fri,Sat,Sun} days
举例来说,可以直接用自定义的名字给它赋值,会看到最终会映射到0,1,2
Example2
module test; enum {Wait,Ready,Start} state; initial begin state = Wait; $display("state = %d",state); state = Ready; $display("state = %d",state); state = Start; $display("state = %d",state); endendmodule
state = 1, state = 2, state = 3
也可以用来实现Finite State Machine,可以取代以前Verilog使用Parameters的写法
struct
struct可以把相关联的变数给包在一起,举例来说
Example3
module test; struct{ int a,b; logic [15:0] c; bit d; } exp1; initial begin exp1 = '{256,128,16'b0000000000000100,1'b1}; $display("a = %d, b = %d, c = %16b , d = %b", exp1.a,exp1.b,exp1.c,exp1.d); endendmodule
a = 256, b = 128, c = 0000000000000100, d = 1
后记
SV加入了许多C语言的特性,好处是学过C之后再来学SV会更容易上手,而且也更容易和C语言的介面作对接。除此之外于设计方面也可以更加简洁,像是Finite State Machine原本需要很多个Parameters去声明,但有了enum之后可以大幅度的简化