zoukankan      html  css  js  c++  java
  • 【基本知识】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中起作用,不能参与参数传递。

  • 相关阅读:
    akka并发编程练习
    使用selenium和chromedriver组合爬虫时,如果爬取的页面数量巨多,会出现占用内存逐渐增大知道程序崩溃的情况
    网易2017秋招编程题集合_以下代码全部来自牛客网
    牛客网_运行问题
    json和xml之间转换的好文
    Eclipse 启动时闪退问题解决方案
    关于opencv的文件配置详细内容
    第一个opencv声称图片_以及遇到的问题集锦
    好文收藏_关于find_first_not_of函数
    好文收藏readtxt_cpp
  • 原文地址:https://www.cnblogs.com/yjw951012/p/10595533.html
Copyright © 2011-2022 走看看