首页 文章

在系统verilog中保留枚举中的位宽

提问于
浏览
0

我如何在Enum中保留位宽?

例如,在以下代码中: -

typedef enum bit[2:0] {
b1=2'b10,
b2=3'b100
}b;


{// regular stuff module, initial begin etc..
b a1,a2;
a1=b1;
a2=b2;

$display("b=%0d %b",$bits(a1),a1); **// prints 3, 010**
$display("b=%0d %b",$bits(a2),a2); **// prints 3, 100**
}

我怎样才能获得第一个声明打印2,10

我也试过以下: -

typedef enum {

w1=2,
w2=3
}w;

w wa1,wa2;
int len,len2;
bit [3:0] bb;
{
bb=a1;
len=w1;
$display("b=%0d %b",$bits(bb[len:0]),wa1);
enter code here
bb=a2; len=w2;
$display("b=%0d %b",$bits(bb[len:0]),wa2);
}

which has compile issue .

保留变量/枚举位宽的任何其他技术也是受欢迎的 .

--------------原始问题发布后编辑-----------------

提出这个问题的一种更简单的方法是......

可以说我有点[31:0] a;

我需要实现如下功能: -

function bit[] get(bit[31:0] a, int size)
  return a[(size-1):0];

谢谢,

2 回答

  • 0

    我认为你不能在_1845836中做你想做的事 .

    当您编写 typedef enum [2:0] {...} b; 时,您正在定义一个名为 b 的类型,其宽度为3.此类型的所有值将(必然)具有宽度3.考虑这个问题的一个好方法可能是考虑一个将 b 作为一个模块的模块 . 输入,例如,

    module mymod(input b myB, output o);
    ...
    endmodule
    

    myB 应该有多宽?它必须足够宽,以便 mymod 接受 b 类型的任何参数 . 例如,您希望能够通过此模块 b1b2 并使其正常工作 . 但随着模拟/硬件的运行,模块会动态地改变其大小 .

    如果您只想要一些具有独立宽度的命名值,您可以尝试使用 localparam ,例如,您可以编写:

    localparam b1 = 2'b10;
    localparam b2 = 3'b100;
    

    但是当您尝试将这些问题分配给变量 a1a2 时,您仍会遇到类似的问题 . 那时,这只是 a1a2 的宽度问题 .

  • 0

    好吧,如果你坚持使用 enum ,你可以隐含地实现这个目标: $display("b=%0d %0b", $clog2(a1+1), a1); **// prints 2, 10** $display("b=%0d %0b", $clog2(a2+1), a2); **// prints 3, 100**

相关问题