• vcs 仿真中遇到的verilog 延时问题


     

    在项目后仿的过程中,由于后端提供的网表并非完整的网表,而是分模块提供的独立网表。所以后仿是在仿真环境中既有rtl代码,又有网表。这种情况下rtl 模块与网表模块之间的接口存在信号的hold time无法满足的情况。所以需要将rtl给到网表的输入信号做一个delay再输入到网表中。在这个过程中研究了一下verilog中的延时问题。

    no bb,show me your code.

     module test(input in, output a,output b,output c,output d,output e,output f,output g);
    reg a;
    reg b;
    reg c;
    reg d;
       
    always@(*) begin
     #5 a=in;
     end
      
     always@(*) begin
     b= #5 in;
     end
      
     always@(*) begin
     #5 c<=in;
     end
      
    always@(*) begin
    d <=#5 in;
    end
      
      assign #5 e=in;
      assign f=in;
      assign #1 g=in;
      
     endmodule

     下面是以上代码再vcs下的仿真波形:

    首先看信号a,c

    信号a,c都是再always块被赋值,敏感条件是*,也就是只要输入信号in变化就会触发对应always块的执行,该always块内部先是执行#5,等待5个时间单位,然后把in的当前值(5ns时刻的值)赋给a,c。也就是在0时刻该always块触发以后等待5ns,将5ns时刻的in值0赋值给a,c.在always内部的#5等待5ns的这个时间段以内,输入信号in的任何变化都不会被响应。下次触发always的条件就是5ns后in的再次跳变。

    再来看信号b,d

     #5放在赋值符号之后,不同在于b采用的阻塞赋值,d采用的非阻塞赋值。两者都是将5ns之前的in值赋给b,d。但是阻塞赋值的情况信号b会忽略等待5ns这段时间的输入信号的变化。换个说法就是in信号的跳变触发always块,记录当前in值,然后等待#5,同时在等待的过程中忽略in的变化,等#5时间一到将之前记录的in值赋给b;信号d则不同,in信号的跳变触发always块,记录当前in值,然后等待#5,但是在等待#5的过程中也会记录in的变化。这种情况相当于信号d是将in整体后移了5ns。

    遗留问题

     assign #5 e=in;

  • 相关阅读:
    软件行业从事人员,计算机基础须知(三)---DOS命令相关
    软件行业从事人员,计算机基础须知(二)---系统介绍和进制转换说明
    软件行业从事人员,计算机基础须知(一)
    python操作数据库步骤以及操作过程中经常出现的异常
    selenium中验证码识别简单封装
    selenium对验证码识别校验解决方法
    retina屏幕截取验证码
    Nginx的负载均衡的那点事
    子网划分
    iptables 规则整理
  • 原文地址:https://www.cnblogs.com/linuxiaogang/p/15697503.html
Copyright © 2020-2023  润新知