背景:模块化
在最近实战开发中发现:对外部芯片进行初始化时,每每须要定义大量参数。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中起做用,不能参与参数传递。