实战verilog中`define的使用记录

Posted yjw951012

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战verilog中`define的使用记录相关的知识,希望对你有一定的参考价值。

背景:

  在最近实战开发中发现:对外部芯片进行初始化时,往往需要定义大量参数。

  若直接在module中通过localparam或者paramter进行参数定义的话,会带来两个问题:

    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.当使用从未使用过的语句时,一定要先确定正确的用法!

以上是关于实战verilog中`define的使用记录的主要内容,如果未能解决你的问题,请参考以下文章

Verilog中parameter(参数)与define(宏定义)的区别

非特定的 `include 文件名 - 系统 Verilog 编译器指令

verilog HDL-参数型数据对像 与‘define

verilog条件编译

verilog之预编译

Verilog学习笔记基本语法篇········ 编译预处理