枚举类,也当成类

在包中,有枚举类,也有普通类,它们的名称不能相同,否则,编译会报错(错误信息提示,类名重复)。。。。


在 SystemVerilog 中,当一个变量只有几种可能的值,且需要用一种数据类型进行表示时,可使用枚举类型(enumeration,简写 enum)。所谓“枚举”,是将变量的值一一列举出来,变量的值来自于列举的值范围内,并且枚举变量一次只能获取该值范围内的一个值(标签)[^1]。 在 Verilog 语言成为 SystemVerilog 之前,没有枚举数据类型。当时若要为数据值创建标签,需定义一个 `parameter` 或 `localparam` 常量来表示每个值,并为该常量指定一个值,也可以使用 `'define` 宏定义一组宏名称,每个名称都有特定的值[^2]。 SystemVerilog 中枚举类型声明时,若没有特别指定,枚举类型会被当成 `int` 类型存储(缺省类型为双状态 `int`)。由于 `int` 类型的缺省值是 0,所以在给枚举常量赋值时需小心。例如: ```systemverilog // 指定枚举值:不正确 typedef enum {FIRST=1,SECOND,THRID} ordinal_e; ordinal_e position; // 指定枚举值:正确 typedef enum {BAD_O=0,FIRST=1,SECOND,THRID} ordinal_e; ordinal_e position; ``` 上述代码中,若不把 0 指定给一个枚举常量,像 `position` 会被初始化为 0,这并不是一个合法的 `ordinal_e` 变量,这是语言本身规定,而非工具缺陷[^3]。 以下是一个包含枚举类型随机化约束的示例: ```systemverilog class transaction; typedef enum { SIZE_8BIT, SIZE_16BIT, SIZE_32BIT, SIZE_64BIT, SIZE_128BIT } burst_size_t; rand burst_size_t burst_size; rand int langth = 0; string name; function new(string name="transaction"); this.name=name; endfunction constraint cstr{ langth inside {[1:9]}; } endclass module tb_top; initial begin int i=0; transaction tr; tr = new("tr"); for(i=0; i<10; i++) begin tr.randomize() with { langth < 5; burst_size inside { transaction::SIZE_8BIT, transaction::SIZE_128BIT}; }; $display("****************************************"); $display("this is the %0d times randomize.", i); $display("tr.burst_size:", tr.burst_size); $display("tr.langth:", tr.langth); end $finish(2); end endmodule ``` 该示例定义了一个包含枚举类型的 `transaction`,并对枚举类型变量 `burst_size` 和整型变量 `langth` 进行了随机化约束[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值