constants - SystemVerilog 无法识别常量 : Error: Range must be bounded by constant expression

标签 constants declaration system-verilog

在这个简短的示例中,我想简化信号宽度的编写。对于一个信号,确实没有必要这样做,但在我的实际代码中,我有很多这样的信号,用较长的样式声明它们是不合适的。

您能告诉我为什么我收到 signal_2 错误吗?

module sample #(parameter BYTE_WIDTH = 4);
    const int BIT_WIDTH = BYTE_WIDTH * 8;

    logic [BYTE_WIDTH * 8 -1 : 0] signal_1; // works
    logic [BIT_WIDTH -1 : 0] signal_2; // ** Error: Range must be bounded by constant expressions.
endmodule

最佳答案

const 变量在运行时被赋值。为时已晚:变量 signal_2 的宽度需要在编译时修复。因此,您需要的是一个 localparam,它(如 parameter)在编译时是固定的,但(与 parameter 不同)不能从外部覆盖:

module sample #(parameter BYTE_WIDTH = 4);
    localparam BIT_WIDTH = BYTE_WIDTH * 8;

    logic [BYTE_WIDTH * 8 -1 : 0] signal_1; 
    logic [BIT_WIDTH -1 : 0] signal_2; 
endmodule

https://www.edaplayground.com/x/2fKU

关于constants - SystemVerilog 无法识别常量 : Error: Range must be bounded by constant expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61341531/

相关文章:

VB.NET:动态获取常量值

c - 在函数中使用 const 修饰符

c - C 中的预期标识符

verilog - 这段代码中的程序 block 如何控制时钟输出?

C++ const 结构指针不可访问

c - 如何使结构常量中的函数指针用于初始化常量数组?

c++ - 在 C++ 中的函数声明之后不需要分号 (';' ) 吗?

c - C 中结构体数组的数组 - 声明

system-verilog - 系统 verilog 断言中 -> 和 => 之间有什么区别?