假设我有一个8位标志寄存器:
reg [7:0] flags;
在我的代码中,我可以将其中的部分内容称为flags[0]
,flags[3]
,flags[7:4]
等等,我希望能够按照{{{{{{ 1}},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`C
。
但是,使用单字母定义来污染全局命名空间似乎是一个坏主意,特别是因为编译器会接受flags`STATE
。这是否可以接受?
有更简单的方法吗?我知道SystemVerilog有结构,但我只限于verilog 2001。
答案 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
,但您可以使用reg
或wire
进行评估。