gpt4 book ai didi

verilog - 如何在系统verilog中使用枚举中的算术表达式?

转载 作者:行者123 更新时间:2023-12-04 01:19:03 25 4
gpt4 key购买 nike

`define REG_WIDTH 48
`define FIELD_WIDTH 32
typedef enum bit [`REG_WIDTH-1:0]
{
BIN_MIN = 'h0,
BIN_MID = BIN_MIN + `REG_WIDTH'(((1<<`FIELD_WIDTH)+2)/3),
BIN_MAX = BIN_MID + `REG_WIDTH'(((1<<`FIELD_WIDTH)+2)/3),
}reg_cover;

在上面的代码中,我得到了枚举重复的编译错误,因为 BIN_MID 也取值 '48{0}。但是当我为 "BIN_MIN + `REG_WIDTH'(((1<<`FIELD_WIDTH)+2)/3)" 做 $display 时,我没有得到零。由于我已将每个枚举字段类型转换为 48,为什么我得到零?我是系统 Verilog 的新手。

最佳答案

通常,整数常量,如 1被视为 32 位值(SystemVerilog LRM 指定它们至少为 32 位,但大多数模拟器/综合工具恰好使用 32 位)。因此,由于您首先执行 32 的移位,因此在编译期间您将完全移出一个并留下 0(32'd1<<32 为零)。通过将整数常量的大小先扩展到 48 位,就不会因为移位而丢失值:

`define REG_WIDTH 48
`define FIELD_WIDTH 32
typedef enum bit [`REG_WIDTH-1:0] {
BIN_MIN = 'h0,
BIN_MID = BIN_MIN + (((`REG_WIDTH'(1))<<`FIELD_WIDTH)+2)/3,
BIN_MAX = BIN_MID + (((`REG_WIDTH'(1))<<`FIELD_WIDTH)+2)/3
} reg_cover;

至于为什么放在$display打印一个非零值,我不确定。我试过的一些模拟器确实打印了非零值,其他模拟器打印了 0。编译时优化和它们运行代码的方式可能存在一些差异,但最好先进行转换。

关于verilog - 如何在系统verilog中使用枚举中的算术表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62869500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com