我可以在verilog中选择有意义的名字吗?

时间:2012-10-08 16:14:29

标签: verilog

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

reg [7:0] flags;

在我的代码中,我可以将其中的部分内容称为flags[0]flags[3]flags[7:4]等等,我希望能够按照{{{{{{ 1}},flags.Zflags.C

目前,我发现这很接近:

flags.STATE

这意味着我可以分配和评估`define Z [0] `define N [1] `define C [2] `define V [3] `define STATE [7:4] reg [7:0] flags; flags`Zflags`C

但是,使用单字母定义来污染全局命名空间似乎是一个坏主意,特别是因为编译器会接受flags`STATE。这是否可以接受?

有更简单的方法吗?我知道SystemVerilog有结构,但我只限于verilog 2001。

2 个答案:

答案 0 :(得分:3)

好问题。据我所知,Verilog-2001中没有任何内容可以帮助太多。也许其他人会有更好的答案。

我可以理解你想要使用`定义的内容,但我认为使用参数会更不容易出错。那么您也不必担心污染命名空间。当然,对于单个位字段,这确实最有效(就可读性而言)。

e.g。

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] ...

您可能还想考虑使用函数可以做些什么。

答案 1 :(得分:3)

我同意你应该避免全球define。我只想为每个字段使用单独的reg,然后将它们组合为wire

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

您只能分配给每个reg,但您可以使用regwire进行评估。