背景:
在最近實戰開發中發現:對外部芯片進行初始化時,往往需要定義大量參數。
若直接在module中通過localparam或者parameter進行參數定義的話,會帶來兩個問題:
1.代碼長度增加,不夠美觀;
2.不利於參數和代碼修改;
為了解決這兩個問題,我想到了在之前在《verilog數字系統設計教程》(夏聞宇)看到過的`define宏定義+`inlude "file.v"文件包含來實現參數模塊化設計的方式。
實戰:
1.新建參數模塊文件(我命名為para.v);
2.在para.v文件中使用'define宏定義參數(部分、有錯誤):
//`define+name+參數
`define STATE_INIT 3'd0;
`define STATE_IDLE 3'd1;
`define STATE_WRIT 3'd2;
`define STATE_READ 3'd3;
`define STATE_WORK 3'd4;
`define STATE_RETU 3'd5;
3.在需要調用參數的文件init.v中使用`include "para.v":
`include "para.v"
4.在init.v文件需要參數的地方使用`name 調用(部分):
state_init <= `INIT_0;
5.保存之后,程序報錯:
ERROR:HDLCompiler:806 - "F:/xilinx/pcm1864/pcm1864_3/v/init.v" Line 51: Syntax error near ";".
ERROR:ProjectMgmt - 1 error(s) found while parsing design hierarchy.
6.之后進行了兩個多小時的調試(一直沒發現問題所在= =),最終在書上的案例中發現原因:`define+name+參數 之后不能加";",也就是說,正確的代碼應該是這樣的:
//`define+name+參數
`define STATE_INIT 3'd0
`define STATE_IDLE 3'd1
`define STATE_WRIT 3'd2
`define STATE_READ 3'd3
`define STATE_WORK 3'd4
`define STATE_RETU 3'd5
7.之后就都正確了。
總結:
1.`define+name+參數 之后不能加任何東西!
2.寫代碼一定要細心,細致!
3.當使用從未使用過的語句時,一定要先確定正確的用法!
補充:
`define 與localparam和parameter最大的區別就是`define 可以跨文件傳遞參數;parameter只能在模塊間傳遞參數;而localparam只能在其所在的module中起作用,不能參與參數傳遞。