3

假设我有一个 8 位标志寄存器:

reg [7:0] flags;

虽然在我的代码中我可以将它的一部分称为flags[0],flags[3]flags[7:4],但我更希望能够按照flags.Z, flags.C, flags.STATE.

目前,我发现这很接近:

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

这意味着我可以分配和评估flags`Z,flags`Cflags`STATE.

然而,用单字母定义污染全局命名空间似乎是个坏主意,特别是因为notflags`N编译器会接受。这仍然可以接受吗?

有没有更简单的方法来做到这一点?我知道 SystemVerilog 有结构,但我仅限于 verilog 2001。

4

2 回答 2

3

我同意你应该避免 global define。我只会reg为每个字段使用一个单独的字段,然后将它们组装为wire

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

您只能分配给 each reg,但您可以使用 theregwirefor eval。

于 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 回答