System verilog 在verilog系统中保持枚举中的位宽度

System verilog 在verilog系统中保持枚举中的位宽度,system-verilog,System Verilog,如何在枚举中保留位宽度 例如,在以下代码中:- 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,

如何在枚举中保留位宽度

例如,在以下代码中:-

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);
}
有编译问题的

还欢迎使用任何其他技术来保留变量/枚举的位宽度

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

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

假设我有一个比特[31:0]a

我需要实现以下功能:-

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

谢谢,

我不认为你能在
枚举中做你想做的事

当你写
typedef枚举[2:0]{…}b
您正在定义一个名为
b
的类型,其宽度为3。此类型的所有值(必须)宽度为3。考虑这个问题的一个好方法可能是考虑一个模块,该模块将使用<代码> B/COD>作为输入,例如

module mymod(input b myB, output o);
...
endmodule
myB应该有多宽?它需要足够宽,
mymod
才能接受类型为
b
的任何参数。例如,您希望能够通过此模块
b1
b2
,并使其正常工作。但是模块的输入不能随着模拟/硬件的运行而动态改变其大小

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

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

但是,当您尝试将这些变量分配给变量
a1
a2
时,仍然会遇到类似的问题。在这一点上,问题只是
a1
a2
有多宽。

好吧,如果你坚持使用
enum
,你可以隐式实现这一点:

$display(“b=%0d%0b”,$clog2(a1+1),a1);***/打印2,10**
$display(“b=%0d%0b”,$clog2(a2+1),a2);***/打印3100张**

我认为
enum
不能用于此目的,因为它将为每个enum值提供相同的位宽度。