2012-10-08 33 views
2

說我有一個8位標誌寄存器:我可以在verilog中選擇有意義的名稱嗎?

reg [7:0] flags; 

雖然在我的代碼,我可以參考其中的一部分作爲flags[0],​​,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`Zflags`Cflags`STATE

但是,用單字母定義污染全局命名空間似乎是一個壞主意,特別是因爲編譯器會接受notflags`N。這是可以接受的嗎?

有沒有更簡單的方法來做到這一點?我知道SystemVerilog有結構,但我限制在verilog 2001.

回答

3

好問題。據我所知,Verilog-2001中沒有任何東西可以幫助太多。也許別人會有更好的答案。

我可以理解你想要用`define定義的內容,但是我認爲它會更少使用參數的錯誤。那麼你不必擔心污染命名空間。當然,這對單個位字段來說效果最好(在可讀性方面)。

例如

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

你可能還想考慮你可以用函數做什麼。

3

我同意你應該避免全球define。我只想用一個單獨的reg每個字段,然後將它們組裝爲wire

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

只能分配給每個reg,但你可以使用任何的regwire的EVAL。

相關問題