【原创】在仿真中如何使用好parameter?

参考:

http://www.cnblogs.com/oomusou/archive/2008/07/09/verilog_parameter.html

http://www.cnblogs.com/yuphone/archive/2010/05/31/1747871.html

Introduction

使用环境:Debussy + Modelsim

counter是最基本的循序電路應用,為了更加彈性,我們想讓使用者可以自己指定counter的大小,從什麼數字開始數,數到哪個數字停止,而不是寫死在程式裡。利用parameter的小技巧就可以。

Debussy的下载地址:

http://bbs.eetop.cn/thread-270264-1-1.html

关于Debussy+modelsim联合仿真的配置可以参考:

image

 

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
      q

4  run.bat的内容

image

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;
end

endmodule

*******************************************************

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,结果如下:

image

 

  

    在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將參數傳進去。

posted @ 2013-09-09 18:21  Nero_Backend  阅读(678)  评论(0编辑  收藏  举报