如何在枚举中保留位宽?
例如,在以下代码中: -
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];
感谢,
答案 0 :(得分:0)
我认为你不能在enum
中做你想做的事。
当您编写typedef enum [2:0] {...} b;
时,您正在定义一个名为b
的类型,其宽度为3.此类型的所有值将(必然)具有宽度3.考虑这个问题的好方法可能是考虑一个将b
作为输入的模块,例如
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
的宽度。
答案 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**