【Modelsim仿真原理】


了解Modelsim仿真器的工作流程对如何正确的编写Testbench具有重要意义

如:明明是串行工作,modelsim如何使程序并行?

Modelsim仿真原理

  Verilog是基于离散事件执行模型定义的语言,目的是为了解决仿真器执行代码串行工作与实际电路工作并行性的矛盾。
  了解该模型,我们首先需要知道一些基础概念:

  • 进程
      进程是彼此之间独立运行的程序,在Modelsim执行仿真时,会将Testbench文件(包括实例化后的模块)的并行的基本结构解构成一个个进程。例如,学习Verilog时,我们会将“initial块”、“always块”、“连续赋值语句assign”及原语等看作并行执行的,那么在Modelsim看来他们就是一个个的独立进程。

  • 事件
      对于每一个执行的语句可将其解构为 “计算事件” 与 “更改事件”。如何理解呢?例如:y<=a+b,其中a+b就是计算事件(即等式左边的操作),将a+b的值赋予y的动作称为更改事件。(不看此段不影响:后面会说到对于非阻塞赋值语句的工作流程是先在活动队列中执行计算事件,再将非阻塞队列中的更改事件提到活动队列中执行,也就是说Modelsim执行非阻塞赋值时并不是一行计算完再进行下一行的计算,而是先将同一时刻的变量值用于计算等式右边的计算事件,最后才更新等式右边的变量值,从而实现了非阻塞赋值代码并行运行。)

  • 事件队列与事件调度
      参看下图便于理解:
    在这里插入图片描述  在一个仿真步time-step中(`timescale 1ns/1ps,1ns即为一个仿真步),Modelsim对进程解构,将进程的顺序执行语句插入事件队列等待执行,然后遇到时序控制语句如always(*)或者alwasy(posedge clk)进程就先挂起,等待顺序执行语句执行后去触发相应的时序控制语句。其中对不同进程的事件插入事件队列是随机的,所以你如果在两个进程都对同一个变量使用阻塞赋值,那么有可能每次仿真的结果该变量值都不同,因为该更改事件被插入事件队列的顺序是随机的。
      废话有点多了,最后一个概念,比较重要。

  • 事件队列主要分类
      不同的事件会被插入不同的队列中,如下图所示:
    在这里插入图片描述RHS\LHS就是指的等号右边和左边的事件
    Modelsim按上述将事件分好队列,然后开始执行活动的事件队列。
    在这里插入图片描述以上图代码为例讲解:整个代码被解构为四个进程,即四个并行块。仿真时序图如下:
    在这里插入图片描述
      在时间为0的时刻,前两个并行块为时序控制语句被挂起,后两个并行块的阻塞赋值与非阻塞赋值的RHS被填充进活动队列,#10这一句进入未来事件队列。那么这三句:clk=0,a=0,b=0就会被执行,但是执行顺序未知。clk从x不定态变为0算作时钟下降沿,a与b的变化回头来激活了第一个并行块always@(*),使得d1,d2被赋值为0。然后当前活动队列所有事件执行结束,NAUQ_E被移到活动队列执行,也就是rst_n被移动到活动队列且赋值为0,那么同时第二个always块又被触发,使得q1\q2又被置位0,至此第一个time-step结束。
      紧接着看下一个posedge clk和negedge clk的事件调度(懒得写了,自己看吧)
    在这里插入图片描述在这里插入图片描述

仿真中的不确定性及避免措施

eg1:在这里插入图片描述如果使用非阻塞赋值,那么在活动事件队列中就会先将<=右边的值计算出来,即用当前时刻的x计算 ~x与x(执行RHS事件),在活动事件队列执行结束后提取LHS将提前计算的值赋值给x和y,不管哪个先赋值都不影响,这样就不会发生赋值冲突。
eg2:在这里插入图片描述
避免不确定性方法:

  • 不要在多个并行块中对同一变量赋值。
  • testbench中激励信号在无效时钟沿注入,或使用非阻塞赋值注入
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值