层次化结构设计
此篇介绍在两个或多个文件中改变某一文件参数值的方法,具体如下:
假设counter.v的代码如下:
module counter(
clk ,
rst_n,
out
);
input clk ;
input rst_n ;
output out ;
reg [24:0] cnt;
parameter CNT_NUM = 25'd24_999_999;
always @ (posedge clk or negedge rst_n) begin
if (!rst_n)
cnt <= 25'b0;
else if (cnt == CNT_NUM)
cnt <= 25'b0;
else
cnt <= cnt + 1'b1;
end
always @ (posedge clk or negedge rst_n) begin
if (!rst_n)
out <= 1'b0;
else if (cnt == CNT_NUM)
out <= ~out;
else
out <= out;
end
endmodule
假设实际情况下,需要跑20’d24_999_999个时钟周期cnt才会清零,但在仿真中只需要看功能,并不需要仿真如此长的时间,可以在不修改counter.v的代码情况下,对CNT_NUM进行参数化定义,方法如下:
计数器计数值的改变方法一
在testbench中添加如下代码:
defparam counter.CNT_NUM = 20'd2499;
则counter.v中的cnt清零是计数到20'd2499
,而不是20'd24_999_999
,这就是所谓的参数传递。
计数器计数值的改变方法二
若在testbench的励化模块
counter U_counter(
.clk (clk ),
.rst_n (rst_n),
.out (out )
);
改变成:
counter #(
.CNT_NUM (20'd2499)
)
U_counter(
.clk (clk ),
.rst_n (rst_n),
.out (out )
);
则一样也起到参数传递作用,将20'd2499
传递到counter.v中,让cnt计数到2499时清零。