zoukankan      html  css  js  c++  java
  • 【原创】在仿真中如何使用好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將參數傳進去。

  • 相关阅读:
    HMM MEMM CRF 差别 联系
    JSTL简单介绍
    java基础&amp;&amp;高薪面试
    oracle-Normal
    oracle-Oradim
    oralce管理命令
    oracle默认日期格式
    oralce默认语言
    oracle国家字符集
    oracle-字符集
  • 原文地址:https://www.cnblogs.com/socquan/p/3310382.html
Copyright © 2011-2022 走看看