参考:
Introduction
使用环境:Debussy + Modelsim
counter是最基本的循序電路應用,為了更加彈性,我們想讓使用者可以自己指定counter的大小,從什麼數字開始數,數到哪個數字停止,而不是寫死在程式裡。利用parameter的小技巧就可以。
Debussy的下载地址:
关于Debussy+modelsim联合仿真的配置可以参考:
1.首先建立文件:
--rtl.f
--sim.do
--run.bat
--rtl文件夹包含:parameter_counter.v parameter_counter_tb.v
2. rtl.f文件的内容:
rtl/parameter_counter.v
rtl/parameter_counter_tb.v
3 sim.do文件的内容:
vlib work
vlog -f rtl.f vsim work.parameter_counter_tb run 10us q4 run.bat的内容
5 parameter_counter.v
********************************************************
`timescale 1ns/10ps
module parameter_counter ( clk, rst_n, cnt, );parameter size = 16; parameter start = 0; parameter stop = 100;
input clk;
input rst_n; output reg [size-1 : 0] cnt;always@(posedge clk or negedge rst_n) begin
if (!rst_n) cnt <= start; else if (cnt == stop) cnt <= start; else cnt <= cnt + 1; endendmodule
*******************************************************
6 parameter_counter_tb.v
*******************************************************
`timescale 1ns/10ps
//`include "parameter_counter.v"module parameter_counter_tb;
reg clk;
reg rst_n; wire [7:0] cnt;//parameter_counter u0 (.clk(clk), .rst_n(rst_n), .cnt(cnt));
parameter_counter # (.size(8),.start(3),.stop(11))
u0 (.clk(clk), .rst_n(rst_n), .cnt(cnt));/* parameter_counter u0 ( .clk(clk), .rst_n(rst_n), .cnt(cnt) );
defparam u0.size = 8; defparam u0.start = 3; defparam u0.stop = 9; */ parameter clkper = 100;
initial clk = 1'b0; always #(clkper / 2) clk = ~clk;initial begin
rst_n = 1'b0; #1; rst_n = 1'b1; end// dump fsdb file for debussy
initial
begin
$fsdbDumpfile("wave.fsdb");
$fsdbDumpvars;
end
endmodule
********************************************************
7 双击run.bat,结果如下:
在parameter_counter.v中红色字: parameter宣告,即為Verilog的參數式寫法,之後接的是預設值,如此一來,counter的大小,從什麼數字開始數,數到哪個數字停止都不在是寫死在程式裡。
要讓testbench調用module時,能動態的調整參數,有幾種寫法:
(1)parameter_counter u0 (.clk(clk), .rst_n(rst_n), .cnt(cnt));
是使用预设的参数值;
(2)parameter_counter # (.size(8),.start(3),.stop(9))
u0 (.clk(clk), .rst_n(rst_n), .cnt(cnt));若要傳入參數,這是第一種寫法,加上#,再用()傳入參數;
(3)
parameter_counter u0 (
.clk(clk),
.rst_n(rst_n),
.cnt(cnt)
);
defparam u0.size = 8;
defparam u0.start = 3;
defparam u0.stop = 9;
這是第二種傳入參數的寫法,靠defparam將參數傳進去。