Verilog中的一些重要语法

本文详细介绍了Verilog中的参数化和循环生成语句的使用,包括如何定义参数、模块的参数传递,以及循环生成语句的类型如for循环、条件生成和case生成语句。这些特性使得Verilog设计能够更加灵活和模块化,适应不同场景的需求。
摘要由CSDN通过智能技术生成

参数传递

参数型数据

用parameter定义常量,格式:

parameter        参数名1=表达式,参数名2=表达式, 参数名 3=表达式;

参数型常数经常用于定义延迟时间和变量宽度。在模块或实例引用时,可通过参数传递改变在被引用模块或实例中已定义的参数。

module Decode(A,F);
     parameter  Widrh=1,Polarity=1;
//.......

endmodule


//调用带参数的模块
module  Top;
    wire [3:0] A4;
    wire [4:0] A5;
    wire [15:0] F16;
    wire [31:0] F32;

    Decode  #(4,0) D1(A1,F14);
    Decode  #(5)   D1(A5,F32);
endmodule

循环生成语句

循环生成语句允许使用者对下面的模块或模块项进行多次实例引用:

        1、变量声明

        2、模块

        3、用户定义原句、门级原句

        4、连续赋值语句

        5、initial块和always块

例:多次引用一个门级语句

module bitwise_xor(
    out,
    i0,
    i1
)

parameter N=32;
input [N-1:0]i0,i1;
output [N-1:0] out;

genvar j;  //声明一个临时循环变量 ,在设计中该变量并不存在

generate
    for(j=0 ; j<N ; j=j+1)
    begin  : xor_loop     //xor_loop是赋予循环生成语句的名字
        xor g1 (out[j],i0[j], i1[j]);
    end
endgenerate

        xor_loop是赋予循环生成语句的名字,目的在于通过它对循环生成语句之中的变量进行层次换引用,因此循环生成语句中各个异或门的对应层次名为:xor_loop[0].g1,xor_loop[1].g1,......,xor_loop[31].g1

例:多次引用一个模块

        对一个BCD加法器进行100次调用,变成一个100位的BCD加法器,一位的BCD加法器的模块如下:

module bcd_fadd (
    input [3:0] a,
    input [3:0] b,
    input     cin,
    output   cout,
    output [3:0] sum );

对其进行循环生成的语句如下: 

module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    
    wire [99:0] cin_temp;
    wire [99:0] cout_temp;
    assign cin_temp={cout_temp[98:0],cin};
    assign cout=cout_temp[99];
    
    genvar j;              // genvar j;  声明一个临时循环变量 ,该变量只用于生成块循环计算
    generate 
        for (j=0;j<100;j=j+1)
            begin :add_loop           //add_loop赋予循环变量生成的名字
                bcd_fadd u_bcd_fadd(
                    .a(a[j*4+3:j*4]),
                    .b(b[j*4+3:j*4]),
                    .cin(cin_temp[j]),
                    .cout(cout_temp[j]),
                    .sum(sum[j*4+3:j*4])
                );
            end
    endgenerate

endmodule

条件生成语句

        条件生成语句类似于if_else_if 的生成构造,该构造可以在设计模块中根据经过仔细推敲并确定表达式,有条件地调用以下这些Verilog结构:

        1、模块

        2、用户定义原句、门级原句

        3、连续赋值语句

        4、initial块和always块

例:使用条件生成语句实现参数化的乘法器

module  multiplier(
        product,
        ao,
        a1
    );

    parameter a0_width=8;
    parameter a1_width=8;

//本地参数声明,
    localparam product_width = a0_width+a1_width;
    output [product_width-1:0] product ;
    input  [a0_width-1 : 0] a0;
    input  [a1_width-1 : 0] a1;

//条件生成语句,有条件调用不同类型的乘法器
    generate
        if(a0_width < 8) || (a1_width < 8)
            cal_multiplier #(a0_width,a1_width) m0 (product,ao,a1) //超前进位乘法器
        else
            tree_multiplier #(a0_width,a1_width) m0 (product,ao,a1) //树形乘法器
     endgenerate

endmodule

 case生成语句

        case生成语句可以有条件地调用下面这些结构:

        1、模块

        2、用户定义原句、门级原句

        3、连续赋值语句

        4、initial块和always块

例:case生成语句调用不同位数的加法器

module  adder(
        co,
        sum,
        ao,
        a1,
        ci
       );

    parameter  N=4;

    output [N-1:0] sum;
    input  [N-1:0] ao,a1;
    output co;
    input  ci;


//根据总线的位宽调用相应的加法器

    generate
    case(N)
        1 : adder_1bit  adder1(co,sum,ao,al,ci);    //1位加法器
        2 : adder_2bit  adder1(co,sum,ao,al,ci);    //2位加法器
        default : adder_cla #(N) adder3(co,sum,ao,al,ci);
    endcase
    endgenerate
endmodule

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值