背景:模塊化
在最近實戰開發中發現:對外部芯片進行初始化時,每每須要定義大量參數。spa
若直接在module中經過localparam或者parameter進行參數定義的話,會帶來兩個問題:設計
1.代碼長度增長,不夠美觀;調試
2.不利於參數和代碼修改;教程
爲了解決這兩個問題,我想到了在以前在《verilog數字系統設計教程》(夏聞宇)看到過的`define宏定義+`inlude "file.v"文件包含來實現參數模塊化設計的方式。開發
實戰:it
1.新建參數模塊文件(我命名爲para.v);module
2.在para.v文件中使用'define宏定義參數(部分、有錯誤): file
//`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中起做用,不能參與參數傳遞。