3

8 ビットのフラグ レジスタがあるとします。

reg [7:0] flags;

私のコードでは、その一部を 、 などとして参照できますがflags[0]、、flags[3]、のflags[7:4]行に沿って何かを実行できるようにしたいと考えています。flags.Zflags.Cflags.STATE

現在、私はこれが近いことを発見しました:

`define Z [0]
`define N [1]
`define C [2]
`define V [3]
`define STATE [7:4]
reg [7:0] flags;

つまり、 、 、および を割り当てて評価することがflags`Zできflags`Cますflags`STATE

notflags`Nただし、グローバル名前空間を単一文字の定義で汚染することは、特にコンパイラによって受け入れられるため、悪い考えのように思えます。それにもかかわらず、これは受け入れられますか?

これを行う簡単な方法はありますか?SystemVerilog に構造体があることは知っていますが、Verilog 2001 に制限されています。

4

2 に答える 2

3

私はあなたがグローバルを避けるべきであることに同意しますdefineregフィールドごとに個別に使用し、それらをwire:としてアセンブルします。

reg Z, N, C, V;
reg [3:0] STATE;
wire [7:0] flags = {STATE, V, C, N, Z};

それぞれに割り当てることしかできませんが、またはforevalのregいずれかを使用できます。regwire

于 2012-10-08T17:16:03.697 に答える
3

良い質問。私の知る限り、Verilog-2001 にはあまり役に立たないものはありません。多分他の誰かがより良い答えを持っているでしょう。

`defines を使用して何をしようとしているのかは理解できますが、パラメーターを使用する方がエラーが発生しにくいと思います。そうすれば、名前空間の汚染についても心配する必要はありません。もちろん、これは単一ビット フィールドに対して (読みやすさの点で) 最適に機能します。

例えば

localparam Z = 0;
localparam N = 1;
localparam C = 2;
localparam V = 3;
localparam STATE_MSB = 7;
localparam STATE_LSB = 4;

... flags[Z] ...
... flags[STATE_MSB:STATE_LSB] ...

また、関数で何ができるかを検討することもできます。

于 2012-10-08T17:13:07.673 に答える