層次化結構設計
此篇介紹在兩個或多個文件中改變某一文件參數值的方法,具體如下:
假設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時清零。