【基本知識】verilog中 `define 的使用

背景:模塊化

  在最近實戰開發中發現:對外部芯片進行初始化時,每每須要定義大量參數。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中起做用,不能參與參數傳遞。

相關文章
相關標籤/搜索