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

原文地址:https://www.cnblogs.com/yjw951012/p/10595533.html

时间: 2024-10-10 05:27:40

【实战】verilog中`define的使用记录的相关文章

【方法1】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录

介绍 晚上无聊的时候,我做了一个測试题,測试题的大体意思是:删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录. 比如: I have a map with duplicate values: ("A", "1"); ("B", "2"); ("C", "2"); ("D", "3"); ("E", "

【方法2】删除Map中Value重复的记录,并且只保留Key最小的那条记录

根据guigui111111的建议:先把Map按Key从大到小排序,然后再把Key和Value互换.这也是一种很好的思路,我写了一下代码,顺便贴上来,供大家参考与分享. package shuai.study.map; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import j

Verilog中generate语句的用法

在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计提供了方便,generate语句一般在循环和条件语句中使用,为此,Verilog-2001增加了四个关键字generate,endgenerate, genvar, localparam,genvar是一个新增的数据类型,用在generate的循环中的标尺变量必须定义为gnevar类型. 首先设计一个1bit位宽的buffer_1,这里有几点

删除Map中Value重复的记录,并且只保留Key最小的那条记录

介绍 晚上无聊的时候,我做了一个测试题,测试题的大体意思是:删除Map中Value重复的记录,并且只保留Key最小的那条记录. 例如: I have a map with duplicate values: ("A", "1"); ("B", "2"); ("C", "2"); ("D", "3"); ("E", "3

我在编写《微软System Center 2012 R2私有云部署实战》中应用的一些小技巧

相信很多同学在处理超大文件,比如几万字.几十万字的文章中,需要图文混排.而图文混排可能会涉及到对图片编号和描述.比如我在<微软System Center 2012 R2私有云部署实战>中,就需要频繁的对章节.图片进行编号.更悲剧的是,有时候写了很多章,一个章节几百张图,需要在某一个位置插一张图,这个时候就需要对后面的图片编号全部重新排列. 这酸爽,干一次绝对不想干第二次.老实说,我在一开始其实也是没把这个当回事的,所以每一字都是自己打出来的,没有在处理word文档的时候 用到一些自动化的手段,

关于Verilog 中的for语句的探讨

在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Testbench中for语句在生成激励信号等方面使用较普遍,但在RTL级编码中却很少使用for循环语句.主要原因就是for循环会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,每条执行语句并不能有效地复用硬件逻辑资源,造成巨大的资源浪费.简单的说就是:for语句循环几次,就是将相同的电路

verilog中的latch到底是个啥??简直快疯了!!!!!

在很多地方都能看到,verilog中if与case语句必须完整,即if要加上else,case后要加上default语句,以防止锁存器的发生,接下来就来说说其中原因. 一,什么是锁存器?锁存器与触发器的区别. 锁存器与触发器最大的区别在于,锁存器是电平触发,而触发器是边沿触发.锁存器在不锁存数据时,输出随输入变化:但一旦数据锁存时,输入对输出不产生任何影响. 二,为什么语句的不完整会导致锁存器的产生? 语句不完整即有某些情况的输入对输出无任何影响,根据锁存器的特征,反映到硬件电路即会产生锁存器.

verilog中defparam的用法 (verilog调用底层模块(只改变)参数的传递)

当一个模块引用另外一个模块时,高层模块可以改变低层模块用parameter定义的参数值,改变低层模块的参数值可采用以下两种方式: 1)defparam 重定义参数 语法:defparam path_name = value ; 低层模块的参数可以通过层次路径名重新定义,如下例: module top ( .....)input....;output....;defparam U1 . Para1 = 10 ;M1 U1 (..........);endmodulemodule M1(....);

DNS中的七大资源记录介绍!(转)

原址 在Microsoft产品系列中,ADDS是一个很出色的设计平台,说到AD,那么我们就不得不提起他的合作伙伴--DNS,相信大家都知道,DNS在AD中的重要地位,就如男人和女人一样,要想有所作为,他们2个就必须进行结合,缺少任何一方,这个社会也就失去了色彩!  DNS分为正向查找区域和反向查找区域,然后在分为,主要,辅助,存根区域,在这些区域里,又存在着很多的记录,今天,就让我们来看看这些记录: 1,A记录A记录也称为主机记录,是使用最广泛的DNS记录,A记录的基本作用就是说明一个域名对应的