verilog中的参数化设计

层次化结构设计

此篇介绍在两个或多个文件中改变某一文件参数值的方法,具体如下:
假设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时清零。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值