2017-03-08 3 views
0

Enumでビット幅を保持するにはどうすればよいですか? システムのVerilogで列挙型のビット幅を保存する

は、次のコードでたとえば: - 10

私も試した私は、 プリント2を印刷する最初の文に取得する方法

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** 
} 

は以下: -

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); 
} 

ましたコンパイルの問題があります。

変数/列挙型のビット幅を保持する他の方法も歓迎します。

--------------元の質問が投稿された後の編集-----------------

配置する簡単な方法この質問は..

私はbit [31:0] aを持っていると言います。

は、私は次のような機能を実現する必要があります -

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

おかげで、

+1

を私はそれがすべての列挙型の値に対して同じビット幅を与えるため 'enum'は、この目的で使用することはできないと思います。 –

答えて

0

は、私はあなたがenumでやりたいことができるとは思いません。

typedef enum [2:0] {...} b;と記述すると、幅が3のbというタイプが定義されています。このタイプの値はすべて、必然的に幅が3になります。これについて考える良い方法は、例えば、入力としてbを取り、

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

どのように広いmyBすべきですか? mymodがタイプbの引数を受け入れるには十分な幅が必要です。たとえば、このモジュールをb1またはb2のいずれかに渡して動作させたいと思っています。しかし、モジュールの入力は、シミュレーション/ハードウェアが動くにつれて動的にサイズを変更することはできません。

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

しかし、あなたがしようとすると、やはり同様の問題に遭遇します:

あなただけの独立した幅を持っているいくつかの名前付きの値を持つようにしたい場合は、例えば、localparam使用してみてください、あなたが書くことができますこれらを変数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**

関連する問題