2017-01-27 22 views
0

我正在尋找一種方式來連接多個define statements into a single定義語句,這樣我就可以在case語句中使用它。的Verilog - 連接多個定義爲一個定義

作爲一個例子,有在頭文件中定義的存儲器地址。我有一個case語句,用於決定是否將值寫入LUTRAM或根據地址阻塞RAM。

我有以下定義:

`define PWM_REPEAT_REG      (6'h10)   // Number of times to repeat a PWM Pulse 
`define PWM_WIDTH_REG      (6'h14)   // Pulse width in timebase counts 
`define PWM_PULSE_PERIOD     (6'h1c)   // PWM pulse period in timebase counts. 

裏面我的代碼,我有一個case語句看起來像這樣:

case(sys_mgr_address) 
    `PWM_REPEAT_REG, `PWM_WIDTH_REG, `PWM_PULSE_PERIOD : begin // Values for block RAM 
     ram_a_din    <= sys_mgr_write_data; 
     ram_a_addr    <= sys_mgr_address; 
     ram_a_wr_enable   <= 1'b1; 
     sys_mgr_write_ok  <= 1'b1; 
     update_available  <= 1'b1; 
    end 
endcase 

實際的設計有幾個地址,這種類型的案件陳述重複幾次。而不是每一個遍地鍵入了所有的定義,我想創建另一個定義是這樣的:

`define PWM_MODULE_BLOCK_RAM_ADDRESSES ({`PWM_REPEAT_REG, `PWM_WIDTH_REG, `PWM_PULSE_PERIOD}) 

    case(sys_mgr_address) 
    PWM_MODULE_BLOCK_RAM_ADDRESSES : begin // Values for block RAM 
     ram_a_din    <= sys_mgr_write_data; 
     ram_a_addr    <= sys_mgr_address; 
     ram_a_wr_enable   <= 1'b1; 
     sys_mgr_write_ok  <= 1'b1; 
     update_available  <= 1'b1; 
    end 
endcase 

^^因爲它是串聯的數字成爲一個漂亮的上面的代碼不起作用大矢量。我嘗試了一些變體,比如沒有連接大括號{},將其定義爲文本,幾個不同的變體(但我不確定它到底是什麼)。

有什麼辦法,才能查看擴展宏之前編譯?現在,它只是給我一個錯誤,我嘗試過的大多數錯誤都不會讓故障排除變得容易。

謝謝!

回答

1

你在想太難。所有你需要做的就是把逗號的宏

`define PWM_MODULE_BLOCK_RAM_ADDRESSES `PWM_REPEAT_REG, `PWM_WIDTH_REG, `PWM_PULSE_PERIOD 

定義宏的只是簡單的文本擴展。

+0

我曾經嘗試過,但是在定義的周圍使用括號,所以它是'PWM_MODULE_BLOCK_RAM_ADDRESSES('PWM_REPEAT_REG,'PWM_WIDTH_REG,'PWM_PULSE_PERIOD)'。沒有括號的方法有效,爲什麼會這樣呢? –

+0

因爲括號對於case語句項目不是合法語法。宏必須擴展成合法的語法。 –

+0

謝謝,這清除了一切!現在完美工作。 –