VerilogA例化

一. 前言

        最近在学习VerilogA对模拟系统的描述,在大规模系统设计前期采用verilogA对系统进行行为级描述,可以大大缩短系统仿真的时间,并且还可以通过跑系统的功能来确定一些小模块的指标,但是网上的中文教程特别少,尤其是当一个module不能完成所有功能的时候,例化就很重要,然而,verilogA中的例化要注意以下几个问题:

             1. 只能生成最开始的写的module的symbol,所以各个模块的位置就很重要

             2. 模块内部的连接要定义electrical类型,这样可以保留各个模块的电气特性

二. 代码

        下面是我写的一段生成占空比可变的vpulse信号的代码

`include "constants.vams"
`include "disciplines.vams"

module xy_pulse(f_clk,tx_en, pulsewidth, vpulse);
input f_clk,tx_en;
input [7:0] pulsewidth;
output vpulse;
electrical f_clk,vpulse,tx_en;
electrical [7:0] pulsewidth;
parameter real vdd = 3.3 from [0:inf);
parameter real tdel = 1p from [0:inf);
parameter real trise = 1p from (0:inf);
parameter real tfall = 1p from (0:inf);
electrical vout;
real out;
t_delay D1(
                 .in(f_clk),
                 .pulse_width(pulsewidth), 
                 .out(aa)
        );
gate G1(
        .vin1(f_clk),
        .vin2(aa),
        .out(vout)
    );

analog begin
    @(initial_step) out=0;    
    if(V(tx_en)<vdd/2) out=0;
    else out=V(vout);
    V(vpulse)<+transition(out,tdel,trise,tfall);
    end
endmodule

module t_delay(in,pulse_width,out);
input in;
input [7:0]pulse_width;
output out;
electrical in,out;
electrical [7:0]pulse_width;
parameter real t_rise=10p from [0:inf);
parameter real t_fall=10p from [0:inf);
parameter real vdd=3.3 from [0:inf);
real vout;
real tdelay;
analog begin
    @(initial_step)begin
        vout=0;end
    if(V(pulse_width[0])>vdd/2)
        tdelay=0;
    if(V(pulse_width[1])>vdd/2)
        tdelay=6.25n;
    if(V(pulse_width[2])>vdd/2)
        tdelay=2*6.25n;
    if(V(pulse_width[3])>vdd/2)
        tdelay=3*6.25n;
    if(V(pulse_width[4])>vdd/2)
        tdelay=4*6.25n;
    if(V(pulse_width[5])>vdd/2)
        tdelay=5*6.25n;
    if(V(pulse_width[6])>vdd/2)
        tdelay=6*6.25n;
    if(V(pulse_width[7])>vdd/2)
        tdelay=7*6.25n;
    vout=V(in);
    V(out)<+transition(vout,tdelay,t_rise,t_fall);
    end
endmodule


module gate(vin1,vin2,out);
input vin1,vin2;
output out;
electrical vin1,vin2,out;
parameter real vdd = 3.3 from [0:inf);
parameter real tdel = 1p from [0:inf);
parameter real trise = 1p from (0:inf);
parameter real tfall = 1p from (0:inf);
real vout_val;
integer logic1, logic2;

analog begin 
    @(initial_step)
        vout_val=0;
    logic1=V(vin1)>vdd/2;
    logic2=V(vin2)>vdd/2;

    @(cross(V(vin1)-vdd/2,1)) logic1=1;
    @(cross(V(vin1)-vdd/2,-1)) logic1=0;    
    @(cross(V(vin2)-vdd/2,1)) logic2=0;
    @(cross(V(vin2)-vdd/2,-1)) logic2=1;    

    vout_val=(logic1 && logic2) ? vdd:0;
    V(out)<+transition(vout_val,tdel,trise,tfall);
    end
endmodule

三. 仿真

        1.系统框图

        2.testbench

        3.仿真结果 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Verilog模块例化是指在代码中调用其他模块以构建更大的系统。它类似于面向对象编程中的函数调用。这种方法可以使设计过程更加高效,代码更易于管理。下面是verilog模块例化语法的详细介绍。 Verilog模块例化是通过实例化模块来使用的。在模块调用之前,需要定义模块的接口。在verilog中,模块接口由输入、输出和其他模块参数组成。模块定义使用“module”关键字并指定模块名称。模块接口由“input”和“output”关键字加上端口名称和端口宽度组成。例如: module MyModule(input a, output b, output [0:7] c); 模块接口定义后,可以在其他模块中实例化模块并将其连接到其他模块。模块实例化使用“instan”关键字,指定模块名称、实例名称和连接的端口。例如: MyModule my_inst(.a(input_signal), .b(output_signal), .c(output[3:5])); 上面的例子中,MyModule被实例化为名为my_inst的实例。输入信号input_signal连接到a端口,输出信号output_signal连接到b端口,output[3:5]连接到c端口,这是将output端口中的3~5位连接到my_inst的端口。 在实例化的过程中,如果想要连接一个未命名的端口,可以使用“.”加上端口名称进行连接。例如: MyModule my_inst(.a, .b, .c); 在这种情况下,连接的端口的信号将默认为当前环境中有同名的信号,也可以使用其他方式进行连接。 总之,Verilog模块例化是将多个模块连接在一起,建立复杂的电路系统的方法。它本质上是在不同的模块之间创建通道,以实现数据和信号的传输。模块例化可以使设计过程更具模块化、可维护性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值