我如何在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 回答
我认为你不能在_1845836中做你想做的事 .
当您编写
typedef enum [2:0] {...} b;
时,您正在定义一个名为b
的类型,其宽度为3.此类型的所有值将(必然)具有宽度3.考虑这个问题的一个好方法可能是考虑一个将b
作为一个模块的模块 . 输入,例如,myB
应该有多宽?它必须足够宽,以便mymod
接受b
类型的任何参数 . 例如,您希望能够通过此模块b1
或b2
并使其正常工作 . 但随着模拟/硬件的运行,模块会动态地改变其大小 .如果您只想要一些具有独立宽度的命名值,您可以尝试使用
localparam
,例如,您可以编写:但是当您尝试将这些问题分配给变量
a1
和a2
时,您仍会遇到类似的问题 . 那时,这只是a1
和a2
的宽度问题 .好吧,如果你坚持使用
enum
,你可以隐含地实现这个目标:$display("b=%0d %0b", $clog2(a1+1), a1); **// prints 2, 10** $display("b=%0d %0b", $clog2(a2+1), a2); **// prints 3, 100**