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


背景:

  在最近實戰開發中發現:對外部芯片進行初始化時,往往需要定義大量參數。

  若直接在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中起作用,不能參與參數傳遞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM