集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 973|回复: 2

Verilog中的参数

[复制链接]
fpga_feixiang 发表于 2020-7-16 15:55:54 | 显示全部楼层 |阅读模式
参数由一个标识符和一个常数组成。比如:

parameter n=4;

parameter S0=2’b00; S1=2’b01;S2=2’b10;S3=2’b11;

      标识符n可以在代码中替换表示数字4的地方,S0则可以替换数值2’b00。参数的主要作用是指定参数化的子电路。比如下面的代码中,可以看到代码通过parameter定义了一个常量n,实例化时候通过addern #(.n(32)) addern_0(…)的形式把32传入到参数n中,从而实现32位的加法操作。另外一种调用参数的方法是用defparam,比如下面的例子:

addern addern_0(…)

defparam addern_0.n=32;

但这种方法是不可综合的,通常只是用在testbench当中。

复制代码
module addern(x, y, s, cout);
  parameter n=8;
  input [n-1:0] x;
  input [n-1:0] y;
  output reg[n-1:0] s;
  output reg cout;
  reg [n:0] c;
  integer k;
  always @(x,y) begin
    c[0] = 1'b0;
         for(k = 0; k < n; k = k + 1) begin
           s[k] = x[k]^y[k]^c[k];
                c[k+1] = (x[k]&y[k])|(x[k]&c[k])|(y[k]&c[k]);
         end
         cout = c[n];
    end
endmodule
复制代码
复制代码
`timescale 1ns/1ns
`define clock_period 20
module addern_tb;
  reg [7:0] x,y;
  wire cout;
  wire [7:0] s;
  reg clk;
  addern #(.n(32)) addern_0(
                                                .x(x),
                                                .y(y),
                                                .s(s),
                                                .cout(cout)
                  );
  initial clk = 0;
  always #(`clock_period/2) clk = ~clk;
  initial begin
     x = 0;
     repeat(20)
            #(`clock_period) x = $random;
   end
  initial begin
     y = 0;
     repeat(20)
            #(`clock_period) y = $random;
   end
  initial begin
     #(`clock_period*20)
          $stop;
  end
endmodule
大鹏 发表于 2020-7-19 16:05:23 | 显示全部楼层
Verilog中的参数
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-20 05:41 , Processed in 0.076265 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表