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;
https://blog.csdn.net/qq_37590544/article/details/125028546
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现