三个关键字
- `define
是一种预处理命令,编译系统先对这些命令预处理,然后将处理的结果和源程序一起再进行正常的编译。
作用 :宏定义常量。
范围:一旦define被编译,其在整个编译过程中都有效,也即它会影响工程的其他模块;只有当遇到`undef命令才能使之失效。
用法: 写在模块名称上面。
建议用大写字母,以与变量名区别;
行末不加分号;
`define WORDSIZE 8
module...
reg [1:`WORDSIZE] data;
- parameter
parameter:范围 -> 本module内,可用于模块间参数传递(顶层例化子模块)
localparam 作用 -> 常用于状态机的参数定义;
范围 -> 本module内有效,不可用于参数传递;
localparam cannot be used within the module port parameter list.
参数传递
- module内部使用
1 module exam_prj
2 #(parameter WIDTH=8)
4 (
5 input [WIDTH-1:0] dataa,//[WIDTH-1:0]
6 input [WIDTH-1:0] datab,
7
8 output reg [WIDTH:0] result
9 ); parameter Conuter_Top = 4'd9;//用于代码部分的参数
//代码部分省略
这里出现的两个参数parameter,第一个表示只在端口设置时使用,后面的是对于模块内部的使用。
2. 参数传递top2sub
与子模块例化一起:
module_name
#( .parameter_name(para_value), .parameter_name(para_value))
inst_name (port map);
//module exam_prj_tb;
exam_prj #(
.WIDTH(8),
.Conuter_Top(4'd5)
)
exam_prj_inst//注意例化时的名字在这个位置
(
.dataa(dataa),
...
.result(sum)
);
参考资料:
夏宇闻,
https://blog.csdn.net/Times_poem/article/details/51371940
https://www.cnblogs.com/uiojhi/p/7844879.html