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時清零。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章