若是是带有的参数不须要本模块之外的部分修改,则调用模块时不须要考虑参数;若是咱们但愿可以在本模块之外修改参数,则参数调用一般有两种方法,以下代码:设计
一、module_name #( parameter1, parameter2) inst_name( port_map); 二、module_name #( .parameter_name(para_value),.parameter_name(para_value)) inst_name (port map); 用#方法和port map的写法差很少 module multiplier (a, b, product); parameter a_width = 8, b_width = 8; localparam product_width = a_width+b_width; input [a_width-1:0] a; input [b_width-1:0] b; output[product_width-1:0]product; generate if((a_width < 8) || (b_width < 8)) CLA_multiplier #(a_width, b_width) u1 (a, b, product); else WALLACE_multiplier #(a_width, b_width) u1 (a, b, product); endgenerate endmodule
一、概述code
`define:做用 -> 经常使用于定义常量能够跨模块、跨文件;ip
范围 -> 整个工程;input
parameter: 做用 -> 经常使用于模块间参数传递;it
范围 -> 本module内有效的定义;编译
localparam 做用 -> 经常使用于状态机的参数定义;class
范围 -> 本module内有效的定义,不可用于参数传递;module
localparam cannot be used within the module port parameter list.sed
二、应用举例map
(1) define 概念:能够跨模块的定义,写在模块名称上面,在整个设计工程都有效。 一旦
define指令被编译,其在整个编译过程当中都有效。例如,通 过另外一个文件中的define指令,定义的常量能够被其余文件调用, 直到遇到
undef; 举例:定义 define UART_CNT 10'd1024 使用
UART_CNT 须要特别注意的是:在利用`define作算数运算的时候,必定要加上括号,以下例子所示:
`define timeslice 100 module ..... ...... # (2*`timeslice) //这个是要加上括号的,若是写成# 2*`timeslice编译时是不会经过的;
(2) parameter 概念:本module内有效的定义,可用于参数传递; 若是在模块内部定义时没法进行参数传递, 若在模块名后照下面这样写则能够进行传递