多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
verilog中可以使用paramter定义参数,这种参数我们在调用模块是可以设置该参数,将参数传递到模块中,实现设置该参数。 ## 方式一,例化时直接传入 ``` module_name #( parameter1, parameter2) inst_name( port_map); ``` 如下: m2.v ```verilog module m2( input clk, input rst_n ); parameter N = 3; reg [2:0]st; always@(posedge clk)begin if(!rst_n) st <= 0; else st <= (st>= N) ? 0: st + 1; end endmodule ``` m1.v中例化m2.v并传递参数 ```verilog module m1( input clk, input rst_n ); reg [7:0]m1_cnt; always@(posedge clk) begin m1_cnt <= rst_n ? m1_cnt + 1 : 0; end //将m2的参数N设置为6 m2 #(.N(6))m2_inst( clk, rst_n ); endmodule ``` ## 方式二,使用defparam传递 此时m1.v文件要改为如下所示: ```verilog module m1( input clk, input rst_n ); reg [7:0]m1_cnt; always@(posedge clk) begin m1_cnt <= rst_n ? m1_cnt + 1 : 0; end defparam m2_inst.N = 5; //将参数5传给m2的N m2 m2_inst( clk, rst_n ); endmodule ``` ## 当调用模块中要访问模块内部的reg或者wire时可以使用 .符号来访问 ``` `timescale 1ns / 1ps module tb ; reg clk,rst; //生成始时钟 parameter NCLK = 4; initial begin clk=0; forever clk=#(NCLK/2) ~clk; end /****************** BEGIN ADD module inst ******************/ m1 tm( .clk(clk), .rst_n(rst) ); wire flag; assign flag = (tm.m1_cnt == 5) ? 1'b1: 1'b0; wire m2_f; assign m2_f =(tm.m2_inst.st == 2)?1:0; ``` <br/> 模块调用的层次 ![](https://img.kancloud.cn/64/ab/64ab7874752fb11dec970b3c0cc8f5dc_208x183.png)