- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【systemverilog】time-slot ,仿真的竞争与冒险,对齐与采样
前前⾔⾔
这篇⽂章主要讨论的是数字芯⽚ 证领域,或者说仿真器仿真⾏为,这⼀范畴内的时序竞争与冒险。从关联性来讲,内容贴近这⼀篇博客 :
不过因为最近⼜对这⼀内容有了更加深刻的领悟与认识,也意识到之前⾃⼰的理解是有⼀定误区的,所以希望借此记录,与⼤家分享。
本⽂的很⼤⼀部分内容来源 ⾃IEEE system verilog标准第四章 “Scheduling semantics”,其余来 ⾃个⼈实 与其他相关资料。
真真实实时时间间与与仿仿真真时时间间
⼀般在功能仿真中,会涉及到两个时间观念 :真实时间 (或称之为CPU时间)与仿真时间。仿真时间很好理解,例如RTL电路中我们平时总
说的第 100个时钟周期、第 100ns等时间概念均为仿真时间。
CPU时间则是仿真器真实花费的时间,例如我们仿真了50ms仿真时间,如果电路规模很⼤的话,可能会花费⼏⼩时甚⾄⼏天的CPU时间来
完成。因此我们可以认为CPU时间就是真实世界的时间。
仿真过程中的时间是由⼀个个的time-slot构成的,由阻塞性的事件 (event)与线程 (thread/process)推进仿真时间前进。
事事件件与与进进程程
system verilog的代码⾏为是由⼀个个离散事件组成,运⾏sv时也就是在执⾏⼀个个的事件与线程。值得注意的是,仿真器中线程与事件
的执⾏是串⾏⽅式,⽽真实的RTL电路代码的执⾏⽅式是并⾏执⾏,仿真器需要通过调度串⾏事件来模拟芯⽚真实的并⾏⾏为。因此,为了
模拟贴近真实电路⾏为,明确仿真环境⾏为,避免竞争冒险与采样不确定等危机,SV标准划分了明确的事件调度与代码执⾏区间。
关于进程,通常我们写下的每⼀句执⾏性的verilog代码和sv代码,在仿真器看来都是⼀个进程 (更多时候将有时序或时间推进的⾏为成为
进程/线程,因此function⼀般不被称作进程)。典型的进程包括 :
Initia, always, always_comb, always_latch, always_ff, assign, task, 其他赋值语句等。
事件在标准中包括两种,update event和evaluation event,具体解释如下 :
简单来讲就是任何⼀个数值/信号 (sv 中将数据划分为net型与variable储值型,这个另外讨论吧)的变化都是⼀个update event,对该变
化敏感的若⼲进程感知该变化后的执⾏过程是⼀个evaluation event。因此可以认为进程也是事件的⼀个⼦集。
需要注意⼀点,对同⼀update event敏感的若⼲进程,在执⾏时必然时串⾏执⾏,但是串⾏执⾏顺序标准中没有做规定,不同仿真器可以
做出⾃⼰的安排。
当然我们没有必要咬⽂嚼字,明确我们写下的执⾏性代码被编译器转化为⼀个个事件与进程,在不同时间点 (time-slot)和不同触发条件
下执⾏即可。
仿仿真真过过程程
仿真时间由⽆数的time-slot构成的,每个time-slot中由划分了若⼲个区域,每个区域执⾏标准中规定的相应进程。⼀次完整的仿真过程也
就是把全部time-slot执⾏完成的过程。这⾥贴以下标准中的伪码,做⼀下简单的分析,当然之后这段伪码我们还会再见。
⼀次完整的仿真器执⾏的功能仿真经历了什么呢?
1. 仿真时间T归零,仿真开始 ;
2. 初始化所有的储值单元和电路单元 ;
3. 调度并执⾏所有初始化阶段的事件在ts 0时刻 ;
4. 检查是否所有的time-slot都已经完成,如果还有若⼲time-slot需要执⾏,那么推进时间到第⼀个待执⾏的time-slot,并且设定仿真
时间T为这个time-slot的时刻 ;举例,如果⼀个仿真环境只有⼀句打印,那么仿真会直接在T=0时刻结束,因为0时刻时候就已经没有
time-slot待执⾏了。如果环境中有⼀句# 10ns $display (),那么在0时刻后仿真器会发现还有⼀个time-slot待执⾏,因此将仿真时间
推进到10ns执⾏这句
文档评论(0)