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

时间:2017-03-08 02:09:42

标签: 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, 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];

感谢,

2 个答案:

答案 0 :(得分:0)

我认为你不能在enum中做你想做的事。

当您编写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的宽度。

答案 1 :(得分:0)

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