Verilog实例化时的参数传递--即#的用法和defparam的用法

Verilog实例化时的参数传递–即#的用法和defparam的用法

一、#号用于延时

众所周知,在很多情况下,我们使用#时,是用于时序仿真中的延时,具体用法如下:
#是延迟的意思,#号后面数字是延迟的数量,延迟的单位由timescale控制,比如在Testbench开头声明有**‘timescale 1ns/1ps**,他的意思就是时间单位为1ns,精度是1ps
那么,#10.5 就是延迟10.5ns的意思

注意:

在同步时序数字逻辑电路的verilog代码中,不能加入“#”进行延迟,这不是代码编写阶段能决定的,一般#用于延时是用在Testbench中用于仿真使用。

二、用#号和defpara关键字实现Verilog实例化时的参数传递

传递的参数是子模块中定义的parameter。

传递的方法:
1、module_name #( parameter1, parameter2) inst_name( port_map);

2、module_name #( .parameter_name(para_value), .parameter_name(para_value)) inst_name (port map);

用#方法和port map的写法差不多

3、defparam
defparam heirarchy_path.parameter_name = value;
这种方法与例化分开,参数需要写绝对路径来指定。

参数型常数常用于定义延迟时间和变量宽度,在模块和实例引用时,可通过参数传递改变在被引用模块或实例中已定义的参 数。参数传递的方法如下例子:首先定义一个Adder_16(sum,a,b)实例,然后定义两个参数型常量time_delay和 time_count,然后在顶层模块中调用的时候,可以通过参数传递改变参数型常量的值,从而更为灵活的调用子模块。

例1:通过#号进行实例化的参数传递,利用了方法1:

module adder_16(sum,a,b);
parameter time_delay=5,time_count=10;

endmodule

module top;
wire[2:0] a1,b1;
wire[3:0] a2,b2,sum1;
wire[4:0] sum2;
adder_16 #(4,8) AD1(sum1,a1,b1);//time_delay=4,time_count=8
adder_16 #(12) AD2(sum2,a2,b2);//time_delay=12,time_count=10
endmodule

例2:通过defparam号进行实例化的参数传递,利用了方法3:

module top ( …)
input…;
output…;
defparam U1 . Para1 = 10 ;
M1 U1 (…);
endmodule

module M1(…);
parameter para1 = 5 ;
input…;
output…;

endmodule
在上例中,模块M1参数 para1 的缺省值为5,而模块top实例了M1后将参数的值改为10。
参考链接:
https://www.cnblogs.com/xueyoo/articles/4929398.html

你可能感兴趣的:(FPGA初学)